Delphi - Найти текст в большом TMemo
У меня есть TMemo, который содержит довольно много текстов, 80M (около 400K строк).
TMemo устанавливается с WordWrap = FALSE, нет необходимости искать тексты, заключенные в 2 строки.
Мне нужен быстрый способ найти текст с самого начала, а также найти следующий.
Итак, я поместил TEdit для размещения текста для поиска и TButton для поиска текста в TMemo.
Я думал использовать Pos(), проверяя построчно, но это будет медленно. И я не знаю, как определить TMemo.Lines[index] для текущей позиции курсора.
Кто-нибудь может придумать решение?
Спасибо
ОБНОВИТЬ:
Я нашел решение отсюда: Поиск по записке в Delphi?
Функция SearchText() работает, быстро и очень быстро. Потребовалось пару секунд, чтобы найти уникальную строку в нижней части.
1 ответ
Небольшое дополнение к предыдущим ответам: вы можете получить номер строки без выбора найденного шаблона, например:
procedure TForm1.Button3Click(Sender: TObject);
var
I, L: Integer;
begin
Memo1.WordWrap:= False;
Memo1.Lines.LoadFromFile('Windows.pas');
I:= Pos('finalization', Memo1.Text);
if I > 0 then begin
L := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, I - 1, 0);
ShowMessage('Found at line ' + IntToStr(L));
// if you need to select the text found:
Memo1.SelStart := I - 1;
Memo1.SelLength := Length('finalization');
Memo1.SetFocus;
end;
end;
Обратите внимание, что номер строки начинается с нуля, также вы должны вычесть 1 из Pos
результат для получения нулевого смещения для SendMessage
а также TMemo.SelStart
,