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 :

Erreur aléatoire sur l'écriture d'un fichier


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Par défaut Erreur aléatoire sur l'écriture d'un fichier
    Bonsoir

    J'ai un soucis avec l'écriture d'un fichier sur l'évènement Form OnClose dans mon éditeur de programmation.
    Mon but étant de mettre un chemin vers les fichiers qui sont ouverts dans mon éditeur à la fin pour qu'ils soient réouvert à la prochaine ouverture. La réouverture fonctionne bien. Je stocke donc dans un fichier situé ./configuration/session.txt un nom de fichier par ligne.

    Mais le problème c'est que l'écriture fonctionne que quand elle veut le reste du temps elle lève une erreur sur le Rewrite (mauvais fichier)

    Voici mon 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
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      Fic: TextFile;
      nb, i : integer;
      page : TTabSheet;
      S: string;
      syn : TSynEdit;
    begin
    	deletefile(NameFicOpen);
    	AssignFile(Fic, NameFicOpen);
       {$I-}      // instruction pour le compilateur
    	Rewrite(Fic);
       {$I+}
       if IOResult <> 0 then MessageDlg('Erreur avec le fichier.', mtConfirmation, [mbOK], 0);
       nb := Form1.PageControl1.PageCount;
       for i:=0 to nb-1 do begin
          page := Form1.PageControl1.Pages[i];
          syn := TSynEdit(page.FindComponent('SynEdit'+ page.Name));
          if(syn.Modified = true) then
          	if MessageDlg('Voulez vous enregistrer les modifications de ' + page.Caption +  'avant de fermer l''application?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    			    	Form1.FichierSaveExecute(Sender);
    	  	if (page.Tag = 0) then
          	Writeln(Fic, page.Hint);
       end;
      	CloseFile(Fic);
    end;
    Je vois pas pourquoi ça ne marche pas toujours même après avoir forcé la destruction du fichier avant de le réécrire.
    Est ce qu'il faut un chemin complet et non relatif ?

    Quelqu'un aurait une idée ? Parce que moi je sèche.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    As-tu véfifié que NameFichOpen contient bien un nom correct lors de l'éxectuion à l'aide de breakpoint?
    De plus il y a plusieurs erreurs dans ton code:
    • Si le fichier n'a pas pu s'ouvrir, l'éxection continue quand même et essaie d'écrire dedans.
    • Le CloseFile se fait même lorsque le fichier n'a pas pu s'ouvrir
    Essaie comme ça:
    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 TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      Fic: TextFile;
      nb, i : integer;
      page : TTabSheet;
      S: string;
      syn : TSynEdit;
    begin
        DeleteFile(NameFicOpen);
        AssignFile(Fic, NameFicOpen);
       {$I-}      // instruction pour le compilateur
        Rewrite(Fic);
       {$I+}
       if IOResult = 0 then
       begin
         nb := Form1.PageControl1.PageCount;
         for i:=0 to nb-1 do begin
            page := Form1.PageControl1.Pages[i];
            syn := TSynEdit(page.FindComponent('SynEdit'+ page.Name));
            if(syn.Modified = true) then
                if MessageDlg('Voulez vous enregistrer les modifications de ' + page.Caption +  'avant de fermer l''application?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
                          Form1.FichierSaveExecute(Sender);
                if (page.Tag = 0) then
                Writeln(Fic, page.Hint);
         end;
            CloseFile(Fic);
      end else
        MessageDlg('Erreur avec le fichier.', mtConfirmation, [mbOK], 0);
    end;
    Pour finir, je te conseille vivement d'utiliser les TStringList si le fichier texte n'est pas trop gros.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    Si ca plante sur le rewrite, c'est que probablement ton fichier est soit "locké" par ton programme ou un autre programme, soit en lecture seule car je ne vois pas d'autres raisons à ce que cela puisse planter à ce niveau là.

    Dés que tu ouvres un fichier par un reset ou un rewrite il faut poser un try finally pour fermer ton fichier du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Rewrite(fichier)
    try
      mes Instructions
    finally
      CloseFile(Fichier)
    end;
    Ton problème se situe donc probablement sur la réouverture des derniers fichiers que tu as ouvert et pas seulement à ce niveau du programme.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Pour ma part je serai du même avis que Pedro pour l'utilisation d'un TStringList.

    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 TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      lst : TStringList;
      nb, i : integer;
      page : TTabSheet;
      S: string;
      syn : TSynEdit;
    begin
      lst := TStringList.Create;
      try
        for i:=0 to PageControl1.PageCount - 1 do 
        begin
          page := PageControl1.Pages[i];
          syn := TSynEdit(page.FindComponent('SynEdit'+ page.Name));
          if(syn.Modified = true) then
            if MessageDlg('Voulez vous enregistrer les modifications de ' + page.Caption +  'avant de fermer l''application?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              FichierSaveExecute(Sender);
          if (page.Tag = 0) then
            lst.Add(page.Hint);
        end; // for
        try
          lst.saveToFile(NameFicOpen);
        Except on E:Exception do 
          MessageDlg('Erreur avec le fichier.', mtConfirmation, [mbOK], 0);
        end;
      finally
        lst.free;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Par défaut
    Si le fichier est locké, le fait d'utiliser à cet endroit du code un TStringList ne règlera pas plus le problème...

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Le problème peut venir du fait qu'il delete le fichier et l'ouvre tout de suite, avec le TStringList, il n'y a pas de problème vu que c'est lui qui se charge de l'écrasement du fichier.

    Il serait même bien de connaitre le IORESULT qu'il retourne, ca nous aiderai grandement pour savoir d'où vient le problème
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Ça manque d'informations précises, tout ça.
    Essaye donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       {$I-}      // instruction pour le compilateur
        Rewrite(Fic);
        showMessage(SysErrorMessage(GetLastError));
       {$I+}
    Avec peut-être un test sur GetLastError que c'est pas la peine que ça affiche 'Opération réussie' quand tout va bien.
    On y verra plus clair.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. Message d'erreur aléatoire sur Form.Visible
    Par bvsud dans le forum Langage
    Réponses: 5
    Dernier message: 07/12/2012, 21h44
  2. [Vxi3] Erreur aléatoire sur LOV
    Par NorocBzh dans le forum Webi
    Réponses: 2
    Dernier message: 23/12/2011, 08h12
  3. Erreur aléatoire sur File.delete
    Par davelop dans le forum ASP.NET
    Réponses: 5
    Dernier message: 11/12/2009, 17h07
  4. Erreurs aléatoires sur graphique à bulles
    Par RGShoop dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/06/2008, 16h29
  5. Erreur aléatoire sur une fonction
    Par defluc dans le forum Firebird
    Réponses: 8
    Dernier message: 10/09/2007, 16h34

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