【问题标题】:Fast way to search lines of Tmemo快速搜索Tmemo行的方法
【发布时间】:2011-04-11 12:38:04
【问题描述】:

我在表单上有一个 TMemo,它允许用户输入项目列表。人们可以在这里输入许多项目。当他们点击保存时,TMemo 的内容被选中,然后被添加到数据库中。

我在 TStringList 中有第二个列表,我循环并检查它的任何项目是否包含在 TMemo 中。

简而言之,它看起来像这样

....
//slItems = TStringList
//mItems = TMemo
for i := slItems.Count -1 downto 0 do
begin
  if mItems.Lines.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----

所以stringlist循环了,查看memo中是否存在,如果没有从list中删除。

但是,如果有 200 多个项目,这开始变慢很多,而 1000 则变得非常糟糕。

搜索 TMemo 最快的方法是什么?

【问题讨论】:

  • @Marco 这里没有 TStringList。你到底是什么意思?
  • 另一边。如果您使用的是富编辑,那么您可以使用 EM_FINDTEXT。

标签: performance delphi tmemo


【解决方案1】:

将所有TMemo 读入本地TStringList 并从中工作。每次访问 TMemo.Lines 时,您都依赖 Windows 消息与 Windows 提供的多行文本框对话。没有效率!

....
//slItems = TStringList
//mItems = TMemo
//L = TStringList
L.Text := mItems.Text; // edited per David's suggestion.
L.Sorted := True; // per Uwe Raabe's suggestion.
for i := slItems.Count -1 downto 0 do
begin
  if L.IndexOf(slItems[i]) = -1 then
    slItems[i].Delete;
end;
----

【讨论】:

  • StringList.Text := Memo.Text 是执行此操作的快捷方式。
  • @David,我一直用Assign();我刚刚看了TStrings.Assign(TStrings) 做了什么,这是一个恐怖故事……非常感谢您的提示。
  • 由于L中项目的顺序无关紧要,所以在循环之前添加L.Sort,你应该会更快。
  • @Uwe,L.Sorted := True 让它很快,L.Sort 没有。
  • @mason 作为备忘录,除了字符串什么都没有,所以你想要的是我建议的简单 WM_GETTEXT。
猜你喜欢
  • 2016-02-21
  • 2021-01-24
  • 1970-01-01
  • 2014-11-05
  • 2018-10-10
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多