Проблема с подписью события 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
собственность для этой цели.