【问题标题】:TPoupMenu Radio Item uncheched while clicking same item单击同一项目时取消选中 TPoupMenu 单选项目
【发布时间】:2014-03-03 06:05:13
【问题描述】:

我有一个弹出菜单,其中有两个收音机项目。

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 中检查发件人是否已被选中?

我认为的另一个解决方案是将 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;

这是一个正确的方法吗?

【问题讨论】:

  • 不,您必须像现在这样手动完成。菜单项的行为既不像单选组,也不像具有 AllowAllUp 的工具按钮,您可以将其设置为 False。

标签: delphi


【解决方案1】:

我会做出以下改变:

  1. AutoCheck 保留为False
  2. 为这两项设置GroupIndex。例如,将两个项目的 GroupIndex 设置为 1。这使它们成为同一组的一部分,并且在任何情况下都只能检查组中的一个。
  3. OnClick 事件处理程序更改为如下所示:

 

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

当您单击一个项目时,它将被选中,而该组的所有其他成员都未选中。假设您在显示菜单之前选中了其中一​​项,那么您将始终只有一个选中的组成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2011-04-26
    • 2014-06-30
    • 1970-01-01
    • 2017-06-29
    • 2013-05-11
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多