如何让多级PopupMenu中的所有项目充当一个放射组?

时间:2012-06-20 19:59:54

标签: delphi submenu radio-group popupmenu

我有一个带子菜单的PopupMenu,一次只能检查一个项目。就我所尝试而言,GroupIndexRadioItem属性在相应的子菜单之外无效。

我找到了this piece of code来检查PopupMenu及其直接的子组件,但我没有运气创建一个弹出式的各种各样的。 我需要一个快速的解决方案 - PopupMenu有4x14条目,总是遍历所有菜单,子条目不能是最好的解决方案,我想。

我是否缺少一个简单的属性,或者是迭代的艰难路径是我唯一的选择?

2 个答案:

答案 0 :(得分:8)

将所有56项作为操作添加到一个 ActionList,并为所有GroupIndex属性提供相同的值。

现在,以任何树状方式添加菜单项,子菜单和子子菜单,并将它们中的每一个链接到一个动作。检查一个菜单项,无论位于何处,都将自动取消选中所有其他菜单项。

Etvoilà!

答案 1 :(得分:2)

NGLN's answer更好,但如果你真的不想或不想使用ActionList,那么这个例程也会这样做:

procedure CheckMenuItem(Item: TMenuItem);

  procedure UncheckMenu(Menu: TMenuItem; GroupIndex: Byte);
  var
    I: Integer;
  begin
    if Menu.RadioItem and (Menu.GroupIndex = GroupIndex) then
      Menu.Checked := False;
    for I := 0 to Menu.Count - 1 do
      UncheckMenu(Menu[I], GroupIndex);
  end;

begin
  if (not Item.Checked) and Item.RadioItem and (Item.GroupIndex <> 0) then
  begin
    UncheckMenu(Item.GetParentMenu.Items, Item.GroupIndex);
    Item.Checked := True;
  end;
end;