Как объединить два меню в MDI-приложении

Кто-либо знает, как объединить два меню с тем же именем в MDI-приложении.

Более точно в MDI основная форма у меня есть меню под названием 'Файл', который имеет подменю, названное 'Проект загрузки'. В дочерней форме MDI мне назвали меню также 'Файл', который содержит подменю, названное, 'Сохраняют проект'.

Как я могу вынудить свое приложение показать оба подменю 'Load' и 'Save' в соответствии с меню 'File'?

-

PS: устанавливание того же значения GoupIndex не будет работать.

1
задан RRUZ 27 May 2010 в 20:29
поделиться

2 ответа

Чтобы объединить ваши меню, используйте эту процедуру:

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;

Вызовите его в событии OnCreate вашего MDIChildForm следующим образом:

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

Это будет работать, если два разных MainMenus будут иметь MenuItems с одинаковым именем . Также обратите внимание, что есть вероятность утечки памяти, если у вашего DstMenu нет владельца (но я думаю, что он есть, и это ваш MDICHildForm).

1
ответ дан 3 September 2019 в 00:15
поделиться

Ручное объединение - это вопрос вызова FormMain.MainMenu.Merge(SubForm.MainMenu) и его аналога FormMain.MainMenu.UnMerge(SubForm.MainMenu).

Однако это не должно вам понадобиться, потому что если FormStyles ваших форм правильно установлены на fsMDIForm и fsMDIChild, то слияние меню должно происходить автоматически.

Сказав это, я не уверен, что то, что вы хотите, возможно с помощью встроенного объединения меню.

Согласно справке по GroupIndex (и паре экспериментов), пункты меню из дочерних форм заменяют пункты на главной форме с тем же GroupIndex. Только когда GroupIndex пункта меню на дочерней форме попадает между значениями GroupIndex на главной форме, меню будет вставлено. Таким образом, меню File на дочерней форме всегда будет заменять меню File на главной форме. Только если вы зададите меню File разные значения GroupIndex, меню File главной формы останется, но тогда у вас будет два меню File...

Итак, я думаю, что единственным решением будет вставлять и удалять пункты меню подформы вручную, или иметь их в главном меню все время и включать/выключать их в зависимости от активного MDIChild. Возможно, даже показывать/скрывать их.

Лично я бы выбрал вариант, когда они постоянно находятся рядом и включаются/выключаются в зависимости от активного MDIChild, поскольку мне не нравятся пункты меню, которые "прыгают" (меняют положение).

1
ответ дан 3 September 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: