2014-03-03 2 views
1

두 개의 라디오 항목이있는 전화기 메뉴가 있습니다.TPoupMenu 동일한 항목을 클릭하는 동안 라디오 항목이 선택 취소되었습니다.

procedure MySelector.CreatePopup; 
begin 
    FGroupingMenu := TPopupMenu.Create(Self); 
    FGroupingMenu.Name := 'FGroupingMenu'; 
    FGroupingMenu.OnPopup := GroupingMenuItemPopup; 

    FmnuNameGroup := TMenuItem.Create(Self); 
    FmnuNameGroup.Name := 'mnuNameGroup'; 
    FmnuNameGroup.AutoCheck := True; 
    FmnuNameGroup.Caption := '&Name Group'; 
    FmnuNameGroup.RadioItem := True; 
    FmnuNameGroup.OnClick := GroupingMenuItemClick; 
    FGroupingMenu.Items.Add(FmnuNameGroup); 

    FmnuAge := TMenuItem.Create(Self); 
    FmnuAge .Name := 'mnuAge'; 
    FmnuAge .AutoCheck := True; 
    FmnuAge .Caption := '&Age Group'; 
    FmnuAge .RadioItem := True; 
    FmnuAge .OnClick := GroupingMenuItemClick; 
    FGroupingMenu.Items.Add(FmnuAge); 
end; 

그리고 OnClick 이벤트는 처음에 그룹을 선택하고 내가 다시 같은 항목을 클릭하면 OnClick 이벤트가 호출 이름의 그룹이 현재 선택되지 않은 및 없음 이후가됩니다 이름을 경우 문제가

procedure MySelector.GroupingMenuItemClick(Sender: TObject); 
begin 
    if FmnuNameGroup.Checked then 
    grp:= sgName 
    else if FmnuAge .Checked then 
    grp := sgAge 
    else 
    Assert(False, 'MySelector.GroupingMenuItemClick: Unknown MenuItem'); 
end; 

입니다 항목의 충돌이 확인되었습니다.

내가 선택한 항목을 다시 선택하거나 보낸 사람이 이미 항목을 선택했는지 여부를 확인할 수있는 방법이없는 경우 메뉴 항목이 선택 취소되지 않도록 하시겠습니까?

내가 생각했던 또 다른 해결책은 자동 검사가 false하고

procedure MySelector.GroupingMenuItemClick(Sender: TObject); 
var 
    mnuItem : TMenuItem; 
begin 

    mnuItem := sender as TMenuItem; 
    if mnuItem.Name = 'mnuNameGroup' then 
    begin 
    grp:= sgName 
    FmnuNameGroup.Checked := true; 
    end 
    else if mnuItem.Name = 'mnuAge' then 
    begin 
    grp := sgAge 
    FmnuAge.Checked := true; 
    end 
    else 
    Assert(False, 'MySelector.GroupingMenuItemClick: Unknown MenuItem'); 
end; 

이것이 올바른 접근 방식인가 아래와 같이 OnClick 이벤트 핸들러를 가지고있다?

+0

아니요, 수동으로 수행해야합니다. 메뉴 항목은 라디오 그룹처럼 행동하지 않으며 AllowAllUp이있는 도구 버튼도 False로 설정할 수 없습니다. –

답변

2

나는 다음과 같이 변경합니다 :

  1. FalseAutoCheck 둡니다.
  2. 이 두 항목에 대해 GroupIndex을 설정하십시오. 예를 들어 두 항목 모두 GroupIndex ~ 1으로 설정하십시오. 이것은 그것들을 같은 그룹의 일부로 만들고 어떤 경우에도 하나의 그룹 만 검사 할 수 있습니다.
  3. 이처럼하는 OnClick 이벤트 핸들러를 변경
  4. :  

    procedure MySelector.GroupingMenuItemClick(Sender: TObject); 
    begin 
        (Sender as TMenuItem).Checked := True; 
        // any other logic goes here 
    end; 
    

    당신이 항목을 클릭

, 그것은 확인되고, 그 그룹의 다른 모든 구성원이되지 않은 있습니다. 메뉴를 표시하기 전에 항목 중 하나를 선택했다고 가정하면 항상 그룹의 한 구성원 만 체크 표시됩니다.

관련 문제