如何删除我动态添加到菜单的菜单项?
我添加动态菜单项,例如:
m:=TMenuItem.Create(nil);
m.Text:='bla bla bla';
mnuMain.AddObject(m);
我找不到任何功能来再次删除该条目。我尝试了删除、释放、removeobject 等,但该项目仍然没有被删除并且仍然可见。诀窍是什么?
如何删除我动态添加到菜单的菜单项?
我添加动态菜单项,例如:
m:=TMenuItem.Create(nil);
m.Text:='bla bla bla';
mnuMain.AddObject(m);
我找不到任何功能来再次删除该条目。我尝试了删除、释放、removeobject 等,但该项目仍然没有被删除并且仍然可见。诀窍是什么?
我遇到了同样的问题: TMenuItem.RemoveObject 不工作,并且 TMenuView 的私有成员 FContent 如果没有 RTTI 技巧就无法访问。这就是为什么我在调用 TMenuItem.Clear 之前使用存储剩余菜单子项的字符串列表来构建自己的解决方法:
function RemoveFromMenu(mnuMain: TMenuItem; const MenuText: string);
var
list: TStringList;
c: integer;
Menu: TMenuItem;
begin
list := TStringList.Create;
try
for c := 0 to mnuMain.ItemsCount - 1 do
if mnuMain.Items[c].Text <> MenuText then
list.Add(mnuMain.Items[c].Text);
mnuMain.Clear;
for c := 0 to list.Count - 1 do
begin
Menu := TMenuItem.Create(self);
Menu.Text := list[c];
Menu.OnClick := mnuMainSubMenuClick; // The menu event handler
mnuMain.InsertObject(0, Menu);
end;
finally
list.Free;
end;
end;
如果您的子菜单对每个菜单项都有一个自己的菜单处理程序,那么您也存储了这个事件处理程序。在这种情况下,一个通用的 TMenuItem 列表 (TList< TMenuItem >) 将是比使用字符串列表更好的方法。
如果您要添加这样的项目:
var
M : TMenuItem;
begin
M := TMenuItem.Create(nil);
M.Text := 'Bla Bla Bla';
MenuBar1.AddObject(M);
然后你只是给它一个父项,只需将菜单项的父项设置为nil
ARC 就会突然介入并做剩下的事情,因为没有更多对该对象的引用
只需编写一个循环来遍历并将所有父级设置为 nil/ 或者如果您在代码中也针对 Windows(或仅 Windows),则使用 DisposeOf 或使用编译器指令
var
I: Integer;
begin
for I := MenuBar1.ItemsCount-1 downto 0 do
begin
{$IFNDEF AUTOREFCOUNT}
MenuBar1.Items[I].disposeOf;
{$ELSE}
MenuBar1.Items[I].parent := nil;
{$ENDIF}
end;
end;