Как скопировать все 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. Вы можете перебрать этот список, чтобы получить доступ к его дочерним элементам.
При нажатии кнопки ваш код должен
итерация в списке элементов управления 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;
Но, подождите!, это не сработает. Зачем? Поскольку вы вносите эти изменения "на лету", вы будете изменять тот же список, который вы просматриваете.
Таким образом, вы должны сохранить метки для перемещения во временном списке. Что-то вроде этого...
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;