Переопределить обработчик событий в C ++ Builder - PullRequest
1 голос
/ 13 июля 2010

В 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, для выполнения пользовательских функций при возникновении определенного события?

1 Ответ

1 голос
/ 28 июля 2010

Не рекомендуется для компонента назначать обработчик для своего собственного события. Это препятствует тому, чтобы внешний код использовал то же самое событие, или хуже, перезаписывая ваше назначение своим собственным, чтобы ваш пользовательский код больше не выполнялся. Вместо этого вам следует переопределить виртуальный метод 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
} 
...