Domanda

Ho un TPanel pnlMain, dove si creano diversi TPanels dinamici (e pnlMain è il loro padre) in base alle azioni dell'utente, convalide di dati, ecc Ogni pannello contiene una griglia colorata piena di stringhe. Oltre ai pannelli, ci sono alcune frecce sorgente componenti open e una foto. Sacco di roba.

Ora voglio utente sia in grado di stampare questo pannello (ho chiesto come si fa su questa domanda ), ma prima della stampa, l'utente deve essere presentato con una nuova forma, contenente copia di pnlMain. Su questo utente modulo deve fare alcune modifiche, aggiungere pochi componenti e quindi stampare la propria copia personalizzata di pnlMain. Dopo aver stampato utente chiuderà questo modulo e tornare alla forma originale con pnlMain originale. E - come si può intuire -. PnlMain originale deve rimanere intatto

Quindi non v'è alcun modo intelligente per copiare tutta TPanel ed il suo contenuto? So che posso farlo scorrendo manualmente attraverso la lista pnlMain.Controls.

È stato utile?

Soluzione

Codice based come iterazione su controlli figlio, ma non male in ogni caso; -)

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 articolo

Altri suggerimenti

troppo codice ... ObjectBinaryToText e ObjectTextToBinary fanno il lavoro bene con streaming. Delphi 7 ha un esempio di codice, non so 2009 (o nel 2006, mai preoccupato di cercare) ancora averla. Vedere file di aiuto D5 per quelle funzioni (non hanno d5 disponibile qui).

Lo farei utilizzando RTTI per copiare tutte le proprietà. Avresti ancora a iterare su tutti i controlli, ma quando è necessario impostare i valori delle proprietà, RTTI possibile automatizzare il processo. È possibile ottenere un esempio verso il fondo della questo articolo , dove troverete un link al codice di supporto, tra cui una routine CopyObject.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top