快速搜索Tmemo行的方法
我在表单上有一个TMemo,允许用户输入项目列表。人们可以在这里输入很多项目。当他们点击保存时,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的循环,检查,看它是否在备忘录中存在,如果不从列表中删除。
但是,有200多件商品,这开始减慢了很多,而1000件商品真的很糟糕。
什么是最快的方式来搜索TMemo?
将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'是执行此操作的快速方法。 – 2011-04-11 12:48:03
@David,我一直使用'Assign()';我刚刚看过什么'TStrings.Assign(TStrings)'呢,这是一个恐怖故事...非常感谢你的提示。 – 2011-04-11 12:55:19
由于L中的项目顺序无关,因此在循环前添加'L.Sort',您应该快得多。 – 2011-04-11 14:28:05
@Marco这里没有TStringList。你到底什么意思? – 2011-04-11 12:53:00
另一边。如果您使用丰富的编辑,那么您可以使用EM_FINDTEXT。 – 2011-04-11 12:53:31