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,

Другие вопросы по тегам