2011-04-11 81 views
2

我在表單上有一個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

回答

7

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