Как скопировать все TLabels, родительские с TPanel на Delphi, на другой TPanel? - PullRequest
0 голосов
/ 28 марта 2011

У меня есть TPanel в форме Delphi, я хочу скопировать все TLabels родительский с этим TPanel, когда я нажимаю кнопку и ставлю их в другой панели. Есть способ сделать это? Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 марта 2011

To copy TLabel управляет от одного TPanel к другому, вы можете использовать что-то вроде этого

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, я показываю простой пример.

0 голосов
/ 28 марта 2011

TPanel - это контейнер компонентов.У него есть список его дочерних компонентов в свойстве Controls.Вы можете перебирать этот список, чтобы получить доступ к его дочерним элементам.

При нажатии кнопки ваш код должен

  1. перебирать список элементов управления Panel1 * 1007.*

  2. проверить, является ли элемент управления TLabel

  3. изменить свойство Parent для TLabel на 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;
...