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

Langage Delphi Discussion :

Sérialisation (mise en flux ) d'un contrôle


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut Sérialisation (mise en flux ) d'un contrôle
    Bonjour,

    Après une journée "noire" hier je vous passe les détails, j'ai besoin que l'on me remémore quelque chose que je ne retrouve pas sur mon pc (je devrais plutôt dire mes PC c'est bien là l'un des problèmes).
    Derrière mon mot barbare "sérialisation" se cache un truc sympa : récupérer les informations d'un contrôle modifier des informations et retourner alors ce contrôle modifié. Je ne sais pas si en fait j'emploie le terme exact mais c'est le but.
    Alain Weber, lors d'une présentation CodeWay à Nantes (plus d'un an déjà !) m'avait mis sur la piste lorsqu'il "triturait" les surfaces de ses objets 3D.
    S'il passe par là un grand salut et s'il peut me ré-indiquer de quel programme il s'agissait encore plus

    Bref, j'avais réussi à récupérer via cette technique (celle que ma mémoire défaillante à oublié) à récupérer le "texte dfm" d'un TBindingsList. A l'époque de ce petit programme test, je voulais (et avais réussi) en extraire la substantifique moelle dans le but de proposer un moyen d'avoir de la documentation programme. Je voulais ensuite en faire un outil pour l'IDE (ça c'était la partie délicate). Malheureusement, les circonstances, le boulot les autres projets etc. on fait que je ne suis pas (pour l'instant) allé jusqu'au bout.

    Mon problème est que je ne retrouve pas cet essai sur mes disques durs (et ma mémoire) j'étais persuadé qu'il s'agissait d'un TJSON.ObjectToJSONString mais, non si ce dernier fonctionne pour les objets personnels créés je n'arrive pas à l'appliquer à mes contrôles.

    Il y a quelque chose qui me manque, remettez moi sur la piste (froide), merci
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut Problème à moitié résolu
    Ma mémoire me jouait des tours ! pourquoi je m'acharnais sur du JSON alors que c'est ObjectBinaryToText et ObjectTextToBinary que je devrais utiliser ?

    Bon, il n'y a plus la presse, une nouvelle recherche Grep avec ces mots clés devrait me retrouver le source s'il n'a pas été supprimé lors de ma journée "noire"
    sinon, j'ai à nouveau la piste.
    En tout cas, si je retrouve ce bout de code, je crois que je vais le mettre à disposition sur le forum histoire d'augmenter mes chances de souvenirs avant de tutoyer Alzheimer
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut Yes !!
    Merci les Gexperts et leur Grep performant
    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
    27
    28
    29
    30
    31
    32
    33
     
    // largement inspiré du code de Alain Weber (uTreeComponent.pas) 
    function ComponentToStringProc(Component: TComponent): string;
    var
      BinStream:TMemoryStream;
      StrStream: TStringStream;
      s: string;
    begin
      BinStream := TMemoryStream.Create;
      try
        StrStream := TStringStream.Create(s);
        try
          BinStream.WriteComponent(Component);
          BinStream.Seek(0, soFromBeginning);
          ObjectBinaryToText(BinStream, StrStream);
          StrStream.Seek(0, soFromBeginning);
          Result:= StrStream.DataString;
        finally
          StrStream.Free;
        end;
      finally
        BinStream.Free
      end;
    end;
     
    // utilisation 
    procedure TForm10.Button1Click(Sender: TObject);
    var ALink : TObject;
    begin
     for ALink in BindingsList1
        do
    Memo1.Lines.Add(ComponentToStringProc(TComponent(Alink)));
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    je profite de ce monologue pour pointer un petit problème avec cette pratique, elle est fortement dépendante de la version de Delphi qui peut à loisir modifier la gestion du flux DFM d'une version à l'autre.

    j'ai déjà exposé dans un billet comment on pouvait jouer avec les DFM, mais à mon avis cela doit rester au sein de l'application et pas pour une sérialisation extérieure qui serait susceptible d'être exploitée par une autre version de Delphi.

    je lui préfère donc la sérialisation JSON, que ce soit celle des derniers Delphi ou un code maison, en plus cela permet facilement de reprendre les informations en dehors de Delphi.

    je travaille actuellement sur un projet dans lequel toutes les données sont échangées avec un site web au format JSON, au niveau du site c'est du PHP/MySQL mais ça pourrait être virtuellement n'importe quoi.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Bonsoir Paul,

    c'est bien pour cela que je faisais appel à la mémoire collective, la mienne défaillant ! J'étais bien parti sur une histoire de JSON mais je bute !
    la reprise de ce code m'indiquera peut-être où j'ai buté.
    En ce qui concerne le code c'est bien pour une "sérialisation" et à l'occasion dé-sérialisation interne à l'application et non vers d'autres versions d'ailleurs je doute que dans mon cas sérialisation soit le terme exact
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Bonjour,

    Citation Envoyé par SergioMaster Voir le message
    je doute que dans mon cas sérialisation soit le terme exact
    Moi j'appelle ça « mise en flux », tout simplement.

  7. #7
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut Un flux genre
    Bonjour,
    Use Rest.Json
    Créer un flux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          JsonString:= TJson.ObjectToJsonString(TCommandesInfos(TableInfos));
          Result:= TStringStream.Create;
          Result.WriteString(JsonString);
    Lire le flux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                  stream.WriteString(JSonString);
                  stream.Position := 0;
                  CommandesInfos:= TJson.JsonToObject<TCommandesInfos>(JSonString) ;
    ObjectToJsonString traduit également les propriété Objets dans le Json.
    Pour une fois, c'est trop facile. Il y a surement un piège :=

    Cordialement

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par alheuredudejeuner Voir le message
    Créer un flux
    Pour une fois, c'est trop facile. Il y a surement un piège :=
    Pour un objet créé/déclaré par le programme comme ton TCommandesInfos c'est ok, le piège c'est que c'est un contrôle (un BinaryObject) et le ObjectToJsonString ne fonctionne pas (ou plutôt ça plante avec un message d'erreur StackOverflow).
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Pour un objet créé/déclaré par le programme comme ton TCommandesInfos c'est ok, le piège c'est que c'est un contrôle (un BinaryObject) et le ObjectToJsonString ne fonctionne pas (ou plutôt ça plante avec un message d'erreur StackOverflow).
    je n'ai pas vérifié depuis XE8 mais sous XE8 JSON était un peu léger au niveau des contrôles d'intégrité, comme je l'indique sur mon site

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type
      TError1 = class
        v: array[0..5] of Byte;
      end;
    begin 
      m.Marshal(o).toJSON()
      Violation d'accès à l'adresse 00455998 dans le module 'JSONDemo.exe'. Lecture de l'adresse 00000004
    ebd,
    ici "v" ne possède pas d'information de type (RTTI) et JSON se vautre en faisant usage d'un pointeur invalide, dans mon code on obtient une exception "No RTTI informations for TError1.v."

    de même, si deux objets pointent mutuellement l'un sur l'autre le JSON de Delphi se termine sur un débordement de pile alors que mon code donne une exception du type "Circular reference in TOwnerObject.Child.TError2.Owner" qu'il convient de corriger en définissant une méthode JSONBuildField (cf mon unité).
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Serialiser de gros documents XML
    Par philemon_siclone dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 17/09/2003, 15h26
  2. Codes de contrôle des imprimantes
    Par hetzel dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 21/03/2003, 17h17
  3. [ActiveX] Propriété "Picture" dans un contrôle util
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/12/2002, 15h59
  4. [contrôle] dbDateTimePicker ???
    Par Fizgig dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/11/2002, 15h45
  5. [Kylix] Contrôle DBGrid
    Par KThrax dans le forum EDI
    Réponses: 1
    Dernier message: 10/05/2002, 14h18

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