0

デルファイフォームにTPanelがあります。ボタンを押して他のパネルに配置すると、このTPanelで親になっているすべてのTPanelをコピーしたいと思います。それを行う方法はありますか?ありがとう。

4

2 に答える 2

5

copyあるTPanelから別のTPanelへのTLabelコントロールには、次のようなものを使用できます。

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のバージョンを指定しないため、簡単な例を示します。

于 2011-03-28T18:21:23.483 に答える
-1

TPanelは、コンポーネントのコンテナです。Controlsプロパティに子コンポーネントのリストがあります。このリストを繰り返し処理して、その子にアクセスできます。

ボタンを押すと、コードは次のようになります。

  1. Panel1のコントロールリストで繰り返します

  2. コントロールがTLabelであるかどうかを確認します

  3. TLabelのParentプロパティを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;
于 2011-03-28T18:08:13.203 に答える