繁体   English   中英

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

[英]Problem with OnClick event signature in C++Builder

我想创建一个 function 用另一个替换当前图像。 问题是我要替换 64 张图片。 我创建了一个带有TImage* Sender参数的 function 但它仅在我将Sender设置为TObject*时才有效。

如何更改此 function:

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属性来达到此目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM