gpt4 book ai didi

delphi - 在 Delphi 5 中创建面板的精确副本

转载 作者:行者123 更新时间:2023-12-03 15:26:15 25 4
gpt4 key购买 nike

我有一个 TPanel pnlMain,其中根据用户操作、数据验证等创建了几个动态 TPanel(pnlMain 是它们的父级)。每个面板都包含一个充满字符串的彩色网格。除了面板之外,还有一些开源箭头组件和图片。一大堆东西。

现在我希望用户能够打印此面板(我问如何做到 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文章

关于delphi - 在 Delphi 5 中创建面板的精确副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1238122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com