2010-05-27 94 views
1

任何人都知道如何在MDI應用程序中合併具有相同名稱的兩個菜單。如何在MDI應用程序中合併兩個菜單

更確切地說,在MDI主窗體中,我有一個名爲'文件'的菜單,其中有一個名爲'Load project'的子菜單。 在MDI子窗體中,我有一個名爲「文件」的菜單,其中包含一個名爲「保存項目」的子菜單。

如何強制我的應用程序在「文件」菜單下顯示「加載」和「保存」子菜單?

-

PS:設置相同的GoupIndex值將不起作用。

回答

1

要合併你的菜單使用此過程:

procedure MergeMenus(var SrcMenu, DstMenu: TMainMenu); 
var 
    i, i2, i3: Integer; 
    Menu: TMenuItem; 
begin 
    for i := 0 to SrcMenu.Items.Count - 1 do 
    begin 
    for i2 := 0 to DstMenu.Items.Count - 1 do 
    begin 
     if (SrcMenu.Items[i].Name = DstMenu.Items[i2].Name) and 
     (SrcMenu.Items[i].Count > 0) and (DstMenu.Items[i].Count > 0) then 
     begin 
     for i3 := 0 to SrcMenu.Items[i].Count - 1 do 
     begin 
      Menu := TMenuItem.Create(DstMenu.Owner); 
      // copy another properties if necessery 
      Menu.Name := SrcMenu.Items[i].Items[i3].Name; 
      Menu.Caption := SrcMenu.Items[i].Items[i3].Caption; 
      Menu.ShortCut := SrcMenu.Items[i].Items[i3].ShortCut; 
      Menu.OnClick := SrcMenu.Items[i].Items[i3].OnClick; 
      DstMenu.Items[i].Add(Menu); 
     end; 
     end; 
    end; 
    end; 
end; 

調用它在你的MDIChildForm像這樣OnCreate事件:

procedure TMDIChild.FormCreate(Sender: TObject); 
begin 
    MergeMenus(YourMainForm.MainMenu1, Self.MainMenu1); 
end; 

它會工作,如果兩個不同的MainMenus將與的MenuItems一樣的名字。另外請注意,如果您的DstMenu沒有擁有者(但我想它有,並且它是您的MDICHildForm),那麼可能會有記憶韭菜。

1

手動合併是調用FormMain.MainMenu.Merge(SubForm.MainMenu)及其對應FormMain.MainMenu.UnMerge(SubForm.MainMenu)的問題。

雖然你不需要它,因爲如果窗體的FormStyles被正確設置爲fsMDIForm和fsMDIChild,那麼菜單合併應該是自動的。

話雖如此,我不確定你想要什麼可能使用內置菜單合併。

根據GroupIndex幫助(和幾個實驗),來自子項的菜單項形式爲用相同的GroupIndex替換主窗體上的項。只有在子窗體上的菜單項的GroupIndex位於主窗體上的GroupIndex值之間時,纔會插入菜單。所以,您的子窗體上的文件菜單將始終替換主窗體上的文件菜單。只有當你給文件菜單的不同的組索引值,主窗體的文件菜單仍然存在,但你有兩個文件菜單的...

所以,我認爲唯一的解決方案是插入和刪除菜單項或者始終將它們放在主菜單上,並根據活動的MDIChild啓用/禁用它們。可能甚至顯示/隱藏它們。

就我個人而言,我會選擇讓他們在所有的時間,並根據活躍的MDIChild啓用/禁用它們,因爲我不喜歡菜單項「反彈」(改變位置)。

+0

*「子窗體中的菜單項將使用相同的GroupIndex替換主窗體上的項目」*。所以,從字面上看,Delphi中的菜單合併不能合併菜單。 *嘆息* – 2014-03-14 19:18:58

+1

@IanBoyd:事實上,主菜單合併是不可能的,因爲你會直覺地想要它的工作方式。不幸的是,在他們所有的智慧中,VCL設計師已經將大多數方法保持爲私有的或非虛擬的,使得擴展不可能或者是真正的PITA。 – 2014-03-14 19:36:54

相關問題