Delphi - поймать все action.onexecute из приложения - PullRequest
6 голосов
/ 21 декабря 2011

У меня большое приложение с сотнями TActions.Каждый из них используется и реализует различные необходимые функции.

Можно ли поймать (перехватить) все TAction.OnExecute из приложения?Есть ли какое-либо сообщение Windows, которое я могу перехватить, чтобы я мог записать имя действия, которое было выполнено?

Ответы [ 2 ]

13 голосов
/ 21 декабря 2011

Вам просто нужно добавить объект TApplicationEvents и обработать событие OnActionExecute. Обработчику событий передается экземпляр Action, поэтому он может легко получить имя действия.

Событие OnActionExecute сработает до того, как сработает событие OnExecute. Вы даже можете остановить запуск события OnExecute, установив для параметра Handled значение True в обработчике OnActionExecute.

2 голосов
/ 21 декабря 2011

Основываясь на ответе Дэвида, я привел небольшой пример:

program Project1;

uses
  ExceptionLog,
  Forms,
  Unit2 in 'Unit2.pas' {Form2},
  AppEvnts,
  Classes,
  Windows,
  SysUtils;

{$R *.res}

type TAppEventsHack = class
   procedure onAppEvtExec(Action:TBasicAction;var Handled:Boolean);
 end;

var aEvHack : TAppEventsHack;
    aAppEvents : TApplicationEvents;

{ TAppEventsHack }

procedure TAppEventsHack.onAppEvtExec(Action: TBasicAction;
  var Handled: Boolean);
begin
   OutputDebugString(PAnsiChar(Action.Name));
   Handled := False;
end;

begin
  Application.Initialize;
 try
  aEvHack := TAppEventsHack.Create;
  aAppEvents := TApplicationEvents.Create(nil);
  aAppEvents.OnActionExecute := aEvHack.onAppEvtExec;

  Application.CreateForm(TForm2, Form2);
  Application.Run;
 finally
  freeandnil(aEvHack);
  freeandnil(aAppEvents);
 end;
end.
...