Проблема с подписью события OnClick в C++ Builder

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

Решение

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

Другие вопросы по тегам