如何克隆TPopupMenu的菜单项?

5
我想要将一个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;

以下内容可以正常工作(b1是一个带有子菜单的PopupMenu1.TMenuItem):
PopupMenu2.Items.Add(CloneMenuItem(b1));

问题在于如果源菜单项是根菜单项,我无法克隆整个 TPopupMenu。例如:
PopupMenu2.Items.Add(CloneMenuItem(PopupMenu1.Items));

无法工作。我只能看到一个项目,就像它是一个分隔符一样。
1个回答

8

您不能这样克隆TPopupMenu.Items。即使TPopupMenu.Items是一个TMenuItem对象,它不是实际的菜单项,而只是用来承载其他TMenuItem对象的容器。您需要循环遍历这些子项并逐个克隆它们,例如:

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

有没有办法检测一个TMenuItem是否为根项?(TMenuItem.Parent == nil可以吗?) - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接