Cuando una acción incluso dispara, el "emisor" es siempre la acción misma. Por lo general, eso es lo más útil, pero ¿es posible de algún modo averiguar quién desencadenó el evento onexecute de la acción?¿Cómo puedo ver quién desencadenó una acción en Delphi?
Ejemplo
Digamos que usted tiene un formulario con los siguientes:
- 2 botones, llamados
Button1
yButton2
- 1 taction llama
actDoStuff
La misma acción está asignado a ambos botones. ¿Es posible mostrar en qué botón hice clic?
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.
La única solución que veo en este momento es no utilizar la propiedad de acción de los botones, pero tener un manejador de sucesos para cada botón, y llamar a actDoStuffExecute() desde allí, pero ese tipo de desafía el propósito de usar acciones en primer lugar.
No quiero tener una acción dedicada para cada control por separado tampoco. El ejemplo anterior es una versión simplificada del problema que estoy enfrentando. Tengo un menú con un número variable de elementos de menú (nombres de archivo), y cada ítem del menú básicamente tiene que hacer lo mismo, excepto para cargar otro archivo. Tener acciones para cada elemento del menú sería un poco tonto.
Consulte el parámetro "Sender: TObject"? ... Esto está pre-poblado para usted ... Pruebe echar un vistazo a Sender dentro de su función. – Fosco
Sí, pero en el ejemplo anterior, 'actDoStuff' sería el remitente. Quiero saber si se presionó el botón1 o el botón2. –