Быстрый способ поиска строк Tmemo - PullRequest
2 голосов
/ 11 апреля 2011

У меня есть 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;
----

Строковый список зациклен, проверьте, существует ли он в памятке, если не удалите из списка.

Однако, с 200+ предметами это начинает сильно замедляться, а с 1000 становится очень плохо.

Какой самый быстрый способ поиска TMemo?

1 Ответ

7 голосов
/ 11 апреля 2011

Прочитайте все 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;
----
...