Volgens mij kom ik er gewoon met
Code:
(((Sender as TAction).ActionComponent as TMenuItem).GetParentMenu as TPopupMenu).PopupComponent
Uitgeschreven in een functie wordt dat:
Code:
function GetPopupMenuActionTriggerComponent(Action: TAction): TComponent;
var
ActionComponent : TComponent;
ParentMenu : TMenu;
begin
// Vraag het component dat de action triggerde. Dat is het menuitem.
ActionComponent := Action.ActionComponent;
// Zoek het parent menu van het menuitem. Dat is het popupmenu
ParentMenu := (ActionComponent as TMenuItem).GetParentMenu;
// Vraag het popupcomponent van het popupmenu. Dat is het
//component dat verantwoordelijk was voor het tonen van het popupmenu
Result := (ParentMenu as TPopupMenu).PopupComponent;
end;
In een testje heb ik een memo, daaraan gekoppeld een popupmenu, met een item er in. Aan het item hangt een action en die action heeft een OnExecute met de volgende regel code:
Code:
// Sender van het event is de action
ShowMessage(GetPopupMenuActionTriggerComponent(Sender as TAction).Name);
Het resultaat na het klikken op het popupmenuitem is een melding met de tekst 'Memo1'.
Zou runtime ook moeten lukken.
[edit]
Weer niet goed gelezen. 'Soort popupform' is vast geen popupmenu.
Nou ja. Deze code heeft als nadeel dat het alleen werkt via dat popupmenu. Het werkt niet als je de action start via een shortcut ofzo.
Het voordeel is wel dat popupmenu.PopupComponent altijd het grid blijft dat het menu heeft geopend. Als dus ActiveControl zou wijzigen terwijl het menu open staat, dan heeft dat geen invloed op deze code.
Bookmarks