当触发 TAction 事件时,“发送者”始终是操作本身。通常这是最有用的,但是否有可能找出谁触发了操作的 OnExecute 事件?
例子
假设您有一个包含以下内容的表单:
- 2 个按钮,称为
Button1
和Button2
- 1 个 TAction 被调用
actDoStuff
相同的动作被分配给两个按钮。是否可以显示我单击了哪个按钮?
例子.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
例子.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() ,但这违背了首先使用操作的全部目的。
我也不希望对每个单独的控件都有专门的操作。上面的示例是我面临的问题的简化版本。我有一个带有可变数量的菜单项(文件名)的菜单,每个菜单项基本上都必须做同样的事情,除了加载另一个文件。为每个菜单项设置操作有点愚蠢。