我怎样才能看到谁在Delphi中触发了一个动作?

Wou*_*ick 14 delphi taction

当一个动作甚至触发时,"发送者"总是动作本身.通常这是最有用的,但是在某种程度上可以找出谁触发了行动的onexecute事件?

假设您有一个包含以下内容的表单:

  • 2个按钮,叫做Button1Button2
  • 1 TATION叫 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可以识别导致此操作执行的客户端组件.例如,检查ActionComponentOnExecute事件处理程序,如果你需要知道哪些用户操作触发此动作.

当用户单击客户端控件时,该客户端在调用操作的Execute方法之前设置ActionComponent.执行操作后,操作会将ActionComponent重置为nil.

例如:

  ShowMessage( (Sender as TAction).ActionComponent.Name );
Run Code Online (Sandbox Code Playgroud)

使用它,当我分别单击第一个和第二个按钮时,我得到"Button1"和"Button2".

  • 注意:当键盘快捷键触发操作时会发生什么? (10认同)

dth*_*rpe 9

知道什么按钮触发了动作类型与使用动作相反 - 可以通过按钮单击,菜单单击或任何数量的其他用户活动来触发动作.存在用于统一启用/禁用的状态管理以及按钮和菜单之间的点击处理的动作.

如果您想知道哪个按钮触发了该操作,因为您想要执行稍微不同的操作,或者以不同方式"调整"操作,那么TAction可能不是您想要执行的操作的正确解决方案.

  • 我是TAction的忠实拥护者.我建议的是,一种旨在根据用于触发事件的UI元素来改变事件行为的设计是一种有缺陷的设计.无论触发器如何,都使用TActions统一处理动作.如果您真的需要在单击按钮而不是菜单项时发生不同的事情,则创建不同的操作. (2认同)