Главная страница
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.014 c
2-1263821072
Андрей Пл
2010-01-18 16:24
2010.03.21
TDBGrid при Requery смещаються отображаемые записи.


2-1263562192
fford
2010-01-15 16:29
2010.03.21
вызов функции из потока


2-1264116575
pazitiff
2010-01-22 02:29
2010.03.21
Invalid pointer operation


1-1240936541
Igor2010
2009-04-28 20:35
2010.03.21
JavaScript+IHTMLWindows2


15-1258960395
desc
2009-11-23 10:13
2010.03.21
Длинные имена файлов