当一个动作甚至触发时,"发送者"总是动作本身.通常这是最有用的,但是在某种程度上可以找出谁触发了行动的onexecute事件?
例
假设您有一个包含以下内容的表单:
Button1和Button2 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
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
我目前看到的唯一解决方案是不使用按钮的action属性,而是为每个按钮设置一个事件处理程序,并从那里调用actDoStuffExecute(),但这种方式首先违背了使用动作的全部目的.
我也不想为每个单独的控件都有专门的操作.上面的例子是我面临的问题的简化版本.我有一个菜单,其中包含可变数量的菜单项(文件名),除了加载另一个文件外,每个菜单项基本上都要做同样的事情.对每个菜单项执行操作会有点愚蠢.
Vil*_*nde 22
尝试使用ActionComponent属性:
存储导致此操作执行的客户端组件.
使用ActionComponent可以识别导致此操作执行的客户端组件.例如,检查ActionComponent从OnExecute事件处理程序,如果你需要知道哪些用户操作触发此动作.
当用户单击客户端控件时,该客户端在调用操作的Execute方法之前设置ActionComponent.执行操作后,操作会将ActionComponent重置为nil.
例如:
ShowMessage( (Sender as TAction).ActionComponent.Name );
Run Code Online (Sandbox Code Playgroud)
使用它,当我分别单击第一个和第二个按钮时,我得到"Button1"和"Button2".
知道什么按钮触发了动作类型与使用动作相反 - 可以通过按钮单击,菜单单击或任何数量的其他用户活动来触发动作.存在用于统一启用/禁用的状态管理以及按钮和菜单之间的点击处理的动作.
如果您想知道哪个按钮触发了该操作,因为您想要执行稍微不同的操作,或者以不同方式"调整"操作,那么TAction可能不是您想要执行的操作的正确解决方案.
| 归档时间: |
|
| 查看次数: |
10172 次 |
| 最近记录: |