Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];

Вниз

Быстрое удаление выбранных записей из ListBox   Найти похожие ветки 

 
sdram   (2012-01-12 19:23) [0]

Вариант типа:
[CODE]
for ii := -1 + Items.Count downto 0 do
   begin
   if Selected[ii] then begin Items.Delete(ii);
   end;
[/CODE]

не устраивает. Потому что на моих списках 100.000 и выше программа долго обрабатывает задачу в цикле.

Появился вариант записывать в массив номер записи при выделении и затем пускать цикл на удаление нужных записей, где учитывать смещение при удалении. Целесообразно ли так делать?


 
Демо   (2012-01-12 22:02) [1]


> Появился вариант записывать в массив номер записи при выделении
> и затем пускать цикл на удаление нужных записей, где учитывать
> смещение при удалении. Целесообразно ли так делать?


Как вариант - конечно.
Плюс к этому использовать метод DisableControls.


> Потому что на моих списках 100.000 и выше программа долго
> обрабатывает задачу в цикле.


А нужно ли тебе столько записей в TListBox? - ведь пользователю наверняка неудобно с таким объёмом работать.
Я бы использовал вариант с TDrawGrid - немного сложнее, но и работает несравнимо по скорости.


 
Омлет ©   (2012-01-12 22:26) [2]


> Потому что на моих списках 100.000 и выше программа долго
> обрабатывает задачу в цикле.

Представляю муки человека, которому надо просмотреть 100500 записей в листбоксе..


 
DimaBr ©   (2012-01-13 09:36) [3]

Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.


 
Компромисс ©   (2012-01-13 10:39) [4]


> Появился вариант записывать в массив номер записи при выделении
> и затем пускать цикл на удаление нужных записей, где учитывать
> смещение при удалении. Целесообразно ли так делать?


Да, это было бы более масштабируемо.
Только лучше немного иначе сделать: если считать, что пользователь не будет выделять много записей, то можно хранить в массиве индексы выделенных записей. Тогда перед удалением достаточно отсортировать массив индексов по убыванию и тогда можно удалить нужные записи в одном простом цикле по этому массиву


 
Dimka Maslov ©   (2012-01-13 10:52) [5]

Items.BeginUpdate;
try
 for i := Items.Count - 1 {!!! так тоже, оказывается, можно} downto 0 do
   Items.Delete(i);
finally
 Items.EndUpdate;
end;


 
Компромисс ©   (2012-01-13 10:59) [6]

Dimka Maslov ©   (13.01.12 10:52) [5]

Если все удаляются, лучше какой-нибудь Clear использовать - намного быстрее будет.
Тут ему надо что-то типа

Items.BeginUpdate;
try
 for i := SelectedItems.length - 1 downto 0 do
   Items.Delete(SelectedItems[i]);
finally
 Items.EndUpdate;
end;

причем SelectedItems - массив, упорядоченный по возрастанию (если уж downto в этом цикле используем)


 
Ega23 ©   (2012-01-13 11:01) [7]


>  Потому что на моих списках 100.000 и выше программа долго
> обрабатывает задачу в цикле.


Если не забывать BeginUpdate и EndUpdate, то на списке в 100.000 отрабатывает за 125 мс. Это при том, что выделенные элементы - в начале.


 
Ega23 ©   (2012-01-13 11:02) [8]

Другой вопрос, нафига в Win32-контроле 100.000 и выше элементов хранить, это же мазохизм?


 
Dimka Maslov ©   (2012-01-13 11:57) [9]


> Компромисс ©   (13.01.12 10:59) [6]


Смысл тут именно в BeginUpdate..EndUpdate, ибо причина тормоза в их неприсутствии. Остальное – на совести автора.


 
OW ©   (2012-01-13 11:59) [10]

имхо, имеет смысл завести аля дин.массив len = len списка
из [0,1], который бы и казал, удалена строка или нет
а на onIdle физически удалять


 
Ega23 ©   (2012-01-13 12:09) [11]


> имхо, имеет смысл завести аля дин.массив len = len списка


Имеет смысл взять VirtualStringTree от SoftJems, чуть-чуть в нём поразбираться и не иметь после никаких проблем. Хоть миллион элементов вставляй.


 
Anatoly Podgoretsky ©   (2012-01-13 12:19) [12]


> лучше какой-нибудь Clear использовать - намного быстрее
> будет

Конечно быстрее, но никто не просил очищать весь ListBox



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
2-1326605148
bumbum
2012-01-15 09:25
2012.05.20
управлять устройством через com port


15-1326745802
Юрий
2012-01-17 00:30
2012.05.20
С днем рождения ! 17 января 2012 вторник


15-1322495603
И. Павел
2011-11-28 19:53
2012.05.20
Баги Fire Monkey


15-1326278247
>|<
2012-01-11 14:37
2012.05.20
Печать наклейки на USB-принтере


15-1326447033
aka
2012-01-13 13:30
2012.05.20
SSH+Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский