不能在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