Ich habe mir mit Hilfe des Forums und Google folgende Klasse gebaut. Somit bin ich in der Lage herauszufinden, wann ein PopupMenu sichtbar ist und wann nicht
Delphi-Quellcode:
unit Utils.PopupListEx;
interface
uses Vcl.Menus,
Winapi.Messages, System.Classes;
type
TPopupListEx =
class(TPopupList)
private
procedure WndProc(
var Message: TMessage);
override;
public
PopupMenu: TPopupMenu;
MenuLoop: Boolean;
end;
type
TPopupMenu =
class(
Vcl.Menus.TPopupMenu)
private
public
// procedure Popup(X, Y: Integer); override;
procedure DoPopup(Sender: TObject);
override;
end;
implementation
procedure TPopupListEx.WndProc(
var Message: TMessage);
begin
case Message.Msg
of
WM_ENTERMENULOOP:
begin
MenuLoop := True;
// Menu sichtbar
end;
WM_EXITMENULOOP:
begin
MenuLoop := False;
// Menu nicht mehr sichtbar
TPopupListEx(PopupList).PopupMenu :=
nil;
end;
end;
inherited WndProc(
Message);
end;
{*
procedure TPopupMenu.Popup(X, Y: Integer);
begin
// TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu; // wie komme ich hier an den Sender?
inherited;
end;
*}
procedure TPopupMenu.DoPopup(Sender: TObject);
begin
TPopupListEx(PopupList).PopupMenu := Sender
as TPopupMenu;
inherited;
end;
end.
In jedes PopupMenuXPopup-Even müsste ich händisch eigentlich
TPopupListEx(PopupList).PopupMenu := Sender as TPopupMenu;
schreiben.
Da man das aber schnell vergessen kann, möchte ich das gerne automatisiert erledigen und das Popup-Event überschreiben.
Nur wie komme ich an den Sender?
Edit ich weiß nicht, ob ich das richtig gelößt habe. Aber statt Popup() überschreibe ich jetzt DoPopup(Sender: TObject);. Dann habe ich den Sender.
Jetzt bekomme ich nur die Meldung
Zitat:
[dcc32 Hinweis] Utils.PopupListEx.pas(10): H2269 Durch das Überschreiben erhält die virtuelle Methode 'TPopupListEx.WndProc' eine geringere Sichtbarkeit (private) als die Basisklasse 'TPopupList' (protected)
Wie bekomme ich diese Meldung denn korrekt weg?