2012-01-05 70 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的零基偏移。