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 :

[TFileStream] : LoadFromStream et read : incompatible ?


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut [TFileStream] : LoadFromStream et read : incompatible ?
    Bonjour à tous :

    J'utilise le code suivant comme exemple, pour sauvegarder :

    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
     
    var fich:TFileStream;
         signet:TStringList;
         co:integer;
     
    procedure Save;
    begin
        fich:=TFileStream.Create('essai',fmcreate);
        signet.savetostream(fich);
        fich.write(co,sizeof(co));
        fich.free;
    end;
     
     
    procedure Load;
    begin
        fich:=TFileStream.Create('essai',fmOpenRead);
        signet.LoadFromStream(fich);
        fich.read(co,sizeof(co));
        fich.free;
    end;
    Et la variable CO contient la même valeur qu'avant l'instruction read (aléatoire)

    Si j'inverse comme ceci dans le code :
    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
     
    var fich:TFileStream;
         signet:TStringList;
         co:integer;
     
    procedure Save;
    begin
        fich:=TFileStream.Create('essai',fmcreate);
        fich.write(co,sizeof(co));
        signet.savetostream(fich);
        fich.free;
    end;
     
     
    procedure Load;
    begin
        fich:=TFileStream.Create('essai',fmOpenRead);
        fich.read(co,sizeof(co));
        signet.LoadFromStream(fich);
        fich.free;
    end;
    Alors CO contient bien la valeur sauvegardée, pourquoi ?

    Où est mon erreur ? [/code]

  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
    Il n'y a pas d'erreur, juste une mauvaise compréhension de l'effet de LoadFromStream. Cette méthode considère que tout ce qui se trouve après la position du flux est la liste à charger.
    La solution est d'écrire toi-même le nombre de chaînes puis chacune des chaînes dans le flux et de faire la même chose à la lecture.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Merci pour cette précision importante!

    Un salut amical de tournai!

  4. #4
    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 jmdeffet
    Un salut amical de tournai!
    Le bonjour de Frasnes

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    J'ai trouvé une méthode très efficace pour réaliser cela :

    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
     
    procedure SaveSignet;
    var l:integer;
        s:string;
    begin
      with CurrentPrj,CurrentPrjFile do
        begin
         s:=Signet.Text;
         l:=Length(s);
         write(l,sizeof(l));
         if l<>0 then write(s[1],l);
        end;
    end;
     
    procedure LoadSignet;
    var l:integer;
        s:string;
    begin
      with CurrentPrj,CurrentPrjFile do
        begin
          s:='';
          read(l,sizeof(l));
          if l<>0 then
            begin
             setlength(s,l);
             read(s[1],l);
            end;
          Signet.Text:=s;
        end;
    end;
    La propriété TEXT fait ça toute seule.

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

Discussions similaires

  1. TFileStream et LoadFromStream
    Par frantzgac dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/10/2011, 17h16
  2. D7 - Tfilestream - pb sur Read
    Par RamDevTeam dans le forum Langage
    Réponses: 2
    Dernier message: 11/08/2005, 14h53
  3. [LG]problème de read / readln
    Par jeremie60 dans le forum Langage
    Réponses: 7
    Dernier message: 08/06/2003, 23h33
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 15h00

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