3

子を持つ 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));

問題は、SourceItem がルート項目である場合、TPopupMenu全体を複製できないことです。例:

PopupMenu2.Items.Add(CloneMenuItem(PopupMenu1.Items));

動作しません。セパレーターのように、1 つのアイテムしか表示されません。

4

1 に答える 1

6

そのようなクローンを作成することはできませんTPopupMenu.ItemsTPopupMenu.ItemsはオブジェクトですがTMenuItem、実際のメニュー項目ではなく、他のTMenuItemオブジェクトをホストするための単なるコンテナーです。これらの子をループして、代わりに個別に複製する必要があります。次に例を示します。

for I := 0 to PopupMenu1.Items.Count-1 do
  PopupMenu2.Items.Add(CloneMenuItem(PopupMenu1.Items[I])); 
于 2012-05-15T17:02:06.840 に答える