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 :

FileStream et débuggage


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut FileStream et débuggage
    Bonjour,

    J'ai des soucis avec ce 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
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    type
     
    PAtome = ^TAtome;
    TAtome = record
        Index : Integer;
        Mot : WideString;
        end;
     
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    Var
     i : Integer;
     vChaine : WideString;
     vPMot : PAtome;
     
    begin
      List_Test := Tlist.Create;
      for i:=0 to 10 do
        begin
        New(vPMot);
        vPMot.Mot := 'Chaine '+WideChar(12448+i);
        vPMot.Index := i+1;
        List_Test.Add(vPMot)
        end;
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      List_Test.Clear;
      List_Test.Free;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      i : Integer;
      vChaine : WideString;
      vPMot : PAtome;
      vNomFichier : String;
      vF : TFileStream;
    begin
      vF.Create('Test_Liste.cvs', fmOpenWrite);
    for i:=0 to List_Test.Count-1 do
      begin
    //  vF.Create('Test_Liste.cvs', fmOpenWrite);
      vPMot :=  List_Test.Items[i];
      vF.Write(vPMot^.Mot, Length(vPMot^.Mot)*Sizeof(WideChar)+1);
    //  vF.Free;
      end;
    vF.Free;
    end;
     
     
    procedure TForm1.Button2Click(Sender: TObject);
    Var
      i : Integer;
      vChaine : WideString;
      vPMot : PAtome;
      vNomFichier : String;
      vF : TFileStream;
    begin
    for i:=0 to List_Test.Count-1 do
      begin
      vF.Create('Test_Liste.cvs', fmOpenWrite);
      vPMot :=  List_Test.Items[i];
      vF.Write(vPMot^.Mot, Length(vPMot^.Mot)*Sizeof(WideChar)+1);
      vF.Free;
      end;
    end;
    Avec le Btn1, le filestream s'ouvre, mais la boucle for ne s'exécute pas, et le FS est libéré aussitôt

    Avec le btn2, le prog rentre dans la boucle for, pour en sortir aussitôt que le FS est ouvert en écriture

    Je n'ai pas encore testé un Btn3

    Quelqu'un pourrait-il m'indiquer ce qui foire, ou comment régler le débuggueur pour que ça marche ?

    Merci pour vos conseils

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    fmCreate si le fichier n'existe pas.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    Merci pour tes infos.

    C'est pour cela que j'ai un fichier qui existe.

    Mais fmCReate, si le fichier n'existe pas, donne exactement le même comportement.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    Je viens de faire un essai, non pas en mode debug, mais en lançant le programme.

    Que le mode soit en , fmOpenWrite ou en fmCreate, j'ai à l'exécution la même erreur, quelle que soit la façon de créer le fichier (à l'intérieur de la boucle for -Btn2- , ou à l'extérieur, Btn1) :

    "Access violation at adress 004034AA in module ProjTest.exe'. Read of adress 000000EF

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Pourquoi ne pas utiliser simplement TWideStringList (Unité WideStrings) ?

    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
    49
    50
    51
    unit Unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, WideStrings;
     
    type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        WS :TWideStringList;
      end;
     
    var
      Form2: TForm2;
     
    const
      UnicodeFileTag = #$FEFF;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i: Integer;
     
    begin
      WS := TWideStringList.Create;
      WS.Text := UnicodeFileTag;
     
      for i := 0 to 10 do
        WS.Add('Chaîne ' +WideChar(12448+i));
    end;
     
    procedure TForm2.FormDestroy(Sender: TObject);
    begin
      WS.Free;
    end;
     
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      WS.SaveToFile('c:\temp\Test_Liste.cvs');
    end;
     
    end.

  6. #6
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par delphidebutant Voir le message
    Quelqu'un pourrait-il m'indiquer ce qui foire, ou comment régler le débuggueur pour que ça marche ?
    ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vF.Create('Test_Liste.cvs', fmOpenWrite);
    doit être remplacé par cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vF := TFileStream.Create('Test_Liste.cvs', fmOpenWrite);


    de plus, il est préférable de coder la création+libération du FileStream dans un bloc try finally ainsi tu es sur que ce dernier sera toujours libéré.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      vF := TFileStream.Create('Test_Liste.cvs', fmOpenWrite);
      try
        // instructions
      finally
        vF.Free;
      end;
    et comme l'a mentionné AndNotOr, n'est ce pas plus simple d'utiliser une TWideStringList ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    Merci beaucoup pour votre coup de main.

    J'ai essayé le TWideStringList, qui effectivement, parait simple d'emploi (j'avais cherché un équivalent au Textfile, mais je n'avais rien trouvé dans la doc en ligne delphi)

    Avec le TWideStringList, les premières chaines s'affichent correctement, mais j'ai une fin de fichier impromptue. Bizarre : au pas à pas, tout à l'air de bien se passer, pourtant.

    Je me demandais aussi à quoi servait le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const
      UnicodeFileTag = #$FEFF;
    J'ai fait un essai avec un autre TWideStringList, sans ce tag, et il marche exactement comme le 1é.

    Lui aussi avec une fin qui me mange les dernières chaines de ma boucle for

    le TFilestream (et autre merci à evarisnea pour le code) m'affiche lui des chaines bizarres. Il faudrait que je rajoute un saut de ligne dans mon cvs, pour être sûr que le compte y est, pour les chaines....mais avec un affichage étrange .

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    FEFF est le tag qu'on devrait retrouver au début d'un fichier codé en unicode.
    Si le fichier que tu génères est pour ton propre usage, tu peux l'ignorer. S'il doit être ouvert dans une autre application, ce serait mieux de le mettre. Certains éditeurs s'emmêlent les pinceaux s'il est absent.

    A toi de faire des essais

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Points : 68
    Points
    68
    Par défaut
    OKI, merci

    par contre, est-ce normal que WS.SaveToFile ne sauve qu'un peu plus de la moitié de la liste ?

    Je ne trouve pas comment entrer dans la fonction de sauvegarde, au pas à pas, et je ne vois pas d'où peut provenir le pb

Discussions similaires

  1. [CR][.Net] Plantage état et débuggage
    Par SoaB dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 11/05/2007, 09h39
  2. débuggage
    Par denn dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 12/01/2006, 10h51
  3. débuggage a distance
    Par benoit70 dans le forum MFC
    Réponses: 1
    Dernier message: 25/10/2005, 23h35
  4. erreur au débuggage
    Par biscot19 dans le forum MFC
    Réponses: 3
    Dernier message: 22/04/2004, 08h50

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