Delphi 6, перерисовка компонента
Убрал OwnerDraw, сделал перерисовку по таймеру. Неудобно, да и строчки раскрашивать не могу
1. перерисовывать следует в VCL-потоке
2. при изменении данных следует вызывать метод Invalidate вместо перерисовывания, а сама прорисовка должна выполняться по событию OnDrawItem, или как там оно называется.
1. перерисовывать следует в VCL-потокеПерерисовка идет в потоке основной формы. Я перерисовывание не вызываю - оно вызывается где-то само при изменении данных.
2. при изменении данных следует вызывать метод Invalidate вместо перерисовывания, а сама прорисовка должна выполняться по событию OnDrawItem, или как там оно называется.
ЗЫ Цвет строки должен быть постоянным, т.к. он внутри процедуры OnDrawItem не меняется, а процедура перерисовывает всю строку.
Я перерисовывание не вызываю - оно вызывается где-то само при изменении данных.Я так и не понял, про какие данные ты говоришь?
Items чтоли? Ты его не из VCL-потока меняешь?
И еще, в каких методах ты рисуешь? В D7 есть OnCustomDrawItem и OnCustomDrawSubItem, т.е. прорисовка идёт по отдельности, не исключено, что вызывается только прорисовка одной клетки. Что в D6 - не видел.
Я так и не понял, про какие данные ты говоришь?Данные - не Items. У меня с каждым итемом проассоциирован поток, что-то вроде
Items чтоли? Ты его не из VCL-потока меняешь? И еще, в каких методах ты рисуешь? В D7 есть OnCustomDrawItem и OnCustomDrawSubItem, т.е. прорисовка идёт по отдельности, не исключено, что вызывается только прорисовка одной клетки. Что в D6 - не видел.
Item.Data := TThread;
С этим я уже разобрался.
Перерисовка похоже вызывается, когда я изменяю SubItems (в основном VCL-потоке). Рисую я в методе OnDrawItem, тк OnCustomDrawItem и OnCustomDrawSubItem не позволяют собственно рисовать на канвасе. В процедуре OnDrawItem перерисовывается вся строка сразу, однако как видно на скрине, временами перерисовываются только изменившиеся клетки. Мне тут подсказывают что-то про InvalidateRegion, сейчас буду разбираться.
InvalidateRect спас =)
Оставить комментарий
Dimon89
Я использую компонент TListView с параметром OwnerDraw (чтобы самому раскрашивать строчки). Соответственно есть процедура DrawItem(Item: TListItem,...). У каждого Item'а есть Data - указатель на ассоциированный этому элементу поток (Thread). Как я понял, каждый раз, когда в потоке происходит какое-то изменение (присваивание переменной, например строчка таблицы перерисовывывается, поэтому на экране сплошное мельтешение. Как от этого избавиться?