Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2014, 09:53   #1
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Вопрос Чем можно заменить или как ускорить 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 и заменить его чем-то? Очень надеюсь на дельные советы. Заранее спасибо!
garuna вне форума Ответить с цитированием
Старый 06.12.2014, 13:09   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Куча событий CustomDraw. Там тоже картинки можно прорисовывать без всякого ImageList
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.12.2014, 13:21   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
и тут же иконки пропадаю
И будут пропадать. Необходимо эту байду перерисовывать в OnPaint. Костыль, конечно, но тут уж ничего не придумаешь. Не, ещё можно в DirerctDraw, но та же - жопа, только в профиль.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2014, 13:28   #4
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

а нужно ли грузить весь список из 40-50к записей?
человеку думаю будет сложно обработать этот набор данных
может лучше выдавать порциями, фильтровать или подгружать динамически?
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 06.12.2014, 13:38   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Не совсе понятна идея. Если идти от эргономики, 7-8 записей - за глаза. Если их больше, необходими разработать определённый критерий выдачи. Каков он будет? То мне не ведмо. Всё на усмитрение автора.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2014, 13:44   #6
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Куча событий CustomDraw. Там тоже картинки можно прорисовывать без всякого ImageList
Без ImageList? А можно подробнее?
garuna вне форума Ответить с цитированием
Старый 06.12.2014, 13:58   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от garuna Посмотреть сообщение
Без ImageList? А можно подробнее?
Какой максимальный размер картнки? Там есть ограничения, 64х64. Еслт будет больше, она урежитсяся с левого верхнего пикселя.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2014, 14:05   #8
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Какой максимальный размер картнки? Там есть ограничения, 64х64. Еслт будет больше, она урежитсяся с левого верхнего пикселя.

картинки все от 16x16 до 48x48
garuna вне форума Ответить с цитированием
Старый 06.12.2014, 14:17   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Приведи их все к формату 64х64 и будет тебе счастье.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.12.2014, 14:30   #10
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Вобщем проблему решил еще проще) Поменял значение ImageList.AllocBy на 1000 и всё стало загружаться моментально) Всем спасибо, тема больше не актуальна!
garuna вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем можно заменить свойство PageSetup.FirstPageNumber в старом EXELе? vpm Microsoft Office Excel 0 14.11.2012 18:34
Как можно ускорить скорость макроса? staniiislav Microsoft Office Excel 7 21.12.2011 09:44
Чем можно заменить компоненты Indy? Arsenx777 Работа с сетью в Delphi 7 29.07.2011 04:35
Чем можно заменить конструкцию? Или как быть ? kitovras Microsoft Office Excel 3 12.08.2009 15:31
Чем можно заменить объект BitBtn? frai Компоненты Delphi 3 14.04.2007 12:42