Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ListView DrawItem [D5]


Вова ©   (2013-12-20 18:20:00) 

Здравствуйте, други!

В Delphi5 использую ListView - никаких проблем не было, пока не стал раскрашивать строки:

procedure TForm1.WkzListViewCustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if Odd(Item.Index) then
   Sender.Canvas.Brush.Color := clYellow;
 else
   Sender.Canvas.Brush.Color := clGreen;

 State := [cdsDefault];
 DefaultDraw := True;
end;


Теперь получаю сообщение о переполнении Integer.
останавливается в модуле ComCtrls на выделеной строке:

if (dwDrawStage and CDDS_ITEMPOSTPAINT <> 0)
        and (PFontHandles(DesignInfo).OurFont + PFontHandles(DesignInfo).StockFont <> 0) then
     begin
        SelectObject(hdc, PFontHandles(DesignInfo).StockFont);
        DeleteObject(PFontHandles(DesignInfo).OurFont);
        PFontHandles(DesignInfo).OurFont := 0;
        PFontHandles(DesignInfo).StockFont := 0;
     end;


В инете по этому поводу ничего не нашёл. Какая причина может быть?


Вова   (2013-12-21 00:01:00) [1]

Да. Заменил в ComCtrls if (dwDrawStage and CDDS_ITEMPOSTPAINT <> 0)
на if ((dwDrawStage and CDDS_ITEMPOSTPAINT) = CDDS_ITEMPOSTPAINT)

if dwDrawStage and CDDS_ITEMPREPAINT <> 0 then
на if (dwDrawStage and CDDS_ITEMPREPAINT) = CDDS_ITEMPREPAINT then

и всё заработало.


Вова   (2013-12-20 23:38:00) [2]

Собака порылась здесь:
http://qc.embarcadero.com/wc/qcmain.aspx?d=12322


Вова   (2013-12-20 19:11:00) [3]

Может здесь видно в чём собака порылась?

004686B6 33C9             xor ecx,ecx
004686B8 BA28000000       mov edx,$00000028
004686BD E8FEAAF9FF       call @FillChar
comctrls.pas.12821: TmpItem.iItem := dwItemSpec;
004686C2 8B4324           mov eax,[ebx+$24]
004686C5 8945A8           mov [ebp-$58],eax
comctrls.pas.12824: if (dwDrawStage and CDDS_ITEMPOSTPAINT <> 0)
004686C8 F7430C02000100   test [ebx+$0c],$00010002
004686CF 7446             jz TCustomListView.CNNotify + $3FF
004686D1 8B45FC           mov eax,[ebp-$04]
004686D4 8B4018           mov eax,[eax+$18]
004686D7 8B10             mov edx,[eax]
004686D9 035004           add edx,[eax+$04]
004686DC 7105             jno TCustomListView.CNNotify + $3CB
004686DE E829ADF9FF       call @IntOver
004686E3 85D2             test edx,edx
004686E5 7430             jz TCustomListView.CNNotify + $3FF
comctrls.pas.12827: SelectObject(hdc, PFontHandles(DesignInfo).StockFont);
004686E7 8B45FC           mov eax,[ebp-$04]
004686EA 8B4018           mov eax,[eax+$18]
004686ED 8B4004           mov eax,[eax+$04]
004686F0 50               push eax
004686F1 8B4310           mov eax,[ebx+$10]
004686F4 50               push eax
004686F5 E84AEEF9FF       call SelectObject
comctrls.pas.12828: DeleteObject(PFontHandles(DesignInfo).OurFont);
004686FA 8B45FC           mov eax,[ebp-$04]
004686FD 8B4018           mov eax,[eax+$18]
00468700 8B00             mov eax,[eax]
00468702 50               push eax
00468703 E81CEDF9FF       call DeleteObject
comctrls.pas.12829: PFontHandles(DesignInfo).OurFont := 0;
00468708 8B45FC           mov eax,[ebp-$04]
0046870B 8B4018           mov eax,[eax+$18]
0046870E 33D2             xor edx,edx


Вова   (2013-12-20 19:01:00) [4]

Странно, в момент остановки dwDrawStage не определён :/


Вова   (2013-12-20 18:58:00) [5]

В тот момент, когда останавливается CDDS_ITEMPOSTPAINT имеет значение 65538


Вова   (2013-12-20 18:57:00) [6]

В Delphi5 dwDrawStage: DWORD


RWolf   (2013-12-20 18:53:00) [7]


>  [1]

dwDrawStage и так Cardinal, в D7 по крайней мере.
а CDDS_ITEMPOSTPAINT вообще $00010002.


Вова   (2013-12-20 18:39:00) [8]

Это модуль ComCtrls в Delphi5. Не править же его. Кроме того, судя по тому, что в инете нет инфы по этому поводу, думаю, что я где-то, что-то не правильно делаю.


Ega23   (2013-12-20 18:33:00) [9]

(Cardinal(dwDrawStage) and CDDS_ITEMPOSTPAINT) <> 0

?


Наверх

Титульная страница Поиск, карта сайта Написать письмо