我想创建一个函数,用另一个替换当前图像。问题是我要替换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属性。

关于c++ - C++ Builder中的OnClick事件签名问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62800940/

10-11 04:36