2011-03-28 53 views
0

我有一個delphi形式的TPanel,我想複製所有的TLabels ,當我按下一個按鈕並將它們放在其他面板中時,這個TPanel。 有沒有辦法做到這一點? 謝謝。如何將所有與delphi上的TPanel一起使用的TLabel複製到另一個TPanel?

+0

如果我是你,我會編寫一個例程,用新標籤填充面板並避免使用dfm文件。所以我不會發明重複的邏輯,我會寫一點代碼來合成指定容器內的必要標籤。 – 2011-03-28 18:14:55

回答

5

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

IDE的版本是XE我會嘗試它是否可以工作 – alexzm1 2011-03-28 19:58:10

-1

TPanel是組件的容器。它的控件屬性中有一個子組件的列表。您可以遍歷該列表以訪問其子項。

在你的代碼中有按鈕的按Panel1的

  • 檢查的控件列表上

    1. 迭代如果控制是的TLabel

    2. 變化的Parent屬性TLabel爲Panel2

    someth荷蘭國際集團這樣的

    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; 
    
  • +2

    OP說'複製'不''移動'。 – RRUZ 2011-03-28 18:10:55

    +0

    它看起來像這個代碼只會移動並且不會複製(複製)標籤,它們會在第一個面板上消失 – mjn 2011-03-28 18:13:11

    +5

    無論如何,如果您正在移動,正常的方法是向下運行環路,例如, 'for i:= Panel1.ControlCount - 1 downto 0 do'。那麼,如果你把事情從列表中拿出來並不重要,因爲它隻影響你已經處理的項目的索引。 – 2011-03-28 18:13:47

    相關問題