2008-11-06 3 views
4

본인의 신청서 양식이 있습니다. 이 양식에서는 응용 프로그램이 본질적으로 세 가지 모드로 실행되기 때문에 세 개의 TActionMainMenuBars를 배치했습니다.하나의 양식에서 여러 TActionMainMenuBar 객체로 바로 가기를 처리하려면 어떻게합니까?

메뉴 모음은 모두 주 양식의 TActionManager에 저장 (프록시) 된 작업으로 구성됩니다. ActionManager는 실제로 다양한 다른 형식의 작업 목록을 참조합니다.

메뉴 모음은 한 번에 하나씩 만 표시되도록 + 사용 및 숨김 + 사용 안 함으로 표시됩니다. Alt 키를 누른 상태에서 화살표 키나 캡션에 밑줄이 그어진 문자를 사용하여 클릭하거나 탐색 할 경우 작동하는 동작이 잘 수행됩니다.

그러나 문제는 바로 가기 키 누르기에 응답하지 않는 것 같습니다.

누가 화재를 일으키지 않는 원인인지 아는 사람이 있습니까?

필자는 필요할 경우 더 많은 정보를 기꺼이 제공 할 예정이며 WinXP SP3의 C++ 빌더 2007 RAD Studio에서 프로그래밍 중입니다.

이 글을 읽거나이 글을 읽고 해결책을 찾는 사람 덕분에!

PeterMJ

업데이트 : 나는 다른 메뉴의 바로 가기가 같은 단축키가 다른 작업에 대한 다른 메뉴에 사용되는 것을 겹쳐 있지만, 모든 바로 가기가 자신의 메뉴에 고유 한 것을 언급하지 못했습니다.

또한 테스트 응용 프로그램에서 두 개의 TActionMainMenuBars를 사용하여 문제를 단순화했으며 모든 작업이 단일 작업 관리자를 공유했습니다. 이 경우 동일한 단축키로 두 가지 동작이 있습니다. 그들은 다른 메뉴에 배치됩니다. 그런 다음 한 번에 하나의 메뉴 만 활성화됩니다. 이 경우 단축키가 작동하지만 일반적인 단축키를 사용하는 경우 보류 메뉴가 비활성화되어있는 경우 심지어의 첫 번째 메뉴에있는 작업 만 실행됩니다.

일부 동작은 실행되지만 동작이 올바르게 트리거되지 않는다는 점이 실제 문제보다 약간 낫습니다. 누구도 해결책이 없습니까?

+0

죄송합니다. 아래 표를 클릭하여 잘못된 지점을 클릭하십시오! –

답변

0

사용하려는 동작이 실제로 활성화되어 있는지 확인하십시오.
막대를 비활성화 할 때 ActionMainMenuBar 내의 모든 동작을 비활성화하면 문제가 발생합니다.
Windows 글로벌 바로 가기와 충돌하지 않고 사용 가능한 바로 가기를 사용해야합니다.
그 외에는 왜 작동하지 않을지 모르겠다. Delphi에서 ActionMainMenuBars 2 개를 시도해 보았습니다. 단축키가 작동했습니다.

+0

시도해 주셔서 감사합니다. 단일 동작 관리자에 두 개의 메뉴 모음과 동작이있는 테스트 응용 프로그램을 작성하라고했습니다. 업데이트에서 알 수 있듯이 이것 역시 작동하지 않습니다. –

2

ActioneMenuBar의 활성화/비활성화 또는 표시/숨기기는 메뉴 모음에서의 작업에 아무런 영향을 미치지 않습니다. 특정 컨텍스트/상황에서 사용할 수없는 작업을 수행하려는 경우 작업 자체 또는 작업 목록 또는 해당 작업 관리자의 "OnUpdate"이벤트를 구현해야합니다.

예를 들어 다음과 같은 작업 관리자의 OnUpdate 이벤트를 사용하면 TCheckBox를 사용하여 현재 활성화 된 두 가지 동작을 결정할 수 있습니다.

if CheckBox1.Checked then 
    begin 
    Action1.Enabled:= False; 
    Action2.Enabled:= True; 
    end 
    else 
    begin 
    Action1.Enabled:= True; 
    Action2.Enabled:= False; 
    end; 

상상, 모두의 행동이 할당 된 단축키 "Ctrl + A"가,이 CheckBox1을 선택하지 않은 경우 누르면 Ctrl + A는 조치 1을 활성화 것을 의미합니다.

그러나 여전히 문제가 있습니다. VCL은 발견 된 작업이 활성화되지 않은 경우에도 현재 서식의 작업 관리자 또는 작업 목록에 바로 가기가 포함 된 작업을 찾으면 특정 바로 가기로 작업을 찾는 것을 중지합니다. CheckBox1을 경우 Ctrl + A는, 조치 2를 활성화 누르면,이 코드를 사용하여

if CheckBox1.Checked then 
    begin 
    Action1.Enabled:= False; 
    Action1.ShortCut:= scNone; 

    Action2.Enabled:= True; 
    Action2.ShortCut:= ShortCut(ord('A'), [ssCtrl]); 
    end 
    else 
    begin 
    Action2.Enabled:= False; 
    Action2.ShortCut:= scNone; 

    Action1.Enabled:= True; 
    Action1.ShortCut:= ShortCut(ord('A'), [ssCtrl]); 
    end; 

:

이 문제를 해결하기 위해, 당신은 동적으로 설정하는의 OnUpdate 이벤트를 사용하여이 같은 행동의 바로 가기 속성을 재설정 할 수 있습니다 CheckBox1이 선택되지 않은 경우 Action1을 활성화하고 활성화합니다. 작업 목록 또는 작업 관리자의 OnUpdate 이벤트를 명시 적으로 호출 할 필요가 없습니다. 이 이벤트는 응용 프로그램이 유휴 상태이고 사용자 입력을 기다리는 동안 정기적으로 발생합니다.

관련 문제