Créez une copie exacte de TPanel sur Delphi5
-
11-09-2019 - |
Question
J'ai un pnlmain tpanel, où plusieurs tpanels dynamiques sont créés (et pnlmain est leur parent) en fonction des actions des utilisateurs, des validations de données, etc. Chaque panneau contient une grille colorée pleine de chaînes. En dehors des panneaux, il y a des composants de flèches open source et une image. Tout entièrement de trucs.
Maintenant, je veux que l'utilisateur puisse imprimer ce panneau (j'ai demandé comment le faire sur cette question), mais avant l'impression, l'utilisateur doit être présenté avec un nouveau formulaire, contenant une copie de PNLMain. Sur ce formulaire, l'utilisateur doit effectuer des modifications, ajouter quelques composants, puis imprimer sa copie personnalisée de PNLMain. Après l'impression, l'utilisateur fermera ce formulaire et reviendra au formulaire d'origine avec PNLMain d'origine. Et - comme vous pouvez le deviner - le pnlmain d'origine doit rester intact.
Alors, y a-t-il un moyen intelligent de copier tout le tpanel et son contenu? Je sais que je peux le rendre manuellement itérant via la liste pnlmain.controls.
La solution
Code basé comme itérant sur les contrôles des enfants, mais pas mal de toute façon ;-)
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;
coder de Delphi3000 article
Autres conseils
Trop de code ... ObjectBinaryTotext et ObjectTextTobinary font bien en utilisant le streaming. Delphi 7 a un exemple de code, ne savez pas 2009 (ou 2006, jamais dérangé de regarder) l'ont toujours. Voir le fichier d'aide D5 pour ces fonctions (je n'ai pas D5 disponible ici).
Je le ferais en utilisant RTTI pour copier toutes les propriétés. Vous devrez toujours parcourir tous les contrôles, mais lorsque vous devez configurer les valeurs de propriété, RTTI peut aider à automatiser le processus. Vous pouvez obtenir un exemple vers le bas de Cet article, où vous trouverez un lien vers un code d'assistance, y compris un CopyObject
routine.