【问题标题】:Override event handler in C++ Builder在 C++ Builder 中覆盖事件处理程序
【发布时间】:2010-07-13 17:50:13
【问题描述】:

在 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 类派生的类以在某个事件触发时执行自定义功能?

【问题讨论】:

  • 没关系。显然,我做对了。尽管反复重新编译,Codegear 并没有将我的更新合并到我的测试控制中。无论如何,它现在有效。在这个职位上采取什么适当的步骤?我应该投票赞成删除吗?

标签: c++ event-handling c++builder vcl tmemo


【解决方案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
} 

【讨论】:

  • 感谢您的信息!我绝对需要在我的设计中投入更多的心思。我会做出这些改变。
猜你喜欢
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多