2017-01-14 6 views
3

Я пытаюсь создать 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

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

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

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

Update: Я пытаюсь создать еще один Procedure, чтобы сделать это, Таким образом, поиск Procedure для Сохранить как ..Item, когда он нашел его, добавьте другие элементы к нему.

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

+0

Пожалуйста, оставьте комментарий после того, как вы опротете Q, чтобы узнать, что случилось, и что неясно. – Sami

ответ

4

Если у вас есть 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 с в таким же образом;

+0

Для примера? Можете ли вы дать мне пример? – Sami

+0

Я пытаюсь создать еще одну процедуру «Процедура», чтобы сделать это – Sami

+0

См. Мое обновление. – Sami

0

Таким образом, процедура search for Save as .. Item. Когда он найдет его, добавьте к нему другие предметы.

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

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

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

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 Свойства ....