首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在Delphi中销毁动态创建的菜单项

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

Stack Overflow用户
提问于 2014-12-30 03:01:01
回答 2查看 2.8K关注 0票数 4

首先,是的,我已经搜索了所有的网络,仍然不能破坏动态创建的菜单项。使用Delphi XE。我这样创建项(为了练习的目的,SubMenuName是‘Test1 1’):

代码语言:javascript
复制
MenuItemCreated := TMenuItem.Create(PopupMenu1);
MenuItemCreated.Caption:= SubMenuCaption
MenuItemCreated.Hint := SubMenuHint;
MenuItemCreated.Name := SubMenuName;
MenuItemCreated.OnClick :=  SubMenuClick;
MenuItemCreated.AutoHotkeys := maManual;
MySubMenu.Add(MenuItemCreated);

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

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

我已经添加了showmessage()调试行,这些行显示菜单项的组件名称是免费的,它们是我所期望的,即。“Test1”和我创造的任何其他东西。然后我重新登录到我的应用程序(该应用程序仍然在运行,但是我已经注销了)。然后,该软件尝试用相同的名称重新创建相同的子菜单(因为就我的应用程序而言,没有什么改变,而且它们以前已经被处理掉了(据推测))。我立即提出了例外情况:

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

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

任何帮助都非常感谢。

谢谢,KB

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-31 13:52:19

您没有这么说,所以我不得不假设MySubMenu是一个MenuItem of PopupMenu1。如果没有,请澄清。

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

代码语言:javascript
复制
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,您可以简单地释放项目:

代码语言:javascript
复制
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()而不释放,否则我无法再现错误。

票数 7
EN

Stack Overflow用户

发布于 2014-12-31 12:50:48

因为弹出式菜单拥有这些项目,所以您不能释放它。使用FreeAndNil代替MySubMenu.Delete(0)或更合适的是使用MySubMenu.Items.Clear,而不是整个While例程。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27699091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档