0

我在 delphi 表单上有一个 TPanel,当我按下按钮并将它们放在其他面板中时,我想复制所有以该 TPanel 为父的 TLabel。有没有办法做到这一点?谢谢。

4

2 回答 2

5

对于copy从一个 TPanel 到另一个 TPanel 的 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 版本,因此我只展示了一个简单的示例。

于 2011-03-28T18:21:23.483 回答
-1

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

按下按钮,您的代码必须

  1. 迭代 Panel1 的 Controls 列表

  2. 检查控件是否为 TLabel

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

像这样的东西

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;
于 2011-03-28T18:08:13.203 回答