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 :

Enregistrement de record non finalisé


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut Enregistrement de record non finalisé
    Bonjour a tous, je voudrais savoir quelle méthode utiliser pour enregistrer le record si dessous:

    A savoir que mes "array" ne sont pas finalisés, Afin de limiter la taille de mes fichiers.

    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
     
    Type TEShape = record
      Id:Integer;
      Moved:boolean;
      Selected:boolean;
      Name:string[255];
      ...
      Pointpoly:array of tpoint;
      PointSelect:array of boolean;
      PointHit:array of boolean;
      ...
      PointMove:boolean;
      SegmentCourant:integer;
    end;
    Var EShape:array of TEShape;
     
     
    type TfShape = record
       Image:string[255];
       Shape:array of TEShape;
    end;
     
    var Fshape: file of TfShape;
    merci.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Utilise des flux (TStream), et pour tes tableaux dynamiques, commence par stocker la taille du tableau, et ensuite son contenu.

    Si tu veux une routine générique pour enregister/relire des tableaux dynamiques dans un flux, voici un jet non testé :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    uses
      TypInfo;
     
    procedure WriteDynArrayToStream(Stream: TStream; const DynArray; TypeInfo: PTypeInfo);
    var
      TypeData: PTypeData;
      Data: Pointer;
      Count: Integer;
    begin
      TypeData := GetTypeData(TypeInfo);
      if TypeData.elType <> nil then
        raise Exception.Create('Can''t serialize array of ' +
          TypeData.elType^^.Name);
     
      Data := Pointer(DynArray);
     
      if Data = nil then
      begin
        Count := 0;
        Stream.WriteBuffer(Count, SizeOf(Integer));
      end else
      begin
        Count := PInteger(Integer(Data)-SizeOf(Integer))^;
        Stream.WriteBuffer(Count, SizeOf(Integer));
        Stream.WriteBuffer(Data^, Count*TypeData.elSize);
      end;
    end;
     
    procedure ReadDynArrayFromStream(Stream: TStream; var DynArray; TypeInfo: PTypeInfo);
    var
      TypeData: PTypeData;
      Count: Integer;
    begin
      TypeData := GetTypeData(TypeInfo);
      if TypeData.elType <> nil then
        raise Exception.Create('Can''t serialize array of ' +
          TypeData.elType^^.Name);
     
      Stream.ReadBuffer(Count, SizeOf(Integer));
     
      if Count = 0 then
        DynArrayClear(Pointer(DynArray), TypeInfo)
      else
      begin
        DynArraySetLength(Pointer(DynArray), TypeInfo, 1, @Count);
        Stream.ReadBuffer(Pointer(DynArray)^, Count*TypeData.elSize);
      end;
    end;
    Ce que tu peux utiliser comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TPointDynArray = array of TPoint;
     
    WriteDynArrayToStream(Stream, EShape.pointPoly, TypeInfo(TPointDynArray));
     
    ReadDynArrayFromStream(Stream, EShape.pointPoly, TypeInfo(TPointDynArray));
    Au besoin, je peux en écrire une version récursive qui peut sérialiser n'importe quel record avec des chaînes et des tableaux dynamiques dedans, avec dans ces tableau dynamiques d'autres record dans le genre etc.
    Mais je ne le ferai que si tu en as besoin, parce que ça va me prendre 1 ou 2 heures quand même
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Tu peux aussi transformer ton record en une classe héritant de TComponent (je sais plus lourd), ou encapsuler ton record dans une classe juste pour faire Read\Write avec des propriétés publiées, c'est les tableaux qui poseront des problèmes, il faudrait le recoder en TCollection, c'est qui est bien lourd ...

    en dernier, c'est de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pointpoly[0.255]:array of tpoint;
    cela va agrandir ton fichier, mais c'est se simplifier la vie !

    Sinon sjrd, jolies fonctions génériques, moi je veux bien voir ce code récursrif juste pour le bonheur des yeux , ça mériterait une FAQ : "Comment écrire n'importe quel tableau dans un Stream", cela va en intéressé plus d'un ...

    Perso, quand j'ai des tableaux dynamiques, j'écrivais une fonction spécifique pour chaque types de tableaux ... c'est pour cela que j'écrivais toujours un TxxxReader et TxxxWriter pour remplir mes record ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    re salut ..

    En effet Sjrd, si tu as le temps je suis preneur du code récursif.. et comme le dis ShaiLeTroll je pense aussi que cela serait le bien venu dans ma Faq.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Bon ben dans ce cas, je m'y colle
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    Merci pour le temps que tu y passes !
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    salut et merci bcp pour ta rapidité et surtout "Chapeau" ! ,
    je vais essayer ton code , mais il me manque une unité enfin je crois ! la ScTypInfo.

    Ensuite n'etant pas du tout un utilisateur des streams.
    Je doit utiliser tes fonctions juste pour les écriture et lecture disque , redéfinir mon record ..

    Mon but etant de lire et d'ecrire un fichier du type ci dessous

    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
     
    Type TEShape = record
      Id:Integer;
      Selected:boolean;
      Name:string;
      ...
      Pointpoly:array of tpoint;
      ..
    end;
    Var EShape:array of TEShape;
     
     
    type TfShape = record
       Image:string;
       Indice:integer;
       Shape:array of TEShape;
    end;
     
    var Fshape: file of TfShape;
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Oublie le fichier typé (qui sont de longeurs fixe en terme de record), les fonctions de SJRD propose la même chose mais via les Streams avec des record à longueur variable ...

    Mon non plus, je n'étais pas très stream avant, mais finalement, cela s'utilise comme blockRead et BlockWrite ... c'est très simple ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par petitcoucou31 Voir le message
    je vais essayer ton code , mais il me manque une unité enfin je crois ! la ScTypInfo.
    Non elle est dans le même dossier :
    http://sepi.svn.sourceforge.net/view...as?view=markup
    Qui elle-même dépend de ScCompilerMagic :
    http://sepi.svn.sourceforge.net/view...as?view=markup
    Qui elle ne dépend de rien
    Ces deux unités existaient déjà avant dans la SCL, c'est pour ça que je n'ai pas les liens dès le début.

    Citation Envoyé par petitcoucou31 Voir le message
    Ensuite n'etant pas du tout un utilisateur des streams.
    Comma l'a dit ShaiLeTroll, mets-t'y C'est vraiment beaucoup plus simple à utiliser une fois qu'on a compris comment ça fonctionne.
    Citation Envoyé par petitcoucou31 Voir le message
    Je doit utiliser tes fonctions juste pour les écriture et lecture disque , redéfinir mon record ..

    Mon but etant de lire et d'ecrire un fichier du type ci dessous
    Alors soit tu as un tableau de TfShape, et tu fais :
    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
    type
      TfShapeDynArray = array of TfShape;
     
    procedure WriteToFile(const Shapes: TfShapeDynArray;
      const FileName: TFileName);
    var
      Stream: TStream;
    begin
      Stream := TFileStream.Create(FileName, fmCreate);
      try
        WriteDataToStream(Stream, Shapes, TypeInfo(TfShapeDynArray));
      finally
        Stream.Free;
      end;
    end;
     
    procedure ReadFromFile(var Shapes: TfShapeDynArray;
      const FileName: TFileName);
    var
      Stream: TStream;
    begin
      Stream := TFileStream.Create(FileName, fmOpenRead);
      try
        ReadDataFromStream(Stream, Shapes, TypeInfo(TfShapeDynArray));
      finally
        Stream.Free;
      end;
    end;
    Soit, tu travailles séquentiellement shape par shape, et alors tu préfèrereras :
    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
    34
    procedure WriteToFile(const FileName: TFileName);
    var
      Stream: TStream;
      I, Count: Integer;
      Shape: TfShape;
    begin
      Stream := TFileStream.Create(FileName, fmCreate);
      try
        for I := 0 to Count-1 do
        begin
          // Prépare Shape ici
          WriteDataToStream(Stream, Shape, TypeInfo(TfShape));
        end;
      finally
        Stream.Free;
      end;
    end;
     
    procedure ReadFromFile(const FileName: TFileName);
    var
      Stream: TStream;
      Shape: TfShape;
    begin
      Stream := TFileStream.Create(FileName, fmOpenRead);
      try
        while Stream.Position < Stream.Size do
        begin
          ReadDataFromStream(Stream, Shape, TypeInfo(TfShape));
          // Utilise Shape ici
        end;
      finally
        Stream.Free;
      end;
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  11. #11
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    Merci a tous les deux ..
    Donc je vais suivre de conseil de ShaiLeTroll, et me mettre aux streams. Surtout que j'ai souvent se problème de structure de record fixe que je devrais résoudre en utilisation ton code . merci
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/06/2008, 15h40
  2. Réponses: 3
    Dernier message: 13/11/2007, 15h45
  3. [GD] Image enregistrée avec imagepng() non disponible
    Par darokin dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 13/02/2007, 19h15
  4. Type enregistrement ou "record"
    Par SurfingJeff dans le forum Delphi
    Réponses: 8
    Dernier message: 08/11/2006, 16h02
  5. Réponses: 8
    Dernier message: 18/08/2006, 08h12

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