2014-10-05 2 views
0

CodeGear C++ VCL 응용 프로그램에 관련 TMenuItems가 많이 있습니다.TAenuItem에 캐스팅하는 방법 메서드를 실행 하시겠습니까?

각 TMenuItem은 동일한 동작 (TAction)과 연결됩니다.

MenuItem을 클릭하면 액션이 실행됩니다 (해당 execute 메소드).

액션 OnClick 함수에서 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을하지 않는 행동을 작동하지 않습니다.

+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

멋지다! 분명한 답변을 주셔서 감사합니다! –

관련 문제