在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;