2011-12-21 26 views
6

Tôi có một ứng dụng lớn với hàng trăm TActions. Mỗi người trong số họ được sử dụng và thực hiện các chức năng khác nhau cần thiết.Delphi - Bắt tất cả action.onexecute từ một ứng dụng

Có thể bắt (móc) tất cả TAction.OnExecute từ một ứng dụng? Có bất kỳ cửa sổ tin nhắn mà tôi có thể móc để tôi có thể đăng nhập tên hành động được thực hiện?

Trả lời

12

Bạn chỉ cần thêm đối tượng TApplicationEvents và xử lý sự kiện OnActionExecute. Trình xử lý sự kiện được thông qua phiên bản Action và do đó có thể dễ dàng có được tên của hành động.

Sự kiện OnActionExecute sẽ kích hoạt trước khi xảy ra sự kiện OnExecute sự kiện. Bạn thậm chí có thể ngăn sự kiện OnExecute của hành động kích hoạt bằng cách đặt tham số Handled thành True trong trình xử lý sự kiện OnActionExecute của bạn.

+0

nhờ. +1 và được chấp nhận – RBA

+0

Chỉ cần một sự kiện FYI, sự kiện 'TApplication.OnActionExecute' là móc thứ hai xử lý một' TAction'. Nếu 'TAction' được liên kết với một' TActionList', sự kiện 'TActionList.OnExecute' sẽ có các dib đầu tiên trên' TAction'. Nếu trình xử lý sự kiện đó trả về True, sự kiện 'TApplication.OnActionExecute' KHÔNG được kích hoạt. –

+0

@remy cảm ơn vì đã thêm –

2

Dựa trên câu trả lời của David Tôi đã thực hiện một ví dụ nhỏ:

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. 
Các vấn đề liên quan