Как сделать так, чтобы все элементы в многоуровневом PopupMenu работали как одна радиогруппа?

У меня есть PopupMenu с подменю, и за раз должен проверяться только один элемент. Насколько я пробовал, свойства GroupIndex и RadioItem не работают вне соответствующих подменю.

Я нашел эту часть кода для проверки PopupMenu и его прямых подкомпонентов, но мне не повезло с создание множества всплывающих окон. Мне нужно быстрое решение - PopupMenu имеет записи 4x14, постоянное повторение всех меню и подзаписей, я полагаю, не может быть лучшим решением для этого.

Есть ли для этого простое свойство, которое мне не хватает, или мой единственный вариант - каменистый путь итерации?


person Ben    schedule 20.06.2012    source источник


Ответы (2)


Добавьте все 56 элементов в качестве действий в один список действий и присвойте всем GroupIndex свойствам одинаковое значение.

Теперь добавьте пункты меню, подменю и под-подменю любым древовидным способом и свяжите каждый из них с действием. Отметка одного пункта меню, где бы он ни располагался, автоматически снимает отметку со всех остальных.

И вуаля!

person NGLN    schedule 20.06.2012

ответ NGLN лучше, но если вы действительно не хотите или не хотите использовать 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;
person NGLN    schedule 20.06.2012