Bonjour,
j’ai des actions qui peuvent être appelé depuis le mainmenu ou d’un popupmenu.
Existe-il un moyen de connaître si l’appelant est l’un ou l’autre dans le .execute de l’action ?
Merci d’avance de vos lumières sur le sujet.
Version imprimable
Bonjour,
j’ai des actions qui peuvent être appelé depuis le mainmenu ou d’un popupmenu.
Existe-il un moyen de connaître si l’appelant est l’un ou l’autre dans le .execute de l’action ?
Merci d’avance de vos lumières sur le sujet.
Pour le TPopupMenu, il n'y a pas PopupComponent ?
le Sender contient le TAction et ce dernier ne semble pas avoir de lien sur le Control déclencheur
Autant faire deux gestionnaire qui invoque un code commun
Merci, de vos retours.
je vais me pencher sur PopupComponent
En attendant, j’ai opté pour avancer sur une solution similaire à celle proposé par ShaiLeTroll.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 unit Unit9; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, System.Actions, Vcl.ActnList, Vcl.StdActns, Vcl.ExtActns; type TForm9 = class(TForm) PopupMenu1: TPopupMenu; MainMenu1: TMainMenu; ActionList1: TActionList; DialogOpenPicture1: TOpenPicture; Ouvriruneimage1: TMenuItem; Ouvriruneimage2: TMenuItem; procedure ActionList1Execute(Action: TBasicAction; var Handled: Boolean); private { Déclarations privées } public { Déclarations publiques } end; var Form9: TForm9; implementation {$R *.dfm} procedure TForm9.ActionList1Execute(Action: TBasicAction; var Handled: Boolean); begin ShowMessage(TMenuITem(Action.ActionComponent).GetParentMenu.ClassName); end; end.
Merci Papy214 !
L'action n'a pas de lien avec un Control mais avec un Component ! bien vu !
J'ai retrouvé ça l'utilisation de ActionComponent dans un seul code en 25 ans mais pour retrouver un TControl et comme selon la source l'action ne faisait rien en commun, cela n'avait aucun intérêt de regrouper cela sur la même action, c'était un code d'un ancien collègue qui utilisait un Execute event handler unique pour toutes ses actions qui contenaient genre 100 if else if pour lancer le code selon l'action, je n'ai jamais compris cette façon de faire.
Pour rebondir sur ton code, ça donnerait :
Evidemment, si il n'y a aucun code commun entre l'un ou l'autre, autant faire deux gestionnaires différents.Code:
1
2
3
4
5
6
7
8
9
10
11 procedure TForm9.ActionList1Execute(Action: TBasicAction; var Handled: Boolean); begin if TMenuITem(Action.ActionComponent).GetParentMenu() is TPopupMenu then begin ... end else if TMenuITem(Action.ActionComponent).GetParentMenu() is TMainMenu then begin ... end end;
Merci de vos bouts de code :bravo: