Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c