2010-07-13 91 views
1

在Codegear C++ Builder中,我試圖擴展TMemo VCL類以在OnKeyDown事件期間執行某些功能。我已經建立了控制並能夠將它添加到表單等等。問題是我無法捕獲OnKeyDown事件(或任何其他事件,就此而言)。覆蓋C++ Builder中的事件處理程序

這裏是我的類:

class PACKAGE TREMemoFind : public TMemo 
{ 
private: 
    TFindDialog *FindDialog; 

protected: 
    void __fastcall MemoKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); 

public: 
    __fastcall TREMemoFind(TComponent* Owner); 

__published: 
}; 


__fastcall TREMemoFind::TREMemoFind(TComponent* Owner) : TMemo(Owner) 
{ 
    ScrollBars = ssVertical; 
    OnKeyDown = MemoKeyDown; 
} 

void __fastcall TREMemoFind::MemoKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) 
{ 
    ShowMessage("It worked!"); 
} 

所以,我想我的問題是:我怎麼設置,我從VCL類派生執行自定義功能,當某一事件觸發類?

+0

沒關係。顯然,我做的是正確的事情。儘管反覆重新編譯,Codegear並沒有將我的更新整合到我的測試控件中。無論如何,它現在起作用。 採取這個職位的適當步驟是什麼?我應該投票刪除嗎? – 2010-07-13 18:34:13

回答

1

組件將處理程序分配給自己的事件不是一個好主意。這可以防止外部代碼使用同一個事件,或者更糟糕的是用自己的代碼覆蓋您的任務,因此您的自定義代碼不再運行。相反,你應該做的是重寫虛擬KeyDown()方法,即:

class PACKAGE TREMemoFind : public TMemo 
{ 
protected: 
    virtual void __fastcall KeyDown(WORD &Key, TShiftState Shift); 

public: 
    __fastcall TREMemoFind(TComponent* Owner); 
}; 


__fastcall TREMemoFind::TREMemoFind(TComponent* Owner) : TMemo(Owner) 
{ 
    ScrollBars = ssVertical; 
} 

void __fastcall TREMemoFind::KeyDown(WORD &Key, TShiftState Shift) 
{ 
    ShowMessage("It worked!"); 
    TMemo::KeyDown(Key, Shift); // fire public OnKeyDown event 
} 
+0

感謝您的信息!我絕對需要在設計中多加思考。我會做出這些改變。 – 2010-08-02 14:20:32