Crear una copia exacta del panel en Delphi 5
-
11-09-2019 - |
Pregunta
Tengo un TPanel pnlMain, donde se crean varios TPanels dinámicos (y pnlMain es su Padre) de acuerdo con las acciones del usuario, validaciones de datos, etc. Cada panel contiene una rejilla de color lleno de cuerdas. Además de los paneles, hay algunos componentes flechas de código abierto y una imagen. Gran cantidad de cosas.
Ahora quiero usuario sea capaz de imprimir este panel (Le pregunté cómo hacerlo en esta pregunta ), pero antes de la impresión, el usuario debe ser presentada con una nueva forma, que contiene copia de pnlMain. En esta forma el usuario tiene que hacer algunos cambios, agregar algunos componentes y luego imprimir su copia personalizada de pnlMain. Después de imprimir usuario cerrará este formulario y volver a su forma original con pnlMain originales. Y - como se puede adivinar -. PnlMain original debe permanecer intacto
Entonces, ¿hay alguna forma inteligente de copiar toda TPanel y su contenido? Sé que puedo hacerlo manualmente a través de la iteración lista pnlMain.Controls.
Solución
Código basado en la iteración como controles secundarios, pero no está mal de ninguna manera; -)
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 artículo
Otros consejos
El exceso de código ... ObjectBinaryToText y ObjectTextToBinary hacer el trabajo muy bien el uso de streaming. Delphi 7 tiene un ejemplo de código, no sé 2009 (o 2006, nunca se molestó en mirar) todavía tienen. Ver archivo de ayuda para aquellas funciones D5 (D5 no tienen disponible aquí).
lo haría utilizando RTTI para copiar todas las propiedades. Usted aún tiene que iterar sobre todos los controles, pero cuando es necesario para establecer los valores de las propiedades, RTTI puede ayudar a automatizar el proceso. Puede obtener un ejemplo hacia el fondo del este artículo , donde encontrará un enlace a algún código de ayudante, incluyendo una rutina CopyObject
.