delphi - Delphi中动态创建子菜单

标签 delphi event-handling menu

我有一个弹出菜单,我希望其中一个项目打开一个带有动态创建的列表的子菜单(它是用户定义的标志的列表)。以下是我创建菜单项的方法(FlagAs 是我想要附加子菜单的菜单项):

lNewMenuItems: array[0..flagCount] of tMenuItem;

for I := 0 to flagCount do
begin
  { Create a new menu item }
  lNewMenuItems[I] := tMenuItem.Create(FlagAs);
  lNewMenuItems[I].Caption := FlagNames[I];
  lNewMenuItems[I].Tag := I; { Tag with the flag number }
  lNewMenuItems[I].OnClick := miFlagClick;
end;

FlagAs.Add(lNewMenuItems);

miFlagClick 处理程序只是切换其发件人的选中状态:

procedure TMyForm.miFlagClick(Sender: TObject);
begin
  (Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked;
end;

这些项目已完美添加,但当我单击它们时,它们不会被检查。事件处理程序正在被调用编辑:并且发送者是正确的菜单项,但下次我打开菜单时复选标记不会出现。

我做错了什么?或者我是否以错误的方式创建菜单? (注意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;

关于delphi - Delphi中动态创建子菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552995/

相关文章:

c - GTK+/GLIB 事件循环并向事件循环发出信号

C# 事件处理方法

基本菜单示例中的 XML 问题

delphi - 如何调用 NtOpenFile?

string - 如何获取 TStringList 中的最后一个字符串

delphi - TSplitter通过源代码移动

linux - Linux 上的菜单和子菜单脚本

delphi - 启动和停止屏幕保护程序

javascript - Highcharts 选择事件禁用突出显示效果

android - Android中所有 Activity 中的相同选项菜单