如何克隆 TPopupMenu 的菜单项?

Vla*_*lad 3 delphi delphi-7

我想将整个 TMenuItem 及其子项克隆到另一个 TPopupMenu。这是一个很好的代码

function CloneMenuItem(SourceItem: TMenuItem): TMenuItem;
var
  I: Integer;
Begin
  with SourceItem do
  Begin
    Result := NewItem(Caption, Shortcut, Checked, Enabled, OnClick, HelpContext, Name + 'Copy');
    for I := 0 To Count - 1 do
      Result.Add(CloneMenuItem(Items[I]));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

以下工作正常(b1 是一个带有子菜单的 PopupMenu1.TMenuItem):

PopupMenu2.Items.Add(CloneMenuItem(b1));
Run Code Online (Sandbox Code Playgroud)

问题是如果 SourceItem 是根项目,我无法克隆整个TPopupMenu。例如:

PopupMenu2.Items.Add(CloneMenuItem(PopupMenu1.Items));
Run Code Online (Sandbox Code Playgroud)

行不通。我只能看到1 项,就好像它是一个分隔符。

Rem*_*eau 6

你不能TPopupMenu.Items像那样克隆。即使TPopupMenu.Items是一个TMenuItem对象,它也不是实际的菜单项,它只是用于托管其他TMenuItem对象的容器。您必须遍历这些孩子并单独克隆它们,例如:

for I := 0 to PopupMenu1.Items.Count-1 do
  PopupMenu2.Items.Add(CloneMenuItem(PopupMenu1.Items[I])); 
Run Code Online (Sandbox Code Playgroud)