Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.12.2014, 09:25
Аватар для garun
garun garun вне форума
Прохожий
 
Регистрация: 06.12.2014
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Чем можно заменить или как ускорить TImageList?

Приветствую!

Задача следующая - загружать из файла в 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  
Старый 06.12.2014, 09:53
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Можно попробовать рисовать картинки на событии типа «OnDrawItem». Будут обрабатываться только видимые строки.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 06.12.2014, 10:04
Аватар для garun
garun garun вне форума
Прохожий
 
Регистрация: 06.12.2014
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

я работаю с виртуальным ListView, там в любом случае обрабатываются только видимые строки (OnData). Но даже если и на OnDrawItem отрисовку поставить, то всё равно ведь придется сначала заполнять TImageList чем-то, либо nil, либо сразу картинками. так ведь?
Ответить с цитированием
  #4  
Старый 06.12.2014, 13:22
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Сделать тогда имидж-лист по подобию ассоциативного словаря, где не обязателен порядок заполнения картинок, а нахождение нужного элемента по алгоритму обхода графа.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 06.12.2014, 13:48
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

AllocBy у ImageList сколько стоит? Сразу поставить сколько надо, иначе он по чайной ложке добавляет.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Этот пользователь сказал Спасибо Freeman за это полезное сообщение:
garun (06.12.2014)
  #6  
Старый 06.12.2014, 20:10
Аватар для garun
garun garun вне форума
Прохожий
 
Регистрация: 06.12.2014
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
Радость

Цитата:
Сообщение от Freeman
AllocBy у ImageList сколько стоит? Сразу поставить сколько надо, иначе он по чайной ложке добавляет.

Действительно, стоило только присвоить AllocBy большее значение и проблема исчезла. Благодарю!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:04.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025