Как скопировать все TLabels, родительские с TPanel на Delphi, на другой TPanel?

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

2 ответа

Решение

К 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, я приведу простой пример.

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

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

  1. итерация в списке элементов управления Panel1

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

  3. измените родительское свойство 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;
Другие вопросы по тегам