Hallo Gemeinde,
ich wollte den Threadtitel schon in "Waaas für Praktikanten arbeiten bei Emba?" benennen, fand es dann aber doch zu unsachlich.
Meine Kollegen arbeiten mit den C++Builder XE3 an einem
VCL-Formular mit aktiviertem
VCL Style unter 64-Bit.
Bei Verwendung des Stylings und einer TToolBar kam es unter bestimmten Umständen zu obskuren
Access Violations, hier ein CallStack-Beispiel:
Code:
:00007FF956748A23 ; C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9600.16384_none_34a8918f959016ea\COMCTL32.DLL
:00007FF95674C948 ; C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9600.16384_none_34a8918f959016ea\COMCTL32.DLL
:0000000000a81178 ;
Vcl::Imglist::TCustomImageList::SetNewDimensions(unsigned long long)
:0000000000a81294 ;
Vcl::Imglist::TCustomImageList::SetHandle(unsigned long long)
:0000000000b8bb0e ;
Vcl::Comctrls::TToolBarStyleHook::ApplyImageList()
:0000000000b8be52 ;
Vcl::Comctrls::TToolBarStyleHook::Paint(
Vcl::Graphics::TCanvas*)
:0000000000a59bf5 ;
Vcl::Themes::TStyleHook::WMPaint(
Winapi::Messages::TMessage&)
:0000000000cddaa1 ; System::TObject::Dispatch(void*)
Das sorgte auch dafür, das die Icons in den TToolButtons nicht richtig gesetzt bzw. verschoben dargestellt wurden.
Beim Debuggen des ToolBar-StyleHooks ist mir die folgende Stelle aufgefallen:
Delphi-Quellcode:
procedure TToolBarStyleHook.ApplyImageList;
var
H: Cardinal;
// <--- Was zum Kuckkuck ist das?
begin
H := SendMessage(
Handle, TB_GETIMAGELIST, 0, 0);
if (H <> 0)
and (FImages =
nil)
then
begin
FImages := TImageList.Create(
nil);
FImages.ShareImages := True;
FImages.Handle := H;
end;
end;
Warum wird hier ein fester Cardinal verwendet, anstatt ein HImageList?
Das kann ja wohl nicht wahr sein...
Ist das in XE6 gefixt?
Unter XE5 (beim Kollegen geschaut) ist der falsche Datentyp noch da.