how to copy all the TLabels parented with a TPanel on delphi to another TPanel?

喜欢而已 提交于 2019-12-02 20:02:49

问题


I have a TPanel on a delphi form, I want to copy all the TLabels parented with this TPanel when i press a button and put them in other panel. Is there a way to do that? Thanks.


回答1:


To copy the TLabel controls from one TPanel to another you can use something like this

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;

and use like this

CopyLabels(Panel1,Panel2);

you can use the RTTI too, to copy the properties from a control to another, but as you does not specify your Delphi version only i show a simple example.




回答2:


TPanel is a container of Components. It has a list of its child components in its Controls property. You may iterate over this list to get access to its children.

At the press of the button your code has to

  1. iterate on the Controls list of Panel1

  2. check if the control is a TLabel

  3. change the Parent property of the TLabel to be Panel2

something like this

for i := 0 to Panel1.ControlCount - 1 do
  if Panel1.Controls[i] is TLabel then
    (Panel1.Controls[i] as TLabel).Parent:=Panel2;

But, wait!, this will not work. Why? Because doing this change 'on the fly' you will be changing the very same list you are iterating over.

So, you have to save the labels to be moved in a temporary list. Something like this...

 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;


来源:https://stackoverflow.com/questions/5462866/how-to-copy-all-the-tlabels-parented-with-a-tpanel-on-delphi-to-another-tpanel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!