在Delphi5上创建TPanel的精确副本
发布时间:2020-12-15 09:23:47 所属栏目:大数据 来源:网络整理
导读:我有一个TPanel pnlMain,根据用户操作,数据验证等创建了几个动态TPanel(并且pnlMain是它们的Parent).每个面板包含一个充满字符串的彩色网格.除了面板,还有一些开源箭头组件和图片.整堆的东西. 现在我希望用户能够打印这个面板(我问过如何操作on this questio
我有一个TPanel pnlMain,根据用户操作,数据验证等创建了几个动态TPanel(并且pnlMain是它们的Parent).每个面板包含一个充满字符串的彩色网格.除了面板,还有一些开源箭头组件和图片.整堆的东西.
现在我希望用户能够打印这个面板(我问过如何操作on this question),但在打印之前,必须向用户提供一个包含pnlMain副本的新表单.在此表单上,用户必须进行一些更改,添加少量组件,然后打印自定义的pnlMain副本.打印后,用户将关闭此表单并返回原始表单与原始pnlMain.而且 – 你可以猜到 – 原始的pnlMain必须保持完整. 那么有没有任何聪明的方法来复制整个TPanel及其内容?我知道我可以手动迭代pnlMain.Controls列表. 解决方法
代码基于对子控件的迭代,但无论如何都不错;-)
procedure TForm1.btn1Click(Sender: TObject); function CloneComponent(AAncestor: TComponent): TComponent; var XMemoryStream: TMemoryStream; XTempName: string; begin Result:=nil; if not Assigned(AAncestor) then exit; XMemoryStream:=TMemoryStream.Create; try XTempName:=AAncestor.Name; AAncestor.Name:='clone_' + XTempName; XMemoryStream.WriteComponent(AAncestor); AAncestor.Name:=XTempName; XMemoryStream.Position:=0; Result:=TComponentClass(AAncestor.ClassType).Create(AAncestor.Owner); if AAncestor is TControl then TControl(Result).Parent:=TControl(AAncestor).Parent; XMemoryStream.ReadComponent(Result); finally XMemoryStream.Free; end; end; var aPanel: TPanel; Ctrl,Ctrl_: TComponent; i: integer; begin //handle the Control (here Panel1) itself first TComponent(aPanel) := CloneComponent(pnl1); with aPanel do begin Left := 400; Top := 80; end; //now handle the childcontrols for i:= 0 to pnl1.ControlCount-1 do begin Ctrl := TComponent(pnl1.Controls[i]); Ctrl_ := CloneComponent(Ctrl); TControl(Ctrl_).Parent := aPanel; TControl(Ctrl_).Left := TControl(Ctrl).Left; TControl(Ctrl_).top := TControl(Ctrl).top; end; end; 代码来自Delphi3000文章 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |