簡體   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