在Delphi中动态创建子菜单
我有一个弹出菜单,我想其中一个项目打开一个子菜单与动态创建的列表(这是一个用户定义的标志列表)。下面是我创建菜单项的方式(在Delphi中动态创建子菜单,delphi,event-handling,menu,Delphi,Event Handling,Menu,我有一个弹出菜单,我想其中一个项目打开一个子菜单与动态创建的列表(这是一个用户定义的标志列表)。下面是我创建菜单项的方式(FlagAs是我要将子菜单附加到的菜单项): miFlagClick处理程序只需切换其发送方的选中状态: procedure TMyForm.miFlagClick(Sender: TObject); begin (Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked; end; 这些项目添加
FlagAs
是我要将子菜单附加到的菜单项):
miFlagClick
处理程序只需切换其发送方的选中状态:
procedure TMyForm.miFlagClick(Sender: TObject);
begin
(Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked;
end;
这些项目添加得非常完美,但当我单击它们时,它们不会被检查。正在调用事件处理程序EDIT:“发件人”是正确的菜单项,但下次打开菜单时不会出现复选标记。
我做错了什么?还是我用错误的方式创建菜单?(注意flagCount
将来可能会更改,但定义为代码中的常量)
编辑:以上确实有效-请参见下面我的答案我在Delphi 2009中尝试了以下方法,效果很好:
procedure TForm5.FormCreate(Sender: TObject);
var
i : Integer;
mis : array[0..3] of TMenuItem;
begin
for i := 0 to 3 do begin
mis[i] := tMenuItem.Create(SubMenu);
NewMenu(mis[i]);
end;
SubMenu.Add(mis);
end;
procedure TForm5.NewMenu(var mi: TMenuItem);
begin
mi.Caption := 'Test';
mi.OnClick := TestClick;
end;
procedure TForm5.TestClick(Sender: TObject);
begin
(Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked;
end;
这是我的错误-我的另一段代码修改了我忘记的
已检查的状态。我现在觉得自己很愚蠢。很抱歉浪费时间…您是否在FlagAs上附加了一个eventhandler来清除选中的标志?请稍等(我知道您已经找到了原因)
为什么要使用lNewMenuItems:tMenuItem的数组[0..flagCount];而不是使用单个变量
另外,是否有不使用AutoCheck属性的原因
var
NewMenuItem: TMenuItem;
I : Integer;
begin
for I := 0 to flagCount do
begin
{ Create a new menu item }
NewMenuItem := TMenuItem.Create(FlagAs);
NewMenuItem.Caption := FlagNames[I];
NewMenuItem.Tag := I; { Tag with the flag number }
// NewMenuItem.OnClick := miFlagClick;
NewMenuItem.AutoCheck := True;
FlagAs.Add(NewMenuItem);
end;
end;
我使用的是Delphi2007,但是(正如我下面的回答)代码中的其他地方是我的错误。对不起,浪费了你的时间。帮助别人从来都不是浪费时间。哈哈,没问题,今天是星期一;-)。
var
NewMenuItem: TMenuItem;
I : Integer;
begin
for I := 0 to flagCount do
begin
{ Create a new menu item }
NewMenuItem := TMenuItem.Create(FlagAs);
NewMenuItem.Caption := FlagNames[I];
NewMenuItem.Tag := I; { Tag with the flag number }
// NewMenuItem.OnClick := miFlagClick;
NewMenuItem.AutoCheck := True;
FlagAs.Add(NewMenuItem);
end;
end;