2011-12-21 61 views
6

我有一個很大的應用程序與數百個TA。它們中的每一個都被使用並實現所需的不同功能。德爾福 - 抓住所有action.onexecute從一個應用程序

從應用程序中捕獲(掛接)所有TAction.OnExecute是可能的嗎?有沒有我可以掛鉤的Windows消息,以便我可以記錄已執行的動作名稱?

回答

12

您只需添加一個TApplicationEvents對象並處理OnActionExecute事件。事件處理程序通過Action實例,因此可以輕鬆獲取操作的名稱。

OnActionExecute事件將在操作的OnExecute事件觸發之前觸發。您甚至可以通過在OnActionExecute事件處理程序中將參數Handled設置爲True來停止發起的動作OnExecute事件。

+0

感謝。 +1並且接受 – RBA 2011-12-21 10:45:45

+0

只是一個參考,「TApplication.OnActionExecute」事件是處理「TAction」的第二個鉤子。如果「TAction」與「TActionList」相關聯,則「TActionList.OnExecute」事件首先在「TAction」上獲得dib。如果該事件處理程序返回True,則不會觸發TApplication.OnActionExecute事件。 – 2011-12-21 18:44:51

+0

@remy謝謝你的補充 – 2011-12-21 18:48:04

2

基於大衛的答案,我做了一個小例子:

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.