C++Builder中的OnClick事件签名存在问题

Problem with OnClick event signature in C++Builder

本文关键字:存在 问题 事件 中的 OnClick C++Builder      更新时间:2023-10-16

我想创建一个函数,用另一个替换当前图像。问题是我有64张照片要替换。我创建了一个带有TImage* Sender参数的函数,但只有当我将Sender设置为TObject*时,它才能工作。

如何更改此功能:

void __fastcall TForm1::Image1Click(TObject *Sender)
{
Sender->Picture->LoadFromFile("puste.bmp");
}

进入这个

void __fastcall TForm1::Image1Click(TImage *Sender)
{
Sender->Picture->LoadFromFile("puste.bmp");
}

我正在使用VCL库。

您不能更改事件处理程序的签名。它必须是VCL期望的,在本例中由TNotifyEvent类型定义,OnClick事件声明为:

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
__property System::Classes::TNotifyEvent OnClick = {read=FOnClick, write=FOnClick, stored=IsOnClickStored};

但是,您不需要更改签名。所有VCL组件都源自TObject,而Sender参数指向单击的控件。因此,在这种情况下,您可以简单地使用类型转换来访问TImage特有的功能,例如:

void __fastcall TForm1::Image1Click(TObject *Sender)
{
static_cast<TImage*>(Sender)->Picture->LoadFromFile("puste.bmp");
}

然后,您可以将这个1处理程序分配给所有64个TImage控件。

如果需要区分不同的TImage控件,可以为此使用TImageNameTag属性。