2012-01-05 10 views
3

私はにかなり多くのテキストが含まれているTMemoを持っています,80M(約400K行)。Delphi - 大きなTMemoでテキストを検索

TMemoはWordWrap = FALSEで設定されています。はありません。は2行で囲まれたテキストを検索します。

私はテキストを最初から見つけて、次に見つけることが必要です。

私は、テキストを見つけるためにはTEditを、TMemoにはテキストを見つけるためにTButtonを配置します。

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

誰でも解決策を考え出すことができますか?

おかげで

UPDATE:

私はここから解決策を見つけた: Search thru a memo in Delphi?

検索テキスト()関数が速く、動作し、非常に高速。 数秒で、一番下の文字列を検索できます。

+1

リッチエディットコントロールを使用している場合は、['EM_FINDTEXT'](http://msdn.microsoft.com/en-us/library/windows/desktop/bb788009.aspx)を使用することができます。これは[ 'FindText'](http://docwiki.embarcadero.com/Libraries/en/Vcl.ComCtrls.TCustomRichEdit.FindText)メソッドを呼び出します。 –

+1

'TMemo.Lines.Text'プロパティで' Pos'関数を使う方が速いはずです。おそらくラップされた部分文字列も見つけることができますが、それは問題ではないと思います。 – kludg

+2

SOの類似した質問:[del-a-search-thru-a-memo-in-delphi](http://stackoverflow.com/questions/4232709/search-thru-a-memo-in-delphi)私はそれが速いのかどうかわかりませんが、答えはインデックスの位置の解決策を持っています。 –

答えて

7

previous answersに少し加え:Pos結果から

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:あなたはこのような見つかったパターンを、選択せずに行番号を取得することができますSendMessageTMemo.SelStartのゼロベースのオフセットを取得します。

関連する問題