2012-01-05 46 views
3

我有一個TMemo其中包含相當多的文本,80M(約400K行)。德爾福 - 查找文本大TMemo

TMemo設置爲WordWrap = FALSE,有不需要來查找包裝在兩行中的文本。

我需要一種快速的方式從頭開始查找文本,並且還可以找到下一個。

所以,我把一個TEdit放置文本找到和TButton找到TMemo中的文本。

我正在考慮使用Pos(),逐行檢查,但這將是緩慢的。 我不知道如何確定當前光標位置的TMemo.Lines [index]。

任何人都可以想出解決方案?

感謝

UPDATE:

我找到了解決辦法從這裏: Search thru a memo in Delphi?

的SEARCHTEXT()函數的工作,速度快,而且速度非常快。 花了幾秒鐘在底端搜索唯一字符串。

+1

如果您使用了豐富的編輯控件,您可以使用['EM_FINDTEXT'](http://msdn.microsoft.com/en-us/library/windows/desktop/bb788009.aspx),它包裹在[ TRichEdit的'FindText'](http://docwiki.embarcadero.com/Libraries/en/Vcl.ComCtrls.TCustomRichEdit.FindText)方法。 – 2012-01-05 10:55:22

+1

我認爲使用具有TMemo.Lines.Text屬性的Pos函數應該更快;儘管它也可能找到包裝的子串,但我不認爲這是一個問題。 – kludg 2012-01-05 11:01:17

+2

關於SO的類似問題:[search-thru-a-memo-in-delphi](http://stackoverflow.com/questions/4232709/search-thru-a-memo-in-delphi)。我不知道它是否快速,但答案有索引位置的解決方案。 – 2012-01-05 11:39:53

回答

7

有點除了previous answers:你可以得到行號而不選擇找到模式,就像這樣:

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結果以獲得SendMessageTMemo.SelStart的零基偏移。