2014-03-03 40 views
1

我有一个poup菜单,我有两个无线电项目。TPoupMenu无线电项目uncheched当点击相同的项目

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事件是

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; 

的问题是,如果集团被选中,如果我再次点击同一项目,OnClick事件被称为和名称组现在成为选择,而因为没有最初的名字该项目被检查它正在崩溃。

是否有反正,以防止菜单项取消选中,如果我再次选择所选项目或有任何方法检查onclick发件人是否已被选定的项目?

另一种解决方案我认为是让自动检查错误,并有OnClick事件处理程序像下面

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; 

这是一个正确的做法?

+0

不,你必须像你一样手动进行。菜单项的行为不像收音机组,也不像工具按钮那样具有可以设置为False的AllowAllUp。 –

回答

2

我会做如下修改:

  1. 离开AutoCheckFalse
  2. 设置这两个项目的GroupIndex。例如,为两个项目设置GroupIndex1。这使得它们成为同一组的一部分,并且在任何情况下都可以检查组中的最多一个组。
  3. 更改OnClick事件处理程序是这样的:

 

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

当你点击一个项目,它会被检查,该组的所有其他成员都选中。假设您在显示菜单之前检查了其中一个项目,您将始终只有一个已选中的成员。