TAction イベントが発生すると、「送信者」は常にアクションそのものです。通常はこれが最も便利ですが、アクションの OnExecute イベントをトリガーしたのは誰かを特定することはできますか?
例
次のフォームがあるとします。
Button1
と呼ばれる 2 つのボタン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
例.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() を呼び出すことですが、それはそもそもアクションを使用する目的全体に反するものです。
個別のコントロールごとに専用のアクションも必要ありません。上記の例は、私が直面している問題の単純化されたバージョンです。さまざまな数のメニュー項目 (ファイル名) を持つメニューがあり、別のファイルをロードすることを除いて、各メニュー項目は基本的に同じことを行う必要があります。メニュー項目ごとにアクションを用意するのは少しばかげています。