1

Codegear C++ Builder で、TMemo VCL クラスを拡張して、OnKeyDown イベント中にいくつかの機能を実行しようとしています。コントロールを設定し、フォームなどに追加できるようになりました。問題は、OnKeyDown イベント (またはその他のイベント) をキャプチャできないことです。

これが私のクラスです:

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 クラスから派生したクラスをどのように設定して、特定のイベントが発生したときにカスタム関数を実行するかということだと思います。

4

1 に答える 1

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
} 
于 2010-07-28T19:53:36.693 に答える