如何在TActions执行方法中转换为TMenuItem?

时间:2014-10-05 19:44:16

标签: c++builder vcl taction

我在CodeGear C ++ VCL应用程序中有许多相关的TMenuItems。

每个TMenuItem都与相同的动作(TAction)相关联。

单击MenuItem时,操作将触发(其执行方法)。

我将需要以某种方式在操作OnExecute函数中强制转换Sender参数,以确定单击了哪个menuitem。

目前我有类似的东西

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 个答案:

答案 0 :(得分: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..";
    }
}