2010-05-11 98 views
4

我有一个弹出菜单,其中包含几个菜单项,其中一个可以有子项目。此条目右侧有一个小箭头,当您将鼠标悬停在其上时,子菜单将打开(无需点击)悬停。现在,我想在运行时填充此子菜单,但仅限于用户实际打开它时。如果用户从不打开子菜单,则它将为空(可能包含占位符)。我怎么能做到这一点?当它已经可见时,甚至可以修改弹出式菜单吗?如何检测弹出菜单的子菜单弹出(以及如何动态填充它)?

感谢您的帮助!

回答

10

标准菜单或上下文(弹出)菜单中的子菜单没有区别:如果菜单项具有附加的子菜单,那么其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; 
+0

但我不点击...我将鼠标悬停和它打开。没有点击。 (我编辑了这个问题,以更好地反映这一点) – 2010-05-11 11:09:01

+0

我没说你需要点击。你会试试吗? – mghie 2010-05-11 11:17:56

+1

哇,这个作品!对不起先不试,我认为这是对点击项目的误解。但徘徊实际上会引发OnClick!谢谢! – 2010-05-11 11:21:11