快速搜索Tmemo行的方法

快速搜索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?

+0

@Marco这里没有TStringList。你到底什么意思? – 2011-04-11 12:53:00

+0

另一边。如果您使用丰富的编辑,那么您可以使用EM_FINDTEXT。 – 2011-04-11 12:53:31

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; 
---- 
+4

'StringList.Text:= Memo.Text'是执行此操作的快速方法。 – 2011-04-11 12:48:03

+0

@David,我一直使用'Assign()';我刚刚看过什么'TStrings.Assign(TStrings)'呢,这是一个恐怖故事...非常感谢你的提示。 – 2011-04-11 12:55:19

+3

由于L中的项目顺序无关,因此在循环前添加'L.Sort',您应该快得多。 – 2011-04-11 14:28:05