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

时间:2014-12-30 03:01:02

标签: delphi delphi-xe

首先,是的,我已经遍布网络,但仍然无法破坏动态创建的菜单项。使用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,并且它们是我期望的,即。 '测试1'以及我创造的任何其他人。然后我重新登录我的应用程序(它仍然在运行,但是我退出了)。然后,软件尝试重新创建具有相同名称的相同子菜单(就我的应用程序而言,没有任何改变,并且它们之前被处理掉了(据说))。我马上得到了例外:

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

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

非常感谢任何帮助。

谢谢, KB

2 个答案:

答案 0 :(得分:5)

你没有说出来,所以我不得不假设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()而不释放,否则我无法重现错误。

答案 1 :(得分:0)

由于Popup菜单拥有这些项目,因此您不会将其释放。而不是FreeAndNil使用MySubMenu.Delete(0)或更合适的MySubMenu.Items.Clear而不是整个While例程。

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