Quando un'azione viene attivata, il "mittente" è sempre l'azione stessa. Di solito è il più utile, ma è in qualche modo possibile scoprire chi ha attivato l'evento onexecute dell'azione?Come posso vedere chi ha attivato un'azione in Delphi?
Esempio
Diciamo che dispone di un modulo con il seguente:
- 2 pulsanti, chiamati
Button1
eButton2
- 1 dell'aderenza in marcia chiamato
actDoStuff
La stessa azione è assegnato a entrambi i pulsanti. È possibile mostrare quale pulsante ho cliccato?
Example.dfm
object Form1: TForm1
object Button1: TButton
Action = actDoStuff
end
object Button2: TButton
Action = actDoStuff
Left = 100
end
object actDoStuff: TAction
Caption = 'Do Stuff'
OnExecute = actDoStuffExecute
end
end
Example.pas
unit Example;
interface
uses Windows, Classes, Forms, Dialogs, Controls, ActnList, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
actDoStuff: TAction;
procedure actDoStuffExecute(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.actDoStuffExecute(Sender: TObject);
begin
ShowMessage('Button X was clicked');
end;
end.
L'unica soluzione che vedo in questo momento è di non usare la proprietà di azione di pulsanti, ma avente un eventhandler per ogni pulsante, e chiamando actDoStuffExecute() da lì, ma questo tipo di sfida allo scopo di utilizzare le azioni in primo luogo.
Non voglio avere un'azione dedicata per ciascun controllo separato. L'esempio sopra è una versione semplificata del problema che sto affrontando. Ho un menu con un numero variabile di voci di menu (nomi di file), e ogni voce di menu deve fondamentalmente fare la stessa cosa, ad eccezione del caricamento di un altro file. Avere azioni per ciascuna voce di menu sarebbe un po 'sciocco.
Vedi che parametro "Sender: TObject"? ... Questo è pre-compilato per te ... Prova a dare un'occhiata a Sender all'interno della tua funzione. – Fosco
Sì, ma nell'esempio sopra, 'actDoStuff' sarebbe il mittente. Voglio sapere se è stato premuto il pulsante 1 o il pulsante2. –