Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.05.20;
Скачать: CL | DM;

Вниз

Быстрое удаление выбранных записей из 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
2-1326607720
AlxAY
2012-01-15 10:08
2012.05.20
Как циклично выполнять процедуру при нажатой кнопке?


15-1326395711
Jeer
2012-01-12 23:15
2012.05.20
Опять про Фобос..


2-1326541097
Jimmy
2012-01-14 15:38
2012.05.20
PNGZLib и LoadFromResourceName


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


2-1322308094
3asys
2011-11-26 15:48
2012.05.20
Передача видео и звука с помощью Indy