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