1

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

4

1 回答 1

1

您不能更改事件处理程序的签名。它必须是 VCL 所期望的,在这种情况下由TNotifyEvent类型定义,OnClick事件被声明为:

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);

__property System::Classes::TNotifyEvent OnClick = {read=FOnClick, write=FOnClick, stored=IsOnClickStored};

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

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

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

如果你需要区分不同的TImage控件,你可以使用TImage's NameorTag属性来达到这个目的。

于 2020-07-08T18:10:55.983 回答