如何在运行期间,像在设计时复制控件!!(50分)

  • 主题发起人 主题发起人 sytzlh
  • 开始时间 开始时间
S

sytzlh

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序里面动态创建了一些timage和tpanel 现在我想复制其中一个tpanel到其他窗体!!
(panel上有许多其他的控件)! 请问需要要怎样做!! 用流可以吗!!?
 
这个问题有点难度:),国外的做法(我所看到的)有两个:一个是覆盖GetChildren;
另一个是通过clipboard和stream结合,具体代码请参看
http://www.swissdelphicenter.ch/torry/showcode.php?id=679。

下面是我写的代码,我是用的TFileStream,你可以很方便的将它改为TMemoStream,这只是个思路
没有经过严格测试:
//条件:
// 两个窗体:form1,form2.
// form1上: 一个panel1,两个button,btn_save,btn_load;
// 在panel1放上一个Label1,一个Memo1,一个Button1。
// form2上:为空。
//目的:
// 将form1上的panel1复制到form2上,并且panel1上的Label1等也要复制过去。
//执行过程:
// 先点击btn_save将panel1及它上面的控件存入comp.dat;然后点击btn_load,在form2出现
//panel1及它上面的控件的复制品
//////////////////////////////////////////////////////////////////////////////
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Contnrs;

type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Memo1: TMemo;
Button1: TButton;
btn_save: TButton;
btn_load: TButton;
procedure FormCreate(Sender: TObject);
procedure btn_saveClick(Sender: TObject);
procedure btn_loadClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
objList: TObjectList;
FFileComp: string;
public
procedure saveComponent(comp: TComponent);
procedure loadComponent(comp: TComponent);
procedure swapOwner(oldOwner, oldParent, newOwner: TComponent);
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
objList := TObjectList.Create;
FFileComp := 'comp.dat';
end;

procedure TForm1.saveComponent(comp: TComponent);
var
aStream: TStream;
begin
aStream := TFileStream.Create(FFileComp, fmcreate);
try
aStream.WriteComponent(comp);
finally
aStream.Free;
end;
end;

procedure TForm1.loadComponent(comp: TComponent);
var
aStream: TStream;
begin
RegisterClasses([TButton, TLabel, TMemo]);
aStream := TFileStream.Create(FFileComp, fmOpenRead);
try
aStream.ReadComponent(comp);
finally
aStream.Free;
end;
end;

procedure TForm1.btn_saveClick(Sender: TObject);
begin
swapOwner(form1, panel1, panel1);
caption := (objList.Items[1] as TControl).Owner.Name;
saveComponent(panel1);
end;

procedure TForm1.btn_loadClick(Sender: TObject);
var
pnl: TPanel;
begin
pnl := TPanel.Create(form2);
pnl.Parent := form2;
loadComponent(pnl);
form2.Show;
end;

procedure TForm1.swapOwner(oldOwner, oldParent, newOwner: TComponent);
var
i: integer;
tmpControl: TComponent;
begin
for i := oldOwner.ComponentCount - 1 downto 0 do
begin
if (oldOwner.Components as TControl).Parent = oldParent then
begin
objList.Add(oldOwner.Components);
tmpControl := oldOwner.Components;
oldOwner.RemoveComponent(tmpControl);
newOwner.InsertComponent(tmpControl);
end;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
objList.Free;
end;

end.
////////////////////////////////////////////////////////////////////

 
谢谢!!
这个问题这么旧了,也没其他人来答了。 算了,给分吧!!
 
后退
顶部