单击同一项目时,未选中TPopupMenu Radio Item

时间:2014-03-03 06:05:14

标签: delphi

我有一个poup菜单,我有两个收音机项目。

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事件并且现在名称组将被取消选中,因为没有选中该项目,所以它正在崩溃。

如果我再次选择所选项目或者是否有任何方法可以检查是否已经选择了发件人?

是否可以阻止菜单项取消选中

我认为另一个解决方案是使AutoCheck为false并具有如下所示的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;

这是正确的做法吗?

1 个答案:

答案 0 :(得分:2)

我会做出以下更改:

  1. AutoCheck保留为False
  2. 为这两个项目设置GroupIndex。例如,为这两个项目设置GroupIndex1。这使它们成为同一组的一部分,并且在任何情况下都不能检查该组中的一个。
  3. OnClick事件处理程序更改为:
  4. procedure MySelector.GroupingMenuItemClick(Sender: TObject);
    begin
      (Sender as TMenuItem).Checked := True;
      // any other logic goes here
    end;
    

    单击某个项目时,将检查该项目,并取消选中该组的所有其他成员。假设您在显示菜单之前选中了其中一​​个项目,那么您将始终只有一个已检查过的成员。