首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主菜单SubItem

主菜单SubItem
EN

Stack Overflow用户
提问于 2017-01-14 14:56:23
回答 2查看 3.2K关注 0票数 3

我尝试在运行时创建MainMenu,因此我为此创建了两个Procedure

过程1:

代码语言:javascript
复制
Procedure AddMenuItem ( Const Menu : TMenu ; Caption : String );
  Var MenuItem : TMenuItem;
Begin
  MenuItem := TMenuItem.Create(Menu);
  MenuItem.Caption := Caption;
  Menu.Items.Add(MenuItem);
End;

过程2:

代码语言:javascript
复制
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的调用是:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-14 15:08:14

如果您有一个TMenuItem,您可以简单地使用它的Add方法向它添加其他菜单项。然后,可以通过其Items属性访问它们。

下面的代码展示了如何这样做,以及如何通过菜单进行递归搜索,以找到带有指定标题的菜单项,并将新菜单项添加到其子菜单中。

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2017-01-16 13:18:21

因此,该过程搜索另存为..。项目,当他找到它,添加其他项目到它。

这是一个相当奇怪的想法。你为什么要搜索你已经知道的物品?或者换个说法--你为什么要忘记你还必须使用的东西呢?

再次通过标题搜索是冗余的,慢的和容易出错的(打字或本地化)。

只要在你需要它的时候保持它的价值,只在你不再寻找它之后才忘记它。

代码语言:javascript
复制
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。您的过程也缺少设置HintOnClick属性..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41651321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档