当动作甚至触发时,“发件人”始终是动作本身.通常这是最有用的,但是有可能找出谁触发了这个动作的一次事件呢?
例
假设你有一个表单与以下:
> 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(),但这种方式首先违反了使用动作的全部目的.
我不想为每个单独的控件都有一个专门的动作.上面的例子是我面临的问题的简化版本.我有一个带有可变数量菜单项(文件名)的菜单,每个菜单项基本上都要做同样的事情,除了加载另一个文件.对每个菜单项进行操作会有点傻.
解决方法
尝试使用ActionComponent属性:
ShowMessage( (Sender as TAction).ActionComponent.Name );
当我分别点击第一个和第二个按钮时,我会得到“Button1”和“Button2”.