Ich habe dieses
Problem mit einem TPopupMenu ebenfalls gehabt und so gelöst:
Delphi-Quellcode:
type TMyMenuItem = class(TMenuItem)
protected
procedure AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect;
State: TOwnerDrawState; TopLevel: Boolean); override;
end;
type
TMainForm = class(TForm)
procedure popupMenuMainPopup(Sender: TObject);
end;
var
ShowAccel : BOOL;
procedure TMyMenuItem.AdvancedDrawItem(ACanvas: TCanvas; ARect: TRect;
State: TOwnerDrawState; TopLevel: Boolean);
begin
if ShowAccel AND Assigned(Self.GetParentMenu.Images) then
State:= State - [odNoAccel];
inherited;
end;
procedure TMainForm.popupMenuMainPopup(Sender: TObject);
begin
SystemParametersInfo(SPI_GETMENUUNDERLINES, 0, @ShowAccel, 0);
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
if Assigned(Self.PopupMenu) then
begin
for i:=0 to 8 do
Self.PopupMenu.Items.Add(TMyMenuItem.Create(Self));
end;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Self.PopupMenu.Items.Clear;
end;
Ob der Code in der Form funktioniert, weiß ich nicht, weil ich das jetzt aus dem Projekt aus dem verlinkten Thread zusammenkopiert habe. Das Grundprinzip ist aber recht einfach: bei jedem Popup wird der Status der Einstellung ermittelt und in einer globalen Variable gespeichert. Ja, ich weiß, is böse
, geht aber an der Stelle nicht anders, weil 2 Klassen auf diese Variable zugreifen können müssen, es sei denn, man manscht das alles zu einer Klasse zusammen, aber man kann's auch übertreiben. Beim Zeichnen eines MenuItems wird der entsprechende Status der Einstellung mit berücksichtigt, weil die
VCL das nicht tut.
MfG Dalai