Erstellen Sie eine genaue Kopie von TPanel auf Delphi5
-
11-09-2019 - |
Frage
Ich habe einen TPANEL PNLMAIN, bei dem mehrere dynamische TPANELs erstellt werden (und PNLMain ist ihre Eltern) gemäß den Benutzeraktionen, Datenvalidierungen usw. Jedes Panel enthält ein farbiges Netz voller Zeichenfolgen. Abgesehen von Panels gibt es einige Open -Source -Pfeilekomponenten und ein Bild. Ganzes Haufen Sachen.
Jetzt möchte ich, dass der Benutzer dieses Panel drucken kann (ich fragte, wie es geht auf diese Frage), aber vor dem Drucken muss dem Benutzer ein neues Formular mit Kopie von PNLMain präsentiert werden. In diesem Formular muss der Benutzer einige Änderungen vornehmen, einige Komponenten hinzufügen und dann seine angepasste Kopie von PNLMain drucken. Nach dem Drucken schließt der Benutzer dieses Formular und kehrt mit originalem PNLMain in Originalform zurück. Und - wie Sie erraten können, muss der ursprüngliche PNLMain intakt bleiben.
Gibt es also eine clevere Möglichkeit, ganze TPanel und seinen Inhalt zu kopieren? Ich weiß, ich kann es manuell durch pnlmain.controls liste iterieren lassen.
Lösung
Code basiert als Iteration auf Kinderkontrollen, aber sowieso nicht schlecht ;-)
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;
Code von Delphi3000 Artikel
Andere Tipps
Zu viel Code ... ObjectBinaryTotext und ObjectTextTobinary machen den Job mithilfe von Streaming gut. Delphi 7 habe ein Code -Beispiel, weiß nicht 2009 (oder 2006, nie die Mühe zu schauen). Siehe D5 Help -Datei für diese Funktionen (haben Sie hier nicht D5 verfügbar).
Ich würde es tun, indem ich RTTI zum Kopieren aller Eigenschaften verwenden würde. Sie müssten immer noch alle Steuerelemente iterieren, aber wenn Sie die Eigenschaftswerte einrichten müssen, kann RTTI den Prozess automatisieren. Sie können ein Beispiel nach unten finden Dieser Artikel, wo Sie einen Link zu einem Helfercode finden, einschließlich a CopyObject
Routine.