Когда срабатывает событие TAction, "Отправитель" всегда является самим действием. Обычно это самое полезное, но можно ли как-нибудь выяснить, кто вызвал событие OnExecute?
Пример
Допустим, у вас есть форма со следующим:
- 2 кнопки, называемые
Button1
иButton2
- 1 TAction называется
actDoStuff
Одно и то же действие назначено обеим кнопкам. Можно ли показать, на какую кнопку я нажал?
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.
Единственное решение, которое я вижу на данный момент, состоит в том, чтобы не использовать свойство действия кнопок, а иметь обработчик событий для каждой кнопки и вызывать оттуда actDoStuffExecute(), но этот вид не поддается всей цели использования действий в первое место.
Я также не хочу иметь отдельное действие для каждого отдельного элемента управления. Приведенный выше пример является упрощенной версией проблемы, с которой я сталкиваюсь. У меня есть меню с переменным количеством пунктов меню (имен файлов), и каждый пункт меню в основном должен делать то же самое, за исключением загрузки другого файла. Иметь действия для каждого пункта меню было бы немного глупо.