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

Delphi Discussion :

TFileStream :assigner une variable avec le contenu du fichier


Sujet :

Delphi

  1. #1
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut TFileStream :assigner une variable avec le contenu du fichier
    bonjour a tous,

    j'essaye avec une bete boite de dialogue et un bouton de transferer le contenu d'un fichier dans une variable mais j'ai du mal a comprendre l'utilisation du 1er argument de la méthode : TFileStream.Read(varBuffer,Count)
    l'aide ne decrit pas la maniere de recuperer le contenu du fichier avec varBuffer ni de l'utiliser d'ailleurs ...
    j'ai essayé de déclarer ma variable buffer de type String mais j'avais desplantages avec les gros fichiers donc je suis passé en AnsiString ... la j'ai plus de plantage mais la variable est toujours vide et la taille lu est égal a 0

    quelqu'un sait comment recuperer le contenu de ce fichier et l'assigner a une variable en utilisant ce systeme en une fois et sans boucle ?
    je joins le code.


    merci


    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
     
    procedure TForm1.btOuvrirClick(Sender: TObject);
    var tfFile:TFileStream;
    var inTaille:integer;
    var buffer:string;
    begin
    	if OpenDialog1.Execute() then
    		begin
    			tfFile := TFileStream.create(OpenDialog1.FileName, fmOpenRead, fmShareDenyWrite);
    			tfFile.Seek(soFromBeginning, 0);
    			inTaille := tfFile.read(buffer, tfFile.Size);
    			ShowMessage('taille lu : '+IntToStr(inTaille)+#10#13+'taille buffer : '+IntToStr(length(buffer)));
    			tfFile.Free();
    		end
    	else
    		begin
    			Memo1.Text := '';
    		end
    end;

  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
    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
    procedure TForm1.btOuvrirClick(Sender: TObject);
    var tfFile:TFileStream;
    var inTaille:integer;
    var buffer:string;
    begin
        if OpenDialog1.Execute() then
            begin
                tfFile := TFileStream.create(OpenDialog1.FileName, fmOpenRead, fmShareDenyWrite);
                tfFile.Seek(soFromBeginning, 0);
                SetLength(buffer, tfFile.Size);
                inTaille := tfFile.read(buffer[1], tfFile.Size);
                ShowMessage('taille lu : '+IntToStr(inTaille)+#10#13+'taille buffer : '+IntToStr(length(buffer)));
                tfFile.Free();
            end
        else
            begin
                Memo1.Text := '';
            end
    end;

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    sjrd, c'est bien ce qu'il manquait.

    Voilà un extrait de la bibliothèque Jedi JCL :
    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
    function FileToString(const FileName: string): AnsiString;
    var
      fs: TFileStream;
      Len: Integer;
      {$IFDEF CLR}
      Buf: array of Byte;
      {$ENDIF CLR}
    begin
      fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
      try
        Len := fs.Size;
        SetLength(Result, Len);
        if Len > 0 then
        {$IFDEF CLR}
        begin
          SetLength(Buf, Len);
          fs.ReadBuffer(Buf, Len);
          Result := Buf;
        end;
        {$ELSE}
          fs.ReadBuffer(Result[1], Len);
        {$ENDIF CLR}
      finally
        fs.Free;
      end;
    end;
     
    procedure StringToFile(const FileName: string; const Contents: AnsiString);
    var
      fs: TFileStream;
      Len: Integer;
    begin
      fs := TFileStream.Create(FileName, fmCreate);
      try
        Len := Length(Contents);
        if Len > 0 then
        {$IFDEF CLR}
          fs.WriteBuffer(BytesOf(Contents), Len);
        {$ELSE}
          fs.WriteBuffer(Contents[1], Len);
        {$ENDIF CLR}
      finally
        fs.Free;
      end;
    end;

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    ca ne solutionne pas le probleme, la var buffer reste toujours vide et la taille lu est egal a 0
    j'essaye d'assigner le contenu de buffer a un champ memo pour la verif :
    Memo1.Text := buffer;
    mais rien

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 868
    Points : 11 347
    Points
    11 347
    Billets dans le blog
    6
    Par défaut
    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
     
    procedure TForm1.btOuvrirClick(Sender: TObject); var tfFile:TFileStream; var inTaille:integer; var buffer:string; begin if OpenDialog1.Execute() then begin tfFile := TFileStream.create(OpenDialog1.FileName, fmOpenRead, fmShareDenyWrite); tfFile.Seek(soFromBeginning, 0); SetLength(buffer, tfFile.Size); inTaille := tfFile.read(@buffer[1], tfFile.Size); ShowMessage('taille lu : '+IntToStr(inTaille)+#10#13+'taille buffer : '+IntToStr(length(buffer))); tfFile.Free(); end else begin Memo1.Text := ''; end end;

  6. #6
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    maintenant j'ai une erreur
    [Erreur] Unit1.pas(78): Un objet constante ne peut être passé comme paramètre Var
    ca ne peut pas etre aussi compliqué de faire une simple assignation ?


    -----
    j'ai testé divers soluces et en essayant ceci :
    inTaille := tfFile.read(buffer[1], tfFile.Size);
    ca fonctionne

    merci

    j'ai l'impression de nager en pleine 4eme dimension
    je deteste ne pas comprendre quelque chose

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut,

    la solution ta ete donnée plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     SetLength(buffer, tfFile.Size);
     tfFile.ReadBuffer(buffer[1], tfFile.Size);
    @+ phil


    PS: apres relecture si c'est un string il faut ecrire a partir de la position [1]
    la position [0] etant reserver pour indiquer la longueur de la chaine (du moins a l'origine du pascal )

  8. #8
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par tourlourou
    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
     
    procedure TForm1.btOuvrirClick(Sender: TObject); var tfFile:TFileStream; var inTaille:integer; var buffer:string; begin if OpenDialog1.Execute() then begin tfFile := TFileStream.create(OpenDialog1.FileName, fmOpenRead, fmShareDenyWrite); tfFile.Seek(soFromBeginning, 0); SetLength(buffer, tfFile.Size); inTaille := tfFile.read(buffer[1], tfFile.Size);//sans @ ShowMessage('taille lu : '+IntToStr(inTaille)+#10#13+'taille buffer : '+IntToStr(length(buffer))); tfFile.Free(); end else begin Memo1.Text := ''; end end;

  9. #9
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    edam :
    tourlourou a mis un @ devant le nom de la var ce qui faisait planter !
    c'est en testant sans le @ que j'ai vu que ca fonctionnait


    la question maintenant c'est pourquoi faire ca ?

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    parce que le string reserve la position zero

    @+ phil

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par anapurna
    salut

    parce que le string reserve la position zero

    @+ phil
    pas exactement

    deux type de string existe sous delphi
    1-string length (4Goct max) delphi resérve 4 oct avant le string pour contenir la taill a (peut prés s[-3] à s[0])
    en plus pour réserve de la memoir en doit passé par setlength
    2-string pascal (<256) s[0] contient la taill , ici delphi réserve par defaut 256 quelque soit la tail exact du string dans s

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    merci pour ce complement d'infos
    mais le resultat est le meme la position zero du string est reservé

    @+ phil

  13. #13
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    blockread prend comme 2 paramétre l'adresse du variable passé
    alors s[1] c'est l'adresse du début de string et @s[1] c'est l'adresse de l'adresse du string
    pour le comprendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button1Click(Sender: TObject);
    var
       s:string;
       i:integer;
       f:file;
       p:Pointer;
    begin
         setlength(s,200);
         p:=@s[1];      
           blockread(f,s[1],200,i);
        showmessage(inttostr(integer(p)));
    end;
    ce code pas exucuté complétement
    fait le point d'arrét à p:@s[1] et voir l'assembleur résultant dans le fenetre CPU; tu peut comprendre que p contient le même adresse passé en 2éme pramétre de Blockread

  14. #14
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    merci les gars pour ces infos

    j'aurais jamais trouvé ce systeme tout seul !

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

Discussions similaires

  1. Récupérer le contenu d'une variable avec liste déroulante
    Par SteffieLili dans le forum QlikView
    Réponses: 8
    Dernier message: 19/05/2014, 17h56
  2. Réponses: 14
    Dernier message: 23/03/2011, 20h39
  3. [PHP 4] Affichage d'une image avec chemin contenu dans une variable
    Par terrysharp dans le forum Langage
    Réponses: 1
    Dernier message: 16/07/2009, 14h54
  4. executer une requete avec le contenu d'une variable
    Par giloo(94) dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/02/2007, 01h58
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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