Delphi 6, перерисовка компонента

Dimon89

Я использую компонент TListView с параметром OwnerDraw (чтобы самому раскрашивать строчки). Соответственно есть процедура DrawItem(Item: TListItem,...). У каждого Item'а есть Data - указатель на ассоциированный этому элементу поток (Thread). Как я понял, каждый раз, когда в потоке происходит какое-то изменение (присваивание переменной, например строчка таблицы перерисовывывается, поэтому на экране сплошное мельтешение. Как от этого избавиться?

Dimon89

Убрал OwnerDraw, сделал перерисовку по таймеру. Неудобно, да и строчки раскрашивать не могу

Andbar

Не всё понял, но:
1. перерисовывать следует в VCL-потоке
2. при изменении данных следует вызывать метод Invalidate вместо перерисовывания, а сама прорисовка должна выполняться по событию OnDrawItem, или как там оно называется.

Dimon89

1. перерисовывать следует в VCL-потоке
2. при изменении данных следует вызывать метод Invalidate вместо перерисовывания, а сама прорисовка должна выполняться по событию OnDrawItem, или как там оно называется.
Перерисовка идет в потоке основной формы. Я перерисовывание не вызываю - оно вызывается где-то само при изменении данных.

Dimon89

Ладно, обновляется вроде нормально. Но перерисовывается всё равно криво. Похоже из-за какой-то внутренней буферизации компонент перерисовывает не всё, а только то, что изменилось. Хотя в процедуре OnDrawItem я перерисовываю всю строку, всё равно откуда-то берутся артефакты типа

ЗЫ Цвет строки должен быть постоянным, т.к. он внутри процедуры OnDrawItem не меняется, а процедура перерисовывает всю строку.

Andbar

Я перерисовывание не вызываю - оно вызывается где-то само при изменении данных.
Я так и не понял, про какие данные ты говоришь?
Items чтоли? Ты его не из VCL-потока меняешь?
И еще, в каких методах ты рисуешь? В D7 есть OnCustomDrawItem и OnCustomDrawSubItem, т.е. прорисовка идёт по отдельности, не исключено, что вызывается только прорисовка одной клетки. Что в D6 - не видел.

Dimon89

Я так и не понял, про какие данные ты говоришь?
Items чтоли? Ты его не из VCL-потока меняешь? И еще, в каких методах ты рисуешь? В D7 есть OnCustomDrawItem и OnCustomDrawSubItem, т.е. прорисовка идёт по отдельности, не исключено, что вызывается только прорисовка одной клетки. Что в D6 - не видел.
Данные - не Items. У меня с каждым итемом проассоциирован поток, что-то вроде
Item.Data := TThread;

С этим я уже разобрался.
Перерисовка похоже вызывается, когда я изменяю SubItems (в основном VCL-потоке). Рисую я в методе OnDrawItem, тк OnCustomDrawItem и OnCustomDrawSubItem не позволяют собственно рисовать на канвасе. В процедуре OnDrawItem перерисовывается вся строка сразу, однако как видно на скрине, временами перерисовываются только изменившиеся клетки. Мне тут подсказывают что-то про InvalidateRegion, сейчас буду разбираться.

Dimon89

InvalidateRect спас =)
Оставить комментарий
Имя или ник:
Комментарий: