3

かなり多くのテキスト、80M (約 400K 行)を含む TMemo があります。

TMemo は WordWrap = FALSE で設定されているため、2 行で折り返されたテキストを検索する必要はありません。

テキストを最初からすばやく検索し、次も検索する方法が必要です。

そこで、検索するテキストを配置するための TEdit と、TMemo 内のテキストを検索するための TButton を配置しました。

行ごとにチェックして Pos() を使用することを考えていましたが、それは遅くなります。そして、現在のカーソル位置の TMemo.Lines[index] を決定する方法がわかりません。

誰でも解決策を思い付くことができますか?

ありがとう

アップデート:

ここから解決策を見つけました: Delphi でメモを検索しますか?

SearchText() 関数は高速で非常に高速に動作します。下端で一意の文字列を検索するのに数秒かかりました。

4

1 に答える 1

7

前の回答に少し追加: 次のように、見つかったパターンを選択せず​​に行番号を取得できます。

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;

行番号はゼロベースであることに注意してください。また、Pos結果から 1 を減算して、 および のゼロベースのオフセットを取得する必要がSendMessageありTMemo.SelStartます。

于 2012-01-05T12:08:35.797 に答える