2014-10-05 2 views
0

У меня есть ряд связанных TMenuItems в приложении VCL CodeGear C++.Как применить метод TMenuItem в методах выработки Tаксий?

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

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

Мне нужно каким-то образом отбросить параметр 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.

+0

Ваш 'TAction.Execute' должен сделать одно: он должен обрабатывать код, который имеет дело с' AminoAcidsMI' и любыми другими элементами управления, которые выполняют те же функции. Тогда не имеет значения, какой из них используется, так как все они достигнут одной и той же точки исполнения. (Действия предназначены для присоединения к нескольким элементам управления, таким как пункты меню, кнопки панели инструментов, всплывающие меню и т. Д., Поэтому ни один элемент управления не может «владеть» действием.) –

ответ

2

Используйте свойство 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.."; 
    } 
} 
+0

Отлично! Спасибо за четкий ответ! –

Смежные вопросы