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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top