首先,是的,我已经搜索了所有的网络,仍然不能破坏动态创建的菜单项。使用Delphi XE。我这样创建项(为了练习的目的,SubMenuName是‘Test1 1’):
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()调试行,这些行显示菜单项的组件名称是免费的,它们是我所期望的,即。“Test1”和我创造的任何其他东西。然后我重新登录到我的应用程序(该应用程序仍然在运行,但是我已经注销了)。然后,该软件尝试用相同的名称重新创建相同的子菜单(因为就我的应用程序而言,没有什么改变,而且它们以前已经被处理掉了(据推测))。我立即提出了例外情况:
错误:名为Test1的组件已经存在
我完全不知道如何处理子菜单项目,以便以后可以用相同的名称重新创建它们。
任何帮助都非常感谢。
谢谢,KB
发布于 2014-12-31 13:52:19
您没有这么说,所以我不得不假设MySubMenu是一个MenuItem of PopupMenu1。如果没有,请澄清。
要从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()而不释放,否则我无法再现错误。
发布于 2014-12-31 12:50:48
因为弹出式菜单拥有这些项目,所以您不能释放它。使用FreeAndNil代替MySubMenu.Delete(0)或更合适的是使用MySubMenu.Items.Clear,而不是整个While例程。
在应用程序关闭时,弹出菜单将清除它,除非您正在重新构建菜单,否则不需要手动执行。
https://stackoverflow.com/questions/27699091
复制相似问题