Crie uma cópia exata do tpanel no delphi5
-
11-09-2019 - |
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.
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.