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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top