C++Builder 中的 OnClick 事件签名问题
Problem with OnClick event signature in C++Builder
我想创建一个用另一个图像替换当前图像的函数。问题是我有 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
type, which is what the 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
控件,您可以使用 TImage
的 Name
或 Tag
属性 来达到此目的。
我想创建一个用另一个图像替换当前图像的函数。问题是我有 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
type, which is what the 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
控件,您可以使用 TImage
的 Name
或 Tag
属性 来达到此目的。