delphi - 无法销毁 Delphi 中动态创建的菜单项

标签 delphi delphi-xe

首先,是的,我查遍了整个网络,但似乎仍然无法销毁动态创建的菜单项。使用德尔福XE。我因此创建了这些项目(出于练习的目的,SubMenuName 是“Test1”:

MenuItemCreated := TMenuItem.Create(PopupMenu1);
MenuItemCreated.Caption:= SubMenuCaption
MenuItemCreated.Hint := SubMenuHint;
MenuItemCreated.Name := SubMenuName;
MenuItemCreated.OnClick :=  SubMenuClick;
MenuItemCreated.AutoHotkeys := maManual;
MySubMenu.Add(MenuItemCreated);

使用创建的子菜单没有问题。 SubMenuClick 过程按其应有的方式工作,并且我确定了正确的子菜单项,因此没有问题。然后我要做的是应用程序注销,它应该使用此代码释放动态创建的子菜单(尽管我尝试了很多变体):

  // Get rid of the menu items created
  While MySubMenu.Count > 0 do
  begin
    Itemtodelete := MySubMenu.Items[0];
    FreeandNil(ItemtoDelete);
  end;

我已经放入了 showmessage() 调试行,显示菜单项的组件名称是 freeandnil'd,它们是我所期望的,即。 “Test1”以及我创建的任何其他内容。然后我重新登录到我的应用程序(该应用程序仍在运行,但我已注销)。然后,该软件尝试重新创建具有相同名称的相同子菜单(因为就我的应用程序而言,没有任何变化,并且它们之前已被处置(据说))。我立即收到异常:

错误:名为 Test1 的组件已存在

我完全不知道如何处理子菜单项,以便以后可以使用相同的名称重新创建它们。

非常感谢任何帮助。

谢谢, 知识库

最佳答案

你没有说,所以我不得不假设MySubMenu是PopupMenu1的MenuItem。如果不是,请澄清。

要从 MySubMenu 中删除项目以便稍后重新创建它们,最简单的方法是调用 Clear 方法:

procedure TForm5.Button2Click(Sender: TObject);
begin
  MySubMenu.Clear;
end;

这将删除 MySubMenu 的所有菜单项并释放其内存。

为了稍后重新创建项目,您不能使用Delete() 或Remove(),而不释放内存,因为它们不会释放项目的内存。这在帮助中有记录:

http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Menus.TMenuItem.Delete http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Menus.TMenuItem.Remove

使用这些方法,您必须在重新创建菜单项之前自行释放内存。但是,甚至没有必要调用删除或删除,您只需简单地释放项目即可:

procedure TForm5.Button2Click(Sender: TObject);
var
  mi: TMenuItem;
begin
  while MySubMenu.Count > 0 do
  begin
    mi := MySubMenu.Items[0];
    mi.Free;
  end;
end;

无需调用 FreeAndNil。 最后一个选项看起来与您的非常相似,您在重新创建菜单项时遇到了问题。除非在不释放的情况下使用Delete() 或Remove() 时,否则我无法重现该错误。

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

相关文章:

delphi - 如何通过 idHTTP 获取(即读取)https 响应。通常是 REST 授权

delphi - 如何解决 Delphi XE 中大型 Enum 类型的 RTTI 大小问题?

forms - Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

delphi - 如何在代码中设置 DBX 连接池?

delphi - 如何通过拖动鼠标在DelphiXE6 VCL分组框中选择多个控件?

delphi - 使用 RTTI 方法调用返回的函数引用

delphi - 使用 IFMXVirtualKeyboardService 隐藏虚拟键盘后丢失

delphi - 如何检查数组是否已排序?

delphi - 在Delphi中使用UTF8生成动态HTML页面

delphi - Indy TCP 客户端/服务器,客户端充当服务器