Delphi - Найти текст в большом TMemo - PullRequest
3 голосов
/ 05 января 2012

У меня есть TMemo, который содержит довольно много текстов , 80M (около 400 тыс. Строк).

Для TMemo установлено WordWrap = FALSE, не нужно чтобы найти тексты, заключенные в 2 строки.

Мне нужен быстрый способ найти текст с самого начала, а также найти следующий.

Итак, я поставил TEdit дляположить текст для поиска и кнопку TButton для поиска текста в TMemo.

Я думал использовать Pos (), проверяя строку за строкой, но это будет медленно.И я не знаю, как определить TMemo.Lines [index] для текущей позиции курсора.

Кто-нибудь может предложить решение?

Спасибо

ОБНОВЛЕНИЕ:

Я нашел решение здесь: Поиск по заметке в Delphi?

Функция SearchText () работает, быстро и очень быстро.Потребовалось пару секунд, чтобы найти уникальную строку в нижней части.

1 Ответ

7 голосов
/ 05 января 2012

Небольшое дополнение к предыдущим ответам : вы можете получить номер строки, не выбирая найденный шаблон, например:

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.

...