![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Приветствую!
Задача следующая - загружать из файла в ListView (три колонки) большущий список строк, порядка 40-50К, а то и больше. Конечно, это занимало много времени, поэтому решил проблему переводом ListView в виртуальный режим. Теперь всё ОК, даже миллион строк грузится буквально за секунду. С ListView разобрался, но вот незадача - к каждой строке еще нужно прицепить по иконке. Вот как этот процесс оптимизировать? Ведь ListView берет иконки из TImageList (кстати, можно ли из другого места брать, подскажите?). А чтобы заполнить этот TImageList 40-50К картинок (гружу их из папки), опять же, нужно много времени. Если подгружать в TImageList иконки по мере прокрутки ListView, т.е. на событие ListView1.OnData добавить ImageList1.Add(bm, nil), тогда всё хорошо, но стоит резко крутануть скролл вниз - и тут же иконки пропадают, так как предыдущие индексы еще не заполнились. Пробовал вешать на кнопку "Загрузить список из файла" цикл в котором TImageList предварительно заполняется Nil'ами в цикле: Код:
... for i:=0 to ListView1.Items.Count-1 do ImageList1.Add(nil, nil); ... А затем при необходимости заменять нужный индекс нужной картинкой: Код:
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); var bm: TBitMap; begin ... ImageList1.Replace(Item.Index, bm, nil); Item.ImageIndex:= Item.Index; ... end; Работает, но опять же - предварительное заполнение nil'ами в начале по скорости такое же как и если бы я сразу загрузил в него все нужные иконки. Как можно оптимизировать это всё и ускорить? Например, можно ли как-то изначально задать количество элементов в TImageList, не заполняя его nil'ами в цикле? Или как-то избавиться от тормозного TImageList и заменить его чем-то? Очень надеюсь на дельные советы. Заранее спасибо! Последний раз редактировалось garun, 06.12.2014 в 09:43. |
#2
|
||||
|
||||
![]() Можно попробовать рисовать картинки на событии типа «OnDrawItem». Будут обрабатываться только видимые строки.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() я работаю с виртуальным ListView, там в любом случае обрабатываются только видимые строки (OnData). Но даже если и на OnDrawItem отрисовку поставить, то всё равно ведь придется сначала заполнять TImageList чем-то, либо nil, либо сразу картинками. так ведь?
|
#4
|
||||
|
||||
![]() Сделать тогда имидж-лист по подобию ассоциативного словаря, где не обязателен порядок заполнения картинок, а нахождение нужного элемента по алгоритму обхода графа.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо Freeman за это полезное сообщение: | ||
garun (06.12.2014)
|
#6
|
||||
|
||||
![]() Цитата:
Действительно, стоило только присвоить AllocBy большее значение и проблема исчезла. Благодарю! |