以编程方式启用菜单项(及其所有父项)- Delphi
Programatically enable a menu item (and all it's parents) - Delphi
我需要根据用户的状态有选择地启用某些菜单项。我已经设法获得代码来启用我想要的实际项目,但我看不到如何启用我在多级菜单中启用的每个菜单项上方的所有父菜单项。如果不启用它们,菜单项仍然无法使用,因为用户无法访问它。
例如,如果我有
EditTop
EditSub1
Editsub2
EditSubSub1
EditSub3
我可以启用 EditSubSub1,但因此我还需要同时启用 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;
然后是根据其名称搜索和 returns TmenuItem 的代码
(这来自
http://www.delphipages.com/forum/showthread.php?t=45723)
function FindMnuItem(Menu: TMenu; MenuName: string): TMenuItem;
procedure FindSubItems(mnuItem: TMenuItem);
var i: integer;
begin
for i:=0 to mnuItem.Count- 1 do
if mnuItem.Items[i].Name= MenuName then
begin
Result:= mnuItem.Items[i];
break;
end
else
FindSubItems(mnuItem.Items[i]);
end;
var i: integer;
begin
Result:= nil;
for i:= 0 to Menu.Items.Count -1 do
begin
if Menu.Items[i].name = MenuName then
begin
Result:= Menu.Items[i];
break;
end
else
if Result<> nil then
break
else
FindSubItems(Menu.Items[i]);
end;
end;
最后是代码,我希望得到一些帮助。这将根据 Stringlist AllowedMenus 中的名称选择性地启用每个菜单项,但仅启用那些菜单项,而不是树中每个菜单项上方的菜单项。我该怎么做?
//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];
FindMnuItem(MainMenu1, MenuName).Enabled := true; //enable an item
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 是您的实际物品):
procedure UpdateMenuParent(MyItemMenu: TMenuItem);
begin
TMenuItem(MyItemMenu).Enabled := true;
if TMenuItem(MyItemMenu).Parent <> nil then
UpdateMenuParent(TMenuItem(MyItemMenu).Parent);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
UpdateMenuParent(D21);
end;
我需要根据用户的状态有选择地启用某些菜单项。我已经设法获得代码来启用我想要的实际项目,但我看不到如何启用我在多级菜单中启用的每个菜单项上方的所有父菜单项。如果不启用它们,菜单项仍然无法使用,因为用户无法访问它。
例如,如果我有
EditTop
EditSub1
Editsub2
EditSubSub1
EditSub3
我可以启用 EditSubSub1,但因此我还需要同时启用 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;
然后是根据其名称搜索和 returns TmenuItem 的代码 (这来自 http://www.delphipages.com/forum/showthread.php?t=45723)
function FindMnuItem(Menu: TMenu; MenuName: string): TMenuItem;
procedure FindSubItems(mnuItem: TMenuItem);
var i: integer;
begin
for i:=0 to mnuItem.Count- 1 do
if mnuItem.Items[i].Name= MenuName then
begin
Result:= mnuItem.Items[i];
break;
end
else
FindSubItems(mnuItem.Items[i]);
end;
var i: integer;
begin
Result:= nil;
for i:= 0 to Menu.Items.Count -1 do
begin
if Menu.Items[i].name = MenuName then
begin
Result:= Menu.Items[i];
break;
end
else
if Result<> nil then
break
else
FindSubItems(Menu.Items[i]);
end;
end;
最后是代码,我希望得到一些帮助。这将根据 Stringlist AllowedMenus 中的名称选择性地启用每个菜单项,但仅启用那些菜单项,而不是树中每个菜单项上方的菜单项。我该怎么做?
//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];
FindMnuItem(MainMenu1, MenuName).Enabled := true; //enable an item
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 是您的实际物品):
procedure UpdateMenuParent(MyItemMenu: TMenuItem);
begin
TMenuItem(MyItemMenu).Enabled := true;
if TMenuItem(MyItemMenu).Parent <> nil then
UpdateMenuParent(TMenuItem(MyItemMenu).Parent);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
UpdateMenuParent(D21);
end;