我在delphi中遇到迭代问题。首先,我有2个MenuItems。菜单1有5个子菜单,菜单2有3个子菜单。我的想法是,如果我检查了checkListbox,它有8个项目(菜单1和菜单2的子菜单),它将检查菜单1和菜单2的子菜单。
[MainMenu 1] = menu1, menu2, menu3, menu4, menu5; (submenu)
[MainMenu 2] = menu1, menu2, menu3; (submenu)
CheckListBox = menu1, menu2, menu3, menu4, menu5 (MainMenu item 1), menu6, menu7, menu8(MainMenu item 2);
我尝试了一些代码,如:
for x := 0 to checkListBox.Items.Count - 1 do
begin
if checkListBox.Checked[x] then
begin
Menu1.items[x].Checked := true;
end;
end;
此代码运行失败,因为MainMenu 1的列表范围是1到5。
如果我试试这个,
MainMenu.items[0][2].Checked:= true;
确定它可以是特定的,但不像我想的那样。
答案 0 :(得分:1)
也许是这些方面的事情:
var
CheckIndex, MenuIndex: Integer;
Checked: Boolean;
Menu: TMenu;
....
for CheckIndex := 0 to checkListBox.Items.Count - 1 do begin
Checked := checkListBox.Checked[CheckIndex];
if CheckIndex < Menu1.Items.Count then begin
Menu := Menu1;
MenuIndex := CheckIndex;
end else begin
Menu := Menu2;
MenuIndex := CheckIndex - Menu1.Items.Count;
end;
Menu.Items[MenuIndex].Checked := Checked;
end;
我不确定我完全理解你的问题。我当然无法看到子菜单进入它的位置。但是,我希望上面提出的想法是有用的。
答案 1 :(得分:0)
您是否考虑使用ActionList和操作?
你知道你可以将每个菜单项“绑定”到它自己的动作,并且这样做菜单项属性如Checked和Enabled直接反映已被“绑定”到该特定的Action的Checked和Enabled属性。菜单项。
使用动作列表,您可以通过索引访问特定操作(我相信您正在尝试执行的操作),并且由于对操作所做的更改会在绑定到该特定操作的菜单项中重新生成,因此您无需编辑每个操作具体的meni项目,因此不必担心菜单结构。
实际上,您可以将多个菜单中的多个菜单项绑定到一个操作,更改此操作的“已检查”或“已启用”属性将影响已绑定到此特定操作的所有菜单项。
如果您使用MainMenu(带或不带子菜单)和PopupMenu(再次使用或带有子菜单)的组合,这将特别有用。