IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

[D2007] Sérialisation de composant


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut [D2007] Sérialisation de composant
    Bonjour,

    J'ai besoin de sérialiser un composant (disons un TPanel pour l'exemple) et l'ensemble des composants qu'il contient, récursivement.
    Mon problème est que je n'obtiens pas ce que je souhaite, c-a-d justement une sérialisation récursive du composant.
    Dans mon test trivial, je pose un TPanel (panel1) sur une fiche. Dans panel1 je pose un panel2 et dans panel2 je pose un panel3.
    Je demande ensuite la chaîne de sérialisation avec cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    function GetComponentDefinition(aComp: TComponent): string;
    var
      StreamChar: TMemoryStream;
      StreamBin:  TMemoryStream;
    begin
      StreamBin := TMemoryStream.Create;
      try
        StreamBin.WriteComponent(aComp);
        StreamChar := TMemoryStream.Create;
        try
          StreamBin.Position := 0;
          ObjectBinaryToText(StreamBin, StreamChar);
          StreamChar.Position := 0;
          Result := '';
          SetLength(Result, StreamChar.Size);
          StreamChar.Read(Result[1], StreamChar.Size);
        finally
          StreamChar.Free;
        end;
      finally
        StreamBin.Free;
      end;
    end;
    voici le résultat de GetComponentDefinition(panel1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    object Panel1: TPanel
      Left = 12
      Top = 20
      Width = 261
      Height = 521
      TabOrder = 1
    end
    Je m'attendais à ce qu'il contienne aussi la définition de panel2 lui-même contenant la définition de panel3 (comme dans le dfm de la fiche).

    J'ai pensé que la procédure de sérialisation de Delphi utilise la propriété Owner (components) et non Parent (controls). Et effectivement lorsqu'on pose les panels les uns dans les autres le Owner est la fiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //Panel2 (parent: Panel1, owner: Form1)
    //Panel3 (parent: Panel2, owner: Form1)
     
    //sérialisation de panel1
    object Panel1: TPanel
      Left = 12
      Top = 20
      Width = 261
      Height = 521
      TabOrder = 1
    end
    J'ai donc créé une procédure qui réaffecte le Owner des composants à leur parent (InsertComponent), mais j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //Panel2 (parent: Panel1, owner: Panel1)
    //Panel3 (parent: Panel2, owner: Panel2)
     
    //sérialisation de panel1
    object Panel1: TPanel
      Left = 12
      Top = 20
      Width = 261
      Height = 521
      TabOrder = 1
      object Panel2: TPanel
        Left = 28
        Top = 28
        Width = 213
        Height = 417
        Caption = 'Panel2'
        TabOrder = 0
      end
    end
    Où est-donc le panel3 ? Je précise que la sérialisation ne m'affiche pas plus que le premier niveau d'inclusion alors que les Owners sont tous correctement affectés.

    Comment obtenir une sérialisation correcte d'un composant visuel quelconque contenant lui-même n-composants visuels etc.. ?

    Edit: Le parcours récursif lors de la sérialisation devrait quand même utiliser les "controls". En fait, je ne sais pas du tout comment cela fonctionne réellement...

    Merci pour vos idées.

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Par défaut Trouvé !
    J'ai trouvé la réponse à mon problème dans cet article :

    http://www.delphi3000.com/articles/article_2969.asp

    " The trick here is that both components have to be owned by the root component before we saved them."
    Tous les composants imbriqués doivent avoir comme Owner le composant sérialisé (dans mon exemple panel1).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    //Panel2 (parent: Panel1, owner: Panel1)
    //Panel3 (parent: Panel2, owner: Panel1)
     
    //sérialisation de panel1
    object Panel1: TPanel
      Left = 8
      Top = 20
      Width = 261
      Height = 421
      TabOrder = 1
      object Panel2: TPanel
        Left = 28
        Top = 28
        Width = 213
        Height = 349
        TabOrder = 0
        object Panel3: TPanel
          Left = 36
          Top = 40
          Width = 137
          Height = 261
          TabOrder = 0
        end
      end
    end
    Il fallait le savoir !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/08/2008, 08h40
  2. [D2007]Comment installer les composants JEDI ?
    Par colorid dans le forum Composants VCL
    Réponses: 5
    Dernier message: 25/09/2007, 12h40
  3. Comment créer un composant sous D2007 ?
    Par colorid dans le forum Composants VCL
    Réponses: 1
    Dernier message: 18/09/2007, 11h03
  4. Sérialisation des composants graphiques
    Par sironimo dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 23/01/2007, 11h35
  5. Sérialisation d’objets autres que composants
    Par Promeneur dans le forum Delphi
    Réponses: 9
    Dernier message: 27/11/2006, 18h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo