以编程方式启用菜单项(及其所有父项)-Delphi

以编程方式启用菜单项(及其所有父项)-Delphi,delphi,delphi-2009,Delphi,Delphi 2009,我需要根据用户的状态有选择地启用某些菜单项。我已经设法获得代码来启用我想要的实际项目,但我看不到如何启用我在多级菜单中启用的每个项目之上的所有父菜单项目。如果不启用它们,菜单项仍然无法使用,因为用户无法访问它 如果我有 EditTop EditSub1 Editsub2 EditSubSub1 EditSub3 我可以启用EditSub1,但是我也需要启用Editsub2和EditTop,否则用户无法访问它。这就是我所希望得到的帮助 我目前拥有的代码如下(假设其

我需要根据用户的状态有选择地启用某些菜单项。我已经设法获得代码来启用我想要的实际项目,但我看不到如何启用我在多级菜单中启用的每个项目之上的所有父菜单项目。如果不启用它们,菜单项仍然无法使用,因为用户无法访问它

如果我有

EditTop
   EditSub1
   Editsub2
      EditSubSub1
   EditSub3 
我可以启用EditSub1,但是我也需要启用Editsub2和EditTop,否则用户无法访问它。这就是我所希望得到的帮助

我目前拥有的代码如下(假设其他代码给了我一个TstringList,其中包含我想要启用的菜单名)

首先是一些代码来禁用一切

procedure DisableMenu(AMenu: TMenuItem);
//recurses through all the menu and disables eveything 
var
  i: integer;
begin
for i := 0 to AMenu.Count - 1 do
   begin
   AMenu[i].enabled := false;
   DisableMenu(AMenu[i]);
   end;
end;
然后,根据TmenuItem的名称搜索并返回TmenuItem的代码 (这是从 )


您所需要做的就是使用TMenuItem.Parent属性在菜单树上漫游

var vMenuItem : TMenuItem;
[...]
//first disable all menu items
    DisableMenu(MainMenu1.Items); 
    //now enable the ones we want enabled       
    for i := 0 to AllowedMenus.count-1 do
    begin
      MenuName := AllowedMenus[i];
      vMenuItem := FindMnuItem(MainMenu1, MenuName);
      while Assigned(vMenuItem) do
      begin
        vMenuItem.Enabled := true; //enable an item   
        vMenuItem := vMenuItem.Parent;
      end;
    end

您所需要做的就是使用TMenuItem.Parent属性在菜单树上漫游

var vMenuItem : TMenuItem;
[...]
//first disable all menu items
    DisableMenu(MainMenu1.Items); 
    //now enable the ones we want enabled       
    for i := 0 to AllowedMenus.count-1 do
    begin
      MenuName := AllowedMenus[i];
      vMenuItem := FindMnuItem(MainMenu1, MenuName);
      while Assigned(vMenuItem) do
      begin
        vMenuItem.Enabled := true; //enable an item   
        vMenuItem := vMenuItem.Parent;
      end;
    end

您所需要做的就是使用TMenuItem.Parent属性在菜单树上漫游

var vMenuItem : TMenuItem;
[...]
//first disable all menu items
    DisableMenu(MainMenu1.Items); 
    //now enable the ones we want enabled       
    for i := 0 to AllowedMenus.count-1 do
    begin
      MenuName := AllowedMenus[i];
      vMenuItem := FindMnuItem(MainMenu1, MenuName);
      while Assigned(vMenuItem) do
      begin
        vMenuItem.Enabled := true; //enable an item   
        vMenuItem := vMenuItem.Parent;
      end;
    end

您所需要做的就是使用TMenuItem.Parent属性在菜单树上漫游

var vMenuItem : TMenuItem;
[...]
//first disable all menu items
    DisableMenu(MainMenu1.Items); 
    //now enable the ones we want enabled       
    for i := 0 to AllowedMenus.count-1 do
    begin
      MenuName := AllowedMenus[i];
      vMenuItem := FindMnuItem(MainMenu1, MenuName);
      while Assigned(vMenuItem) do
      begin
        vMenuItem.Enabled := true; //enable an item   
        vMenuItem := vMenuItem.Parent;
      end;
    end

我认为你可以使用这个功能; (D21是您的实际项目):

过程更新parent(MyItemMenu:TMenuItem);
开始
TMenuItem(MyItemMenu).Enabled:=true;
如果TMenuItem(MyItemMenu).Parent为nil,则
UpdateNuparent(TMenuItem(MyItemMenu).Parent);
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
更新公园(D21);
结束;

我认为你可以使用这个功能; (D21是您的实际项目):

过程更新parent(MyItemMenu:TMenuItem);
开始
TMenuItem(MyItemMenu).Enabled:=true;
如果TMenuItem(MyItemMenu).Parent为nil,则
UpdateNuparent(TMenuItem(MyItemMenu).Parent);
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
更新公园(D21);
结束;

我认为你可以使用这个功能; (D21是您的实际项目):

过程更新parent(MyItemMenu:TMenuItem);
开始
TMenuItem(MyItemMenu).Enabled:=true;
如果TMenuItem(MyItemMenu).Parent为nil,则
UpdateNuparent(TMenuItem(MyItemMenu).Parent);
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
更新公园(D21);
结束;

我认为你可以使用这个功能; (D21是您的实际项目):

过程更新parent(MyItemMenu:TMenuItem);
开始
TMenuItem(MyItemMenu).Enabled:=true;
如果TMenuItem(MyItemMenu).Parent为nil,则
UpdateNuparent(TMenuItem(MyItemMenu).Parent);
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
更新公园(D21);
结束;

您可以使用操作,只需为每个操作编写OnUpdate事件处理程序。您可以使用操作,只需为每个操作编写OnUpdate事件处理程序。您可以使用操作,只需为每个操作编写OnUpdate事件处理程序。您可以使用操作,只需为每个操作编写OnUpdate事件处理程序。谢谢,现在我明白了,解决办法是显而易见的!谢谢,现在我明白了,解决办法是显而易见的!谢谢,现在我明白了,解决办法是显而易见的!谢谢,现在我明白了,解决办法是显而易见的!谢谢,我给了Ken答案,因为他先到了那里,他的答案直接使用了我已经编写的代码。谢谢,我给了Ken答案,因为他先到了那里,他的答案直接使用了我已经编写的代码。谢谢,我给了Ken答案,因为他先到了那里,他的答案直接使用了我已经编写的代码。谢谢,我给了Ken答案,因为他先到了那里,他的答案直接使用了我已经编写的代码。