2011-12-21 8 views
6

Ho una grande applicazione con centinaia di TActions. Ognuno di essi viene utilizzato e implementa diverse funzionalità necessarie.Delphi - Catch all action.onexecute da un'applicazione

È possibile prendere (agganciare) tutte le TAction.OnExecute da un'applicazione? C'è un messaggio di Windows che posso collegare in modo da poter registrare il nome dell'azione che è stato eseguito?

risposta

12

È sufficiente aggiungere un oggetto TApplicationEvents e gestire l'evento OnActionExecute. Il gestore eventi viene passato l'istanza Action e così può facilmente ottenere il nome dell'azione.

L'evento OnActionExecute si attiva prima che si verifichi l'evento OnExecute. È anche possibile interrompere l'attivazione dell'evento OnExecute impostando il parametro Handled su True nel gestore di eventi OnActionExecute.

+0

grazie. +1 e accettato – RBA

+0

Solo un FYI, l'evento 'TApplication.OnActionExecute' è il secondo hook che elabora un' TAction'. Se 'TAction' è associato a' TActionList', l'evento 'TActionList.OnExecute' ottiene i primi dibs sul' TAction'. Se quel gestore eventi restituisce True, l'evento 'TApplication.OnActionExecute' NON viene attivato. –

+0

@remy grazie per averlo aggiunto –

2

in base alla risposta di David Ho fatto un piccolo esempio:

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.