![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TListView и OnCustomDrawItem
serhiyiv © (2010-01-15 22:10:00)Здравствуйте. Подскажите пожалуйста как решить следующую проблему:
в событие 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 14:26:00) [1]
> serhiyiv ©
стати в режиме vsReport не тормозит, тормозит в режиме vsIcon
DVM (2010-01-16 14:05:00) [2]
> Уже пробовал узнавать через сообщение LVM_ISITEMVISIBLE
> если атем виден то рисовать его
это и так автоматические делается
> Ну а если рисовать самому, и при етом в OnCustomDrawItem
> поместить еще какие то вычисления, типа, положение айтема
> и тд. то тормозит
погоди, так код указанный в [0] это не все что ли? Давай полностью обработчик.
serhiyiv (2010-01-16 13:58:00) [3]Ну если закинуть 2000+ айтемов в стандартном режиме (не виртуальном) то все и так нормально работает (компонент сам рисует иконки из TImageList). Ну а если рисовать самому, и при етом в OnCustomDrawItem поместить еще какие то вычисления, типа, положение айтема и тд. то тормозит. И деже при не большом количистве (100 атемов) если производить некоторые болеее сложные вычисления то все ужасно тормозит. В примере который я нашел использеуться другой компонент, и там при отрисовке происходит: вычисление размеров айтема, проверка имееться ли такая каринка в record, такой у нее размер ччто нужен или нет, если нет то создаеться bitmap jpegimage и там создаеться картинка и запихаеться в record. Но там все отлично работает. Уже пробовал узнавать через сообщение LVM_ISITEMVISIBLE если атем виден то рисовать его, но все так само: при прокрутке дальше средины все начинает тормозить и чем ближе к концу тем больше. Так ето особенности TListView или не правильно прописан код? Помогите пожалуйста разобраться. Вот к примеру в WindowsMediPlayer отображаються альбомы и обложки песен да еще и звездочки и т.п. и все каботает, а тут прорисовать пару картинок нормально не получаеться?
DVM (2010-01-16 11:42:00) [4]
> serhiyiv ©
Используй виртуальный режим. В этом режиме ListView не хранит данные, а берет их из внешнего источника. ListView-у надо лишь сообщить количество элементов. Как показывает практика в этом режиме все работает намного быстрее. Собственно скорость ограничена лишь скоростью взятия нужного элемента из внешнего списка. 100 000 элементов - тормозов нет абсолютно.