动态的生成了一组panel控件,如何让任一个控件响应鼠标事件
编号:QA004207
建立日期: 2001年5月21日 最后修改日期:2001年5月21日
所属类别:
qsh:
本问题涉及的操作系统:
winme
本问题涉及的编程工具:
bcb4
遇到的问题:
我的问题是这样的,例如动态的生成了一组panel控件,如何让任一个控件响应鼠标事件?例如点击任一个panel时,panel的Color属性改变。谢谢:)
回答:
在BCB中,你应该了解事件这个含义,BCB中的事件其实是一个函数指针,你可以在任何时候,任何地方改变其值,改变之后,所有的该事件均在新的函数中执行,多个对象只要它的事件类型与你的事件接收函数的定义相符,那么所有这些对象的所有相符的事件都可以共同指向你的事件接收函数,这就是BCB中事件要优于WIDNOWS MESSAGE的地方。
要识别是哪个对象发起的可以采取以下方法:
1。如果你要识别哪类对象,dynamic_cast可用来解决。
2。如果你要识别哪个对象你得为每个对象定义一个唯一标志,如果你的类是从TComponent继承过来的话,Tag属性可以起作用。在事件接收函数中,用方法一得到该对象,再判断唯一标志是不是你要的。
你的问题可以如下解决:
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
void __fastcall PanelsClick(TObject* Sender);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
// 类实现文件
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Width=800;
Height=600;
for(int i=0;i<19;i++)
for(int j=0;j<14;j++){
TPanel* p=new TPanel(this);
p->Parent=this;
p->SetBounds(i*40,j*40,40,40);
p->OnClick=PanelsClick;
}
}
void __fastcall TForm1::PanelsClick(TObject* Sender){
// 将事件发起的控件(Sender)转换成TPanel,如果转换成功,则改变其颜色
TPanel* p=dynamic_cast(Sender);
if(p!=NULL)
p->Color=p->Color==clRed?clBlue:clRed;
}
此问题由赵生回答。
| |
|
|
| |
|
|