如何将delphi上TPanel的所有TLabel复制到另一个TPanel?

时间:2011-03-28 17:42:17

标签: delphi parent tpanel tlabel

我在delphi表单上有一个TPanel,我想复制所有的TLabel 当我按下按钮然后把它们放在这个TPanel上 在其他小组中。 有没有办法做到这一点? 感谢。

2 个答案:

答案 0 :(得分:5)

从一个TPanel到另一个TPanel的copy TLabel控件你可以使用这样的东西

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版本,因此我只展示了一个简单的示例。

答案 1 :(得分:-1)

TPanel是Components的容器。它的Controls属性中有一个子组件列表。您可以遍历此列表以访问其子项。

按下按钮,您的代码必须

  1. 迭代Panel1的控件列表

  2. 检查控件是否为TLabel

  3. 将TLabel的Parent属性更改为Panel2

  4. 类似这样的事情

    for i := 0 to Panel1.ControlCount - 1 do
      if Panel1.Controls[i] is TLabel then
        (Panel1.Controls[i] as TLabel).Parent:=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;