#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, как я и предлагал.