![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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
?