在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类派生的类,以便在某个事件触发时执行自定义函数?
答案 0 :(得分: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
}