2010-05-11 97 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