不能在Delphi中销毁动态创建的菜单项

首先,是的,我看遍了整个网络,仍然无法破坏动态创建的菜单项。 使用Delphi 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的工作原理,我确定了正确的subMenu项目,所以没有问题。 然后我做的是一个应用程序注销,它应该使用此代码释放动态创建的子菜单(尽管我尝试了很多变体):

  // 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的组件已经存在

我完全丧失了如何处理子菜单项,以便稍后可以用相同的名称重新创建它们。

任何帮助不胜感激。

谢谢,KB


你没有说,所以我必须假设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

使用这些方法,您必须自己释放内存,然后重新创建菜单项。 但是,甚至不需要调用Delete或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()时,我无法重现该错误。


由于弹出式菜单拥有这些项目,因此您不需要释放它。 而不是FreeAndNil使用MySubMenu.Delete(0)或更适当的MySubMenu.Items.Clear而不是整个While例程。

在应用程序关闭时,弹出式菜单将清除它,除非您正在重建菜单,否则无需手动执行。

链接地址: http://www.djcxy.com/p/16173.html

上一篇: Cannot Destroy Dynamically created Menu Item in Delphi

下一篇: Compare and contrast interfaces in Java and Delphi