Подменю главного меню
Я пытаюсь создать 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
свойства....