【发布时间】:2010-05-11 19:22:17
【问题描述】:
我有一个弹出菜单,其中包含多个菜单项,其中一个可以有子项。此条目右侧有一个小箭头,当您将鼠标悬停 到它上面时,将打开一个子菜单(无需单击)。现在我想在运行时填充这个 子菜单,但前提是用户实际打开它。如果用户从不打开子菜单,它将为空(可能包含占位符)。我怎么能做到这一点?是否可以在弹出菜单已经可见时对其进行修改?
感谢您的帮助!
【问题讨论】:
我有一个弹出菜单,其中包含多个菜单项,其中一个可以有子项。此条目右侧有一个小箭头,当您将鼠标悬停 到它上面时,将打开一个子菜单(无需单击)。现在我想在运行时填充这个 子菜单,但前提是用户实际打开它。如果用户从不打开子菜单,它将为空(可能包含占位符)。我怎么能做到这一点?是否可以在弹出菜单已经可见时对其进行修改?
感谢您的帮助!
【问题讨论】:
标准菜单或上下文(弹出)菜单中的子菜单没有区别:如果菜单项附加了子菜单,则其 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;
【讨论】: