2010-07-13 56 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