Быстрый способ поиска строк Tmemo

#performance #delphi #tmemo

#Производительность #delphi #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;
----
  

Итак, список строк зациклен, проверьте, существует ли он в memo, если не удалить из списка.

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

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

Комментарии:

1. @Marco Здесь нет TStringList. Что именно вы имеете в виду?

2. Еще один в сторону. Если вы использовали расширенную редактуру, вы могли бы использовать EM_FINDTEXT.

Ответ №1:

Прочитайте все из TMemo в локальный TStringList файл и работайте исходя из этого. Каждый раз, когда вы получаете доступ TMemo.Lines , вы полагаетесь на Windows messaging для общения с многострочным текстовым полем, предоставляемым 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;
----
  

Комментарии:

1. StringList.Text := Memo.Text это самый быстрый способ сделать это.

2. @David, я всегда использовал Assign() ; я просто посмотрел, что TStrings.Assign(TStrings) делает, и это ужасная история… Большое спасибо за совет.

3. Поскольку порядок элементов в L не имеет значения, добавьте L.Sort перед циклом, и вы должны работать намного быстрее.

4. @Uwe, L.Sorted := True делает это быстро, L.Sort не делает.

5. @mason для заметки нет ничего, кроме строк, поэтому вам нужен простой WM_GETTEXT, как я и предлагал.