2011-08-25 28 views
1

使用我需要掛鉤到在C++ Builder中的應用程序屬性「OnDeactivate」創建TNotifyEvent在C++中。所以我需要編寫自己的函數來在OnDeactivate事件觸發應用程序時運行,但我不知道在哪裏或如何定義該函數。理想情況下,我想我的代碼看起來是這樣的:在應用層面

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 
{ 
    try 
    { 
    Application->Initialize(); 
    Application->OnDeactivate = myFunction; 
    Application->Run(); 
    } 

後:

void myFunction(TObject *Sender) 
{ 
//Do Stuff 
} 

當我寫它像這樣在我的cpp文件但它抱怨說,它不能將「無效(* )(TObject *)to TNotifyEvent。如果我改變我的函數返回類型TNotifyEvent(它不應該工作),它會給出「不能轉換'TNotifyEvent'爲'TNotifyEvent'」的熱鬧錯誤。我開始寫一個函數來掛鉤我的應用程序屬性?

回答

2

您試圖分配一個獨立的函數,其中非靜態類的方法來代替預期。你有兩個選擇:

1)將您的事件處理程序到一個輔助類:

class Helper 
{ 
public: 
    void __fasycall myFunction(TObject *Sender) 
    { 
     ... 
    } 
}; 

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 
{ 
    try 
    { 
     Application->Initialize(); 

     Helper helper; 
     Application->OnDeactivate = &helper.myFunction; 
     ... 
    } 
    ... 
} 

2)離開此功能作爲非類函數,但給它一個額外的參數來接收編譯器的this指針,然後用TMethod結構,以幫助您將它傳遞給事件作爲一個合適的TNotifyEvent

void __fasycall myFunction(void *pThis, TObject *Sender) 
{ 
    ... 
} 

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 
{ 
    try 
    { 
     Application->Initialize(); 

     TMethod m; 
     m.Data = NULL; // passed to the pThis parameter, can be whatever you want 
     m.Code = &myFunction; 
     Application->OnDeactivate = reinterpret_cast<TNotifyEvent&>(m); 
     ... 
    } 
    ... 
} 

隨着中說,TApplication::Run()將立即退出,如果MainForm中沒有分配,所以simpliest解決方法就是刪除一個TApplicationEvents組件到您的MainForm,然後你可以在設計時分配OnDeactivate事件處理它。

0

你幾乎就是這樣。

我所做的就是創建一個包含各種不同的操作TActionList。我創建了一個會在形式的OnCreate事件中調用此代碼的作用:

void __fastcall TForm1::onCreateActionExecute(TObject *Sender) 
{ 
Application->OnDeactivate = MyAppDeactivate; 
} 

,然後添加一個小測試功能,以我的方式:

void __fastcall MyAppDeactivate(TObject *Sender) { ShowMessage("Deactivate"); }; 

,就是這樣。

+0

你說,你想讓它呼籲**形式的** OnCreate事件,但我已經知道該怎麼做。我不想鉤住Form事件,而是像我說的一樣應用程序事件。 – user912447