Как привести к TMenuItem в методе TActions Execute?

У меня есть несколько связанных TMenuItems в приложении CodeGear C++ VCL.

Каждый TMenuItem связан с одним и тем же действием (TAction).

При щелчке по MenuItem запускается действие (это метод execute).

Мне нужно будет как-то привести параметр Sender в функции OnExecute действий, чтобы выяснить, какой пункт меню был нажат.

В настоящее время у меня есть что-то вроде этого

void __fastcall TMoleculixDesktopMainUnit::openMoleculeSelectionFormAExecute(TObject *Sender)
{
//User selected a menuitem under Molecules Menu

TAction* anItem = dynamic_cast<TAction*>(Sender);


//AminoAcidsMI is a TMenuItem
if(AminoAcidsMI == dynamic_cast<TMenuItem*>(anItem->Owner))
{
    //Open molecule search form with aminoacids
    MLog()<<"Looking for Amino Acids..";
}
}

Но вышеперечисленное не работает. Владельцем действий НЕ является MenuItem.

1 ответ

Решение

Использовать TAction::ActionComponent свойство, которое указывает компонент, вызвавший действие.

void __fastcall TMoleculixDesktopMainUnit::openMoleculeSelectionFormAExecute(TObject *Sender)
{
    //User selected a menuitem under Molecules Menu

    TAction* anItem = dynamic_cast<TAction*>(Sender);
    if (!anItem) return;

    AminoAcidsMI == dynamic_cast<TMenuItem*>(anItem->ActionComponent);
    if (AminoAcidsMI)
    {
        //Open molecule search form with aminoacids
        MLog()<<"Looking for Amino Acids..";
    }
}
Другие вопросы по тегам