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

Вниз

TListView и OnCustomDrawItem   Найти похожие ветки 

 
serhiyiv ©   (2010-01-15 22:10) [0]

Здравствуйте. Подскажите пожалуйста как решить следующую проблему:
в событие TListView-а OnCustomDrawItem рисую

if odd (Item.Index) then begin
ImageList1.Draw(ListView1.Canvas,Rect.Left,Rect.Top,0);
end else begin
ImageList1.Draw(ListView1.Canvas,Rect.Left,Rect.Top,1);

при малом количестве айтемов все нормально, но как только их 1000+ то при прокрутке чуть ниже половины все начинает тормозить, и чем ближе к концу, тем больше тормозит.

А если использовать какие то более сложные функции что б получить номер иконки из TImageList или из другово источника, то тормозит даже при небольшом количестве айтемов.

В чем может быть проблема? Ето TListView такой тормоз или нужно както по другому прописывать. Просто есть пример с рисованием айтемов но на другом компоненте (не наследнике TListView), где в "OnCustomDrawItem" (у него там свой) исполняеться много разных функций и все работает без тормозов.

Так вот, нужно много рисовать, но подскажите какие тонкости или особености TListView нуждно учесть?
Хотя б как заставить TListView выполнить такой простой пример, как я навел выше?


 
DVM ©   (2010-01-16 11:42) [1]


> serhiyiv ©

Используй виртуальный режим. В этом режиме ListView не хранит данные, а берет их из внешнего источника. ListView-у надо лишь сообщить количество элементов. Как показывает практика в этом режиме все работает намного быстрее. Собственно скорость ограничена лишь скоростью взятия нужного элемента из внешнего списка. 100 000 элементов - тормозов нет абсолютно.


 
serhiyiv ©   (2010-01-16 13:58) [2]

Ну если закинуть 2000+ айтемов в стандартном режиме (не виртуальном) то все и так нормально работает (компонент сам рисует иконки из TImageList). Ну а если рисовать самому, и при етом в OnCustomDrawItem поместить еще какие то вычисления, типа, положение айтема и тд. то тормозит. И деже при не большом количистве (100 атемов) если производить некоторые болеее сложные вычисления то все ужасно тормозит. В примере который я нашел использеуться другой компонент, и там при отрисовке происходит: вычисление размеров айтема, проверка имееться ли такая каринка в record, такой у нее размер ччто нужен или нет, если нет то создаеться bitmap jpegimage и там создаеться картинка и запихаеться в record. Но там все отлично работает. Уже пробовал узнавать через сообщение LVM_ISITEMVISIBLE если атем виден то рисовать его, но все так само: при прокрутке дальше средины все начинает тормозить и чем ближе к концу тем больше. Так ето особенности TListView или не правильно прописан код? Помогите пожалуйста разобраться. Вот к примеру в WindowsMediPlayer отображаються альбомы и обложки песен да еще и звездочки и т.п. и все каботает, а тут прорисовать пару картинок нормально не получаеться?


 
DVM ©   (2010-01-16 14:05) [3]


> Уже пробовал узнавать через сообщение LVM_ISITEMVISIBLE
> если атем виден то рисовать его

это и так автоматические делается


> Ну а если рисовать самому, и при етом в OnCustomDrawItem
> поместить еще какие то вычисления, типа, положение айтема
> и тд. то тормозит

погоди, так код указанный в [0] это не все что ли? Давай полностью обработчик.


 
DVM ©   (2010-01-16 14:26) [4]


> serhiyiv ©

стати в режиме vsReport не тормозит, тормозит в режиме vsIcon



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

Текущий архив: 2010.03.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
2-1263994251
webpauk
2010-01-20 16:30
2010.03.21
Обращение к свойствам TForm по его Handle


1-1243761846
Dr.Andrew
2009-05-31 13:24
2010.03.21
Как упростить конструкцию Smallint(Pointer(@apeaks[i, 0])^) ?


1-1244548514
Валигози
2009-06-09 15:55
2010.03.21
Как прикрутить к своему приложению "7z.dll"?


2-1263855556
@!!ex
2010-01-19 01:59
2010.03.21
TRichEdit как узнать слово под мышкой?


2-1263977765
Неважно
2010-01-20 11:56
2010.03.21
CriticalSection