如何将delphi上的TPanel作为父对象的所有Tlabel复制到另一TPanel?

如何将delphi上的TPanel作为父对象的所有Tlabel复制到另一TPanel?,delphi,parent,tpanel,tlabel,Delphi,Parent,Tpanel,Tlabel,我在delphi表单上有一个TPanel,我想复制所有的Tlabel 当我按下一个按钮并把它们放进去的时候,我就用这个TPanel做了父母 在另一个面板中。 有办法吗? 谢谢。TPanel是组件的容器。它在其控件属性中有其子组件的列表。您可以迭代此列表以访问其子项 按下按钮,您的代码必须 迭代Panel1的控件列表 检查控件是否为TLabel 将TLabel的父属性更改为Panel2 像这样的 for i := 0 to Panel1.ControlCount - 1 do if Panel

我在delphi表单上有一个TPanel,我想复制所有的Tlabel 当我按下一个按钮并把它们放进去的时候,我就用这个TPanel做了父母 在另一个面板中。 有办法吗?
谢谢。

TPanel是组件的容器。它在其控件属性中有其子组件的列表。您可以迭代此列表以访问其子项

按下按钮,您的代码必须

  • 迭代Panel1的控件列表

  • 检查控件是否为TLabel

  • 将TLabel的父属性更改为Panel2

  • 像这样的

    for i := 0 to Panel1.ControlCount - 1 do
      if Panel1.Controls[i] is TLabel then
        (Panel1.Controls[i] as TLabel).Parent:=Panel2;
    
    Procedure CopyLabels(ParentControl,DestControl:TWinControl);
    var
     i      : integer;
     ALabel : TLabel;
    begin
      for i := 0 to ParentControl.ControlCount - 1 do
       if ParentControl.Controls[i] is TLabel then
        begin
           ALabel:=TLabel.Create(DestControl);
           ALabel.Parent :=DestControl;
           ALabel.Left   :=ParentControl.Controls[i].Left;
           ALabel.Top    :=ParentControl.Controls[i].Top;
           ALabel.Width  :=ParentControl.Controls[i].Width;
           ALabel.Height :=ParentControl.Controls[i].Height;
           ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
           //you can add manually more properties here like font or another 
        end;
    end;
    
    CopyLabels(Panel1,Panel2);
    
    但是,等等这将不起作用。为什么?因为“在运行中”进行此更改,您将更改您正在迭代的相同列表

    因此,必须将要移动的标签保存在临时列表中。像这样的

     var 
      i:integer;
      l:TObjectList;
    
     begin
      l:=TObjectList.Create;
      l.ownsObjects:=False;
      for i := 0 to Panel1.ControlCount - 1 do
       if Panel1.Controls[i] is TLabel then
         l.add(Panel1.Controls[i]);
    
      for i:= 0 to l.Count-1 do
        (l[i] as TLabel).Parent:=Panel2;
    
      l.Free;
     end;
    

    TPanel是组件的容器。它在其控件属性中有其子组件的列表。您可以迭代此列表以访问其子项

    按下按钮,您的代码必须

  • 迭代Panel1的控件列表

  • 检查控件是否为TLabel

  • 将TLabel的父属性更改为Panel2

  • 像这样的

    for i := 0 to Panel1.ControlCount - 1 do
      if Panel1.Controls[i] is TLabel then
        (Panel1.Controls[i] as TLabel).Parent:=Panel2;
    
    Procedure CopyLabels(ParentControl,DestControl:TWinControl);
    var
     i      : integer;
     ALabel : TLabel;
    begin
      for i := 0 to ParentControl.ControlCount - 1 do
       if ParentControl.Controls[i] is TLabel then
        begin
           ALabel:=TLabel.Create(DestControl);
           ALabel.Parent :=DestControl;
           ALabel.Left   :=ParentControl.Controls[i].Left;
           ALabel.Top    :=ParentControl.Controls[i].Top;
           ALabel.Width  :=ParentControl.Controls[i].Width;
           ALabel.Height :=ParentControl.Controls[i].Height;
           ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
           //you can add manually more properties here like font or another 
        end;
    end;
    
    CopyLabels(Panel1,Panel2);
    
    但是,等等这将不起作用。为什么?因为“在运行中”进行此更改,您将更改您正在迭代的相同列表

    因此,必须将要移动的标签保存在临时列表中。像这样的

     var 
      i:integer;
      l:TObjectList;
    
     begin
      l:=TObjectList.Create;
      l.ownsObjects:=False;
      for i := 0 to Panel1.ControlCount - 1 do
       if Panel1.Controls[i] is TLabel then
         l.add(Panel1.Controls[i]);
    
      for i:= 0 to l.Count-1 do
        (l[i] as TLabel).Parent:=Panel2;
    
      l.Free;
     end;
    

    要将TLabel控件从一个TPanel复制到另一个TPanel,可以使用类似的方法

    for i := 0 to Panel1.ControlCount - 1 do
      if Panel1.Controls[i] is TLabel then
        (Panel1.Controls[i] as TLabel).Parent:=Panel2;
    
    Procedure CopyLabels(ParentControl,DestControl:TWinControl);
    var
     i      : integer;
     ALabel : TLabel;
    begin
      for i := 0 to ParentControl.ControlCount - 1 do
       if ParentControl.Controls[i] is TLabel then
        begin
           ALabel:=TLabel.Create(DestControl);
           ALabel.Parent :=DestControl;
           ALabel.Left   :=ParentControl.Controls[i].Left;
           ALabel.Top    :=ParentControl.Controls[i].Top;
           ALabel.Width  :=ParentControl.Controls[i].Width;
           ALabel.Height :=ParentControl.Controls[i].Height;
           ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
           //you can add manually more properties here like font or another 
        end;
    end;
    
    CopyLabels(Panel1,Panel2);
    
    像这样使用

    for i := 0 to Panel1.ControlCount - 1 do
      if Panel1.Controls[i] is TLabel then
        (Panel1.Controls[i] as TLabel).Parent:=Panel2;
    
    Procedure CopyLabels(ParentControl,DestControl:TWinControl);
    var
     i      : integer;
     ALabel : TLabel;
    begin
      for i := 0 to ParentControl.ControlCount - 1 do
       if ParentControl.Controls[i] is TLabel then
        begin
           ALabel:=TLabel.Create(DestControl);
           ALabel.Parent :=DestControl;
           ALabel.Left   :=ParentControl.Controls[i].Left;
           ALabel.Top    :=ParentControl.Controls[i].Top;
           ALabel.Width  :=ParentControl.Controls[i].Width;
           ALabel.Height :=ParentControl.Controls[i].Height;
           ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
           //you can add manually more properties here like font or another 
        end;
    end;
    
    CopyLabels(Panel1,Panel2);
    

    您也可以使用
    RTTI
    将属性从一个控件复制到另一个控件,但由于您没有指定Delphi版本,因此我只展示了一个简单的示例。

    将TLabel控件从一个TPanel复制到另一个TPanel,您可以使用类似的方法

    for i := 0 to Panel1.ControlCount - 1 do
      if Panel1.Controls[i] is TLabel then
        (Panel1.Controls[i] as TLabel).Parent:=Panel2;
    
    Procedure CopyLabels(ParentControl,DestControl:TWinControl);
    var
     i      : integer;
     ALabel : TLabel;
    begin
      for i := 0 to ParentControl.ControlCount - 1 do
       if ParentControl.Controls[i] is TLabel then
        begin
           ALabel:=TLabel.Create(DestControl);
           ALabel.Parent :=DestControl;
           ALabel.Left   :=ParentControl.Controls[i].Left;
           ALabel.Top    :=ParentControl.Controls[i].Top;
           ALabel.Width  :=ParentControl.Controls[i].Width;
           ALabel.Height :=ParentControl.Controls[i].Height;
           ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
           //you can add manually more properties here like font or another 
        end;
    end;
    
    CopyLabels(Panel1,Panel2);
    
    像这样使用

    for i := 0 to Panel1.ControlCount - 1 do
      if Panel1.Controls[i] is TLabel then
        (Panel1.Controls[i] as TLabel).Parent:=Panel2;
    
    Procedure CopyLabels(ParentControl,DestControl:TWinControl);
    var
     i      : integer;
     ALabel : TLabel;
    begin
      for i := 0 to ParentControl.ControlCount - 1 do
       if ParentControl.Controls[i] is TLabel then
        begin
           ALabel:=TLabel.Create(DestControl);
           ALabel.Parent :=DestControl;
           ALabel.Left   :=ParentControl.Controls[i].Left;
           ALabel.Top    :=ParentControl.Controls[i].Top;
           ALabel.Width  :=ParentControl.Controls[i].Width;
           ALabel.Height :=ParentControl.Controls[i].Height;
           ALabel.Caption:=TLabel(ParentControl.Controls[i]).Caption;
           //you can add manually more properties here like font or another 
        end;
    end;
    
    CopyLabels(Panel1,Panel2);
    

    您也可以使用
    RTTI
    将属性从一个控件复制到另一个控件,但由于您没有指定Delphi版本,因此我只展示了一个简单的示例。

    OP说
    copy
    not
    move
    。看起来此代码只会移动标签,而不会复制(复制)标签,无论如何,它们都会在第一个面板上消失,如果正在移动,通常的方法是向下运行循环,例如,对于i:=Panel1.ControlCount-1向下运行到0 do
    。那么,从列表中删除内容也没关系,因为它只会影响您已经处理过的项目的索引。@RRUZ ooops您是对的。我误读了OP,“把它们放在另一个面板上”,很抱歉混淆OP说的是
    copy
    not
    move
    。看起来这个代码只会移动而不会复制(复制)标签,标签会在第一个面板上消失。不管怎样,如果你在移动,通常的方法是向下运行循环,例如,对于i:=Panel1.ControlCount-1到0 do的
    。那么,从列表中删除内容也没关系,因为它只会影响您已经处理过的项目的索引。@RRUZ ooops您是对的。我误读了OP,“将它们放在另一个面板上”,很抱歉造成混淆。如果我是你,我会编写一个例程,用新标签填充面板,并避免使用dfm文件。因此,我不会发明复制逻辑,我会编写一段代码,在指定容器中合成必要的标签。如果我是你,我会编写一个例程,用新标签填充面板,并避免使用dfm文件。因此,我不会发明复制逻辑,我会编写一段代码,在指定的容器中合成必要的标签。