我尝试在运行时创建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添加到Save . Item?
更新:我尝试创建另一个Procedure来实现这一点,因此Procedure搜索Save . Item,当他找到它时,向它添加其他项目。
注:--我在使用Delphi 10 seattle
发布于 2017-01-14 15:08:14
如果您有一个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;
发布于 2017-01-16 13:18:21
因此,该过程搜索另存为..。项目,当他找到它,添加其他项目到它。
这是一个相当奇怪的想法。你为什么要搜索你已经知道的物品?或者换个说法--你为什么要忘记你还必须使用的东西呢?
再次通过标题搜索是冗余的,慢的和容易出错的(打字或本地化)。
只要在你需要它的时候保持它的价值,只在你不再寻找它之后才忘记它。
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属性..。
https://stackoverflow.com/questions/41651321
复制相似问题