Как программно сохранить обработчик событий и затем установить его в C ++ Builder? - PullRequest
0 голосов
/ 16 сентября 2010

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

объявить FEnterHandler и FExit Handler:

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;
        }
    }
}

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

Я не знаю много C ++ Builder, но вы не можете просто написать

TNotifyEvent FEnterHandler;
TNotifyEvent FExitHandler;

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

0 голосов
/ 16 сентября 2010

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

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

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

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

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

...