Подменю главного меню

Я пытаюсь создать MainMenu во время выполнения, поэтому я создаю два Procedure для этого:

Процедура 1:

Procedure AddMenuItem ( Const Menu : TMenu ; Caption : String );
  Var MenuItem : TMenuItem;
Begin
  MenuItem := TMenuItem.Create(Menu);
  MenuItem.Caption := Caption;
  Menu.Items.Add(MenuItem);
End;

Процедура 2:

Procedure MenuAddSubItem ( Const Menu : TMenu ; Index : Integer ; Caption : String ) ;
  Var Item : TMenuItem;
Begin
  Item := TMenuItem.Create(Menu);
  Item.Caption := Caption;
  Menu.Items[Index].Add(Item);
End;

Первый Procedure Создайте Items, а второй создать SubItems,

Зов этого двух Procedure является:

AddMenuItem(MainMenu1,'File');
MenuAddSubItem(MainMenu1,0,'Open');
MenuAddSubItem(MainMenu1,0,'Save');
MenuAddSubItem(MainMenu1,0,'Save as..');
MenuAddSubItem(MainMenu1,0,'-');
MenuAddSubItem(MainMenu1,0,'Exit');

я хочу добавить Items Сохранить как.. Item, лайк:

Файл -> Сохранить как.. -> PDF

Файл -> Сохранить как.. -> Документ

Файл -> Сохранить как.. -> Txt

Итак, мой вопрос: как я могу добавить Items Сохранить как.. Item?

Обновление: я пытаюсь создать другой Procedure чтобы сделать это, так что Procedure поиск Сохранить как.. Item, Когда он его найдет, добавь к нему другие предметы.

Примечание: я использую Delphi 10 seattle

2 ответа

Решение

Если у тебя есть TMenuItemВы можете просто использовать его Add способ добавить другие пункты меню к нему. Затем они доступны через его Items имущество.

Приведенный ниже код показывает, как это сделать, а также как выполнить рекурсивный поиск по меню, чтобы найти пункт меню с заданным заголовком и добавить новый пункт меню в его подменю.

function FindMenuItemByCaption(AMainMenu : TMainMenu; const Caption : String) : TMenuItem;


  function FindItemInner(Item : TMenuItem; const Caption : String) : TMenuItem;
  var
    i : Integer;
  begin
    Result := Nil;
    if Item.Caption = Caption then begin
      Result := Item;
      exit;
    end
    else begin
      for i := 0 to Item.Count - 1 do begin
        Result := FindItemInner(Item.Items[i], Caption);
        if Result <> Nil then
          Break;
      end;
    end;
  end;

begin
  Result := FindItemInner(AMainMenu.Items, Caption);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  FileItem,
  SaveItem,
  SaveAsItem,
  OtherItem,
  QuitItem : TMenuItem;
  i : integer;
  ItemToFind,
  ExtraItem : TMenuItem;
begin
  FileItem := TMenuItem.Create(Self);
  FileItem.Caption := 'File';
  MainMenu1.Items.Add(FileItem);

  SaveItem := TMenuItem.Create(Self);
  SaveItem.Caption := 'Save';
  FileItem.Add(SaveItem);

  SaveAsItem := TMenuItem.Create(Self);
  SaveAsItem.Caption := 'Save as';
  FileItem.Add(SaveAsItem);

  for i := 1 to 3 do begin
    OtherItem := TMenuItem.Create(Self);
    OtherItem.Caption := 'Other ' + IntToStr(i);
    SaveasItem.Add(OtherItem);
  end;

  QuitItem := TMenuItem.Create(Self);
  QuitItem.Caption := 'Quit';
  FileItem.Add(QuitItem);

  Caption := SaveAsItem.Items[2].Caption;

  ItemToFind := FindMenuItemByCaption(MainMenu1, 'Save as');
  Assert(ItemToFind <> Nil);
  ExtraItem := TMenuItem.Create(Self);
  ExtraItem.Caption := 'Extra';
  ItemToFind.Add(ExtraItem);
end;

Можно, конечно, заселить TPopUpMenuсхожим образом;

Таким образом, процедура поиска Сохранить как... элемент, когда он его найдет, добавить другие элементы к нему.

Это довольно странная идея. Почему вы должны искать предмет, который вы уже знаете? Или, говоря по-другому, почему вы забыли предмет, который вам все еще нужно использовать?

Повторный поиск по заголовку является избыточным, медленным и подверженным ошибкам (опечатки или локализация).

Просто сохраните значение, пока оно вам нужно, и забудьте о нем только после того, как вы больше не будете его искать.

function MenuAddSubItem ( Const Menu : TMenuItem ; Const Caption : String ): TMenuItem; overload;
  Var Item : TMenuItem;
Begin
  Item := TMenuItem.Create(Menu);
  Item.Caption := Caption;
  Menu.Add(Item);
  Result := Item;
End;

function MenuAddSubItem ( Const Menu : TMenu ; Const Index : Integer ; Const Caption : String ): TMenuItem; overload;
Begin
  Result := MenuAddSubItem( Menu.Items[Index], Caption );
End;


var miSaveAs: TMenuItem;

AddMenuItem(MainMenu1,'File');
MenuAddSubItem(MainMenu1,0,'Open');
MenuAddSubItem(MainMenu1,0,'Save');
miSaveAs := MenuAddSubItem(MainMenu1,0,'Save as..');
MenuAddSubItem(MainMenu1,0,'-');
MenuAddSubItem(MainMenu1,0,'Exit');

MenuAddSubItem(miSaveAs,'in PDF format');
MenuAddSubItem(miSaveAs,'in MS Word format');
MenuAddSubItem(miSaveAs,'in Plain Text format');

PS. вам процедуры также не хватает настройки Hint а также OnClick свойства....

Другие вопросы по тегам