1

如何删除我动态添加到菜单的菜单项?

我添加动态菜单项,例如:

m:=TMenuItem.Create(nil);
m.Text:='bla bla bla';
mnuMain.AddObject(m);

我找不到任何功能来再次删除该条目。我尝试了删除、释放、removeobject 等,但该项目仍然没有被删除并且仍然可见。诀窍是什么?

4

2 回答 2

0

我遇到了同样的问题: 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 >) 将是比使用字符串列表更好的方法。

于 2017-11-30T17:01:52.233 回答
0

如果您要添加这样的项目:

var
    M : TMenuItem;
begin
    M := TMenuItem.Create(nil);
    M.Text := 'Bla Bla Bla';
    MenuBar1.AddObject(M);

然后你只是给它一个父项,只需将菜单项的父项设置为nilARC 就会突然介入并做剩下的事情,因为没有更多对该对象的引用

只需编写一个循环来遍历并将所有父级设置为 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;
于 2017-02-07T12:01:39.890 回答