代码之家  ›  专栏  ›  技术社区  ›  Heinrich Ulbricht

如何检测弹出菜单的子菜单弹出(以及如何动态填充)?

  •  4
  • Heinrich Ulbricht  · 技术社区  · 15 年前

    我有一个包含多个菜单项的弹出菜单,其中一个可以有子项。这个条目的右边有一个小箭头, 悬停 鼠标放在上面,会打开一个子菜单(不点击)。现在我要填充这个 子菜单 在运行时,但仅当用户实际打开它时。如果用户从未打开子菜单,则它将为空(可能包含占位符)。我怎么能做到?当弹出菜单已经可见时,是否可以修改它?

    谢谢你的帮助!

    1 回复  |  直到 15 年前
        1
  •  10
  •   mghie    15 年前

    标准菜单或上下文(弹出)菜单中的子菜单之间没有区别:如果菜单项附加了子菜单,则其 OnClick 事件将在子菜单显示之前触发(请注意,不需要单击它即可显示),在该事件处理程序中,您可以修改子菜单(设置现有项的属性,或添加新项/删除现有项)。

    一些关于动态添加和删除项目的演示代码:

    procedure TForm1.FormCreate(Sender: TObject);
    var
      Popup: TPopupMenu;
      Item, SubItem: TMenuItem;
    begin
      Popup := TPopupMenu.Create(Self);
      PopupMenu := Popup;
      Item := TMenuItem.Create(Popup);
      Item.Caption := 'Test submenu';
      Item.OnClick := PopupClick;
      Popup.Items.Add(Item);
    
      SubItem := TMenuItem.Create(Item);
      SubItem.Caption := 'dummy';
      Item.Add(SubItem);
    end;
    
    procedure TForm1.PopupClick(Sender: TObject);
    var
      SubmenuItem, Item: TMenuItem;
    begin
      SubmenuItem := Sender as TMenuItem;
      // delete old items (leave at least one to keep the submenu)
      while SubmenuItem.Count > 1 do
        SubmenuItem.Items[SubmenuItem.Count - 1].Free;
      // create new items
      while SubmenuItem.Count < 3 do begin
        Item := TMenuItem.Create(SubmenuItem);
        Item.Caption := Format('new item created %d', [GetTickCount]);
        SubmenuItem.Add(Item);
      end;
    end;