How can I see who triggered an action in Delphi?
Try using the ActionComponent property:
Stores the client component that caused this action to execute.
Use ActionComponent to discern which client component caused this action to execute. For example, examine ActionComponent from an OnExecute event handler if you need to know what user action triggered this action.
When the user clicks a client control, that client sets ActionComponent before calling the action's Execute method. After the action executes, the action resets ActionComponent to nil.
For example:
ShowMessage( (Sender as TAction).ActionComponent.Name );
Using this I get "Button1" and "Button2" when I click the first and second button respectively.
Instead of actions, just use a click event. Set all buttons to use the same event handler. Ideally, NOT named after the first button (you can rename it).
Here's the code:
Procedure TMyForm.DestinationButtonClickHandlerThing(Sender: TObject);
begin
if Sender = Btn_ViewIt then
begin
// View It
end
else if Sender = Btn_FaxIt then
begin
// Fax It
end
else if Sender = Btn_ScrapIt then
begin
// Scrap It
end
else
.... // error
...
end;
Knowing what button triggered the action sort of goes against the point of using actions - an action may be triggered by a button click, or a menu click, or any number of other user activities. Actions exist to unify the state management of enable/disabled and click handling between buttons and menus.
If you want to know which button fired the action because you want to perform a slightly different operation, or "flavor" the operation differently, then perhaps TAction isn't the right solution for what you want to do.