Проблема с подписью события OnClick в C ++ Builder - PullRequest
0 голосов
/ 08 июля 2020

Я хотел бы создать функцию, которая заменяет текущее изображение другим. Проблема в том, что мне нужно заменить 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.

1 Ответ

0 голосов
/ 08 июля 2020

Вы не можете изменить подпись обработчика события. Это должно быть то, что ожидает 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 указывает на элемент управления, который был нажат. Итак, в этом случае вы можете просто использовать приведение типа для доступа к функциям, которые указаны с c до TImage, например:

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

Затем вы можете назначить этот 1 обработчик всем 64 из ваши элементы управления TImage.

Если вам нужно различать разные элементы управления TImage, вы можете использовать для этой цели свойство TImage Name или Tag.

...