【问题标题】:Delphi - Find text in large TMemoDelphi - 在大型 TMemo 中查找文本
【发布时间】:2012-02-03 04:47:36
【问题描述】:

我有一个 TMemo,它包含相当多的文本,80M(大约 400K 行)。

TMemo 设置为 WordWrap = FALSE,不需要查找包含在 2 行中的文本。

我需要一种快速的方法来查找文本,从头开始,然后找到下一个。

所以,我在 TMemo 中放置了一个用于放置文本的 TEdit 和一个用于查找文本的 TButton。

我正在考虑使用 Pos(),逐行检查,但这会很慢。 而且我不知道如何确定当前光标位置的 TMemo.Lines[index]。

任何人都可以提出解决方案?

谢谢

更新:

我从这里找到了解决方案: Search thru a memo in Delphi?

SearchText() 函数运行迅速,而且非常快。 花了几秒钟在底端搜索唯一的字符串。

【问题讨论】:

  • 如果你使用了丰富的编辑控件,你可以使用EM_FINDTEXT,它包含在TRichEditFindText方法中。
  • 我认为使用带有TMemo.Lines.Text 属性的Pos 函数应该更快;虽然它也可能找到包裹的子字符串,但我认为这不是问题。
  • 关于 SO 的类似问题:search-thru-a-memo-in-delphi。不知道快不快,不过答案有索引位置的解决方案。
  • @Serg:你是对的。我从这里找到了一个函数:stackoverflow.com/questions/4232709/…
  • 测试了上面的 SearchText(),速度非常快!

标签: delphi full-text-search delphi-7 memo


【解决方案1】:

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;

注意行号是从零开始的,你也应该从Pos的结果中减去1来获得SendMessageTMemo.SelStart的从零开始的偏移量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多