Pergunta

Eu tenho um tpanel pnlmain, onde vários tpanels dinâmicos são criados (e o pnlmain é seu pai) de acordo com ações do usuário, validações de dados etc. Cada painel contém uma grade colorida cheia de strings. Além dos painéis, existem alguns componentes de setas de código aberto e uma imagem. Bando inteiro de coisas.

Agora eu quero que o usuário possa imprimir este painel (perguntei como fazer isso sobre esta pergunta), mas antes da impressão, o usuário deve receber um novo formulário, contendo cópia do PNLMain. Neste formulário, o usuário precisa fazer algumas alterações, adicionar poucos componentes e imprimir sua cópia personalizada do PNLMain. Após a impressão, o usuário fechará este formulário e retornará ao formulário original com o PNLMain original. E - como você pode adivinhar - o PNLMain original deve permanecer intacto.

Então, existe alguma maneira inteligente de copiar o TPanel inteiro e seu conteúdo? Eu sei que posso fazê -lo iterando manualmente na lista Pnlmain.Controls.

Foi útil?

Solução

Código baseado como iterando os controles da criança, mas não é ruim de qualquer maneira ;-)

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;

código de Delphi3000 artigo

Outras dicas

Muito código ... ObjectBinaryTotext e ObjectTextTobinary fazem o trabalho bem usando o streaming. O Delphi 7 tem um exemplo de código, não conheço 2009 (ou 2006, nunca se preocupou em procurar) ainda o possui. Consulte o arquivo de ajuda D5 para essas funções (não tenha D5 disponível aqui).

Eu faria isso usando o RTTI para copiar todas as propriedades. Você ainda teria que iterar sobre todos os controles, mas quando você precisa configurar os valores da propriedade, o RTTI pode ajudar a automatizar o processo. Você pode obter um exemplo no fundo de Este artigo, onde você encontrará um link para algum código auxiliar, incluindo um CopyObject rotina.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top