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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top