Как я могу программно сохранить обработчик событий, а затем установить его в С++ Builder?

100
14

Мне нужно временно удалить события TFrame OnExit и OnEnter, поэтому я пытаюсь сделать следующее:


объявить FEnterHandler и обработчик FExit:


private:
// ...
TControl *FParentControl;
(__fastcall *(__closure)(TObject*))(TObject*) FEnterHandler;
(__fastcall *(__closure)(TObject*))(TObject*) FExitHandler;
// ...

и я намеревался использовать их как напечатанные вниз, но компиляция завершилась неудачей при объявлении.


__fastcall TProgressForm::TProgressForm(TComponent *O, TControl *PC)
: TForm(O), FMapProgressData()
{
FParentControl = PC;
if (FParentControl)
{
TFrame *frame = dynamic_cast<TFrame*>(FParentControl);
if (frame)
{
FEnterHandler = frame->OnEnter;
FExitHandler = frame->OnExit;
frame->OnEnter = 0;
frame->OnExit = 0;
}
FParentControl->Enabled = false;
}
}
//-------------------------------------------------------------------------
__fastcall TProgressForm::~TProgressForm()
{
if (FParentControl)
{
FParentControl->Enabled = true;
TFrame *frame = dynamic_cast<TFrame*>(FParentControl);
if (frame)
{
frame->OnEnter = FEnterHandler;
frame->OnExit = FExitHandler;
}
}
}

Что я делаю неправильно?

спросил(а) 2010-09-16T16:04:00+04:00 10 лет назад
1
Решение
80

Я мало знаю С++ Builder, но не могу просто написать


TNotifyEvent FEnterHandler;
TNotifyEvent FExitHandler;

? Хорошо выглядит намного и менее подвержен ошибкам.

ответил(а) 2010-09-16T16:18:00+04:00 10 лет назад
41

Я бы добавил свой собственный ответ, потому что нашел, что typedef из справки довольно странно:


typedef void _fastcall (__closure *TNotifyEvent)(System::TObjectTObject Sender)

и написано другое, более понятное.

typedef void (__closure __fastcall *TEventHandler)(TObject*);
//typedef TNotifyEvent TEventHandler;
TEventHandler FEnterHandler;
TEventHandler FExitHandler;

Конечно, я рекомендую использовать TNotifyEvent, это действительно лучше.

ответил(а) 2010-09-16T16:36:00+04:00 10 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема