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 :

Runtime error dans un programme simple qui écrit dans un fichier ini


Sujet :

Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut Runtime error dans un programme simple qui écrit dans un fichier ini
    Bonjour,
    j'ai écrit une petite application qui clique périodiquement toutes les dix secondes dans un endroit donné de l'écran et je l'ai modifiée pour qu'elle se replace à l'ouverture à la place qu'elle était lorsqu'on l'a fermée la fois précédente.
    Cela me parait simple et cela fonctionne sauf qu'à chaque fois que je ferme cela déclenche un runtime error at 00405288.
    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
    var
      Form1: TForm1;
      X,Y: Integer;
      FichierIni: text;
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        AssignFile(FichierIni,'AutoRobot.ini');
        rewrite(FichierIni);
        writeln(FichierIni,IntToStr(Top));
        writeln(FichierIni,IntToStr(Left));
       CloseFile(FichierIni);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    Var Valeur: String;
    begin
      if FileExists('AutoRobot.ini') then
      Begin
        AssignFile(FichierIni,'AutoRobot.ini');
        reset(FichierIni);
        readln(FichierIni,Valeur);
        Top:=StrToInt(valeur);
        readln(FichierIni,Valeur);
        left:=StrToInt(valeur);
        CloseFile(FichierIni);
      End;
     
    end;
     
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      X:= Left-5;
      Y:=Top-5;
      CliquerGauche(X,Y);
    end;
    Qu'est-ce qui est anormal dans ce code qui génère l'erreur à la fermeture ?
    merci.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6 006
    Par défaut
    Problème de droits sur le répertoire. Tu devrais stocké ce fichier sous %AppData%.

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut runtime error
    Je ne comprends pas très bien les % ? Cela revient à quoi?
    J'ai créé une constante qui permet de tester facilement les emplacements de fichiers, voire leur nom.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Const
    NomFichier='C:\users\Gerard\Appdata\AutoRobot.ini';
    J'ai toujours la même erreur. j'ai essayé sans succès d'autres emplacements qui en principe n'ont pas de problème d'accès.
    Note : le programme fait bien ce que je veux. le fichier est bien créé, ce qui semble que l'accès au répertoire se fait et que le fichier est bien clos. J'ai mis quelques secondes d'attente après la fermeture du fichier et l'erreur ne se produit qu'à la fermeture de l'appli...

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut
    J'ai mis des conditions dans les deux procédures qui évitent la lecture et l'écriture dans le fichier (vérifié).
    J'ai toujours la même erreur à la fermeture..
    J'ai tout mis en commentaire et là j'ai une violation d'accès au moment de la compil...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Essaye de désactiver le Timer au début du FormClose.

    FichierIni est pas plutôt de type textfile ?
    En testant cela fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      FichierIni: textfile;
    begin
        AssignFile(FichierIni,'D:\AutoRobot.ini');
        rewrite(FichierIni);
        writeln(FichierIni,IntToStr(Top));
        writeln(FichierIni,IntToStr(Left));
       CloseFile(FichierIni);
    end;
    Pourquoi utiliser une variable globale si c'est pour assigner le fichier et le fermer ?

    Sinon avec une TStringList tu peux utiliser le LoadFromFile et SaveToFile et avoir un lien entre Name et Value.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    POSITION_TOP=100
    POSITION_LEFT=20
    Et tu peux récuperer les valeurs avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AutoRobot.Values[POSITION_TOP]

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 857
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    c'est un faux fichier INI (du moins INI à la mode TINIFILE contenant des groupes et des paires) mais bon je passe.

    %APPDATA% : indique une répertoire spécial, selon les versions de windows ce n'est pas toujours au même endroit
    Voir par exemple ceci
    bien sûr dépendant de la version de Delphi on a accès facilement a cette valeur ou pas pour les anciennes versions

    ce que AndNotOr voulait souligner c'est que le stockage des données d'une application devrait être dans l'équivalent de %APPDATA% selon l'OS car il peut, peut-être, avec les versions de windows Vista et plus y avoir un problème d'User Account Control.

    pour votre code, je m'interroge . Est-il judicieux d'utiliser un If FileExists, AMHA non, vous pouvez facilement forcer la création du fichier s'il n'existe pas (pour peu bien sûr que le répertoire existe) en utilisant un TFileStream à la place d'un TextFile mais aussi (avec une version de Delphi qui l'accepte, et selon votre besoin) vous pourriez utiliser simplement WriteAllText

    Enfin, le choix de l'événement pour la fermeture, je l'aurais plutôt mis dans le onCloseQuery

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    L'erreur n'est pas dans le code proposé à mon avis

    est-ce qu'un projet tout neuf avec ce code (un peu remanié mais fonctionnellement identique - au format de fichier près) fonctionne ?

    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
     
    var
      fichierIni: TextFile; 
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      AssignFile(FichierIni,'AutoRobot.ini');
      Rewrite(FichierIni);
      WriteLn(FichierIni, Left, ' ', Top);
      CloseFile(FichierIni);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    Var x, y: Integer;
    begin
      if FileExists('AutoRobot.ini') then
      Begin
        AssignFile(FichierIni,'AutoRobot.ini');
        reset(FichierIni);
        readln(FichierIni, x, y);
        CloseFile(FichierIni);
        SetBounds(x, y, Width, Height);
      End;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut
    Je pense avoir essayé pas mal de choses avant de vous contacter !
    J'ai essayé le FormCloseQuery (Mon premier choix!), le TextFile, d'arrêter le timer (ça je n'y avais pas pensé !), de faire un fichier .txt ...
    J'ai supprimé le timer aussi...
    J'ai aussi essayé les TStringList bien sûr, mais là cela plante !
    le fichier est bien correctement créé et cela fait ce que je veux sauf ce message d'erreur qui apparait à la fin.
    le plus curieux est que si je mets des tests qui évitent que les fichiers soient lus et écrits, cela génère quand même le message d'erreur à la fermeture comme si cela n'avait rien à voir avec le fichier....

  9. #9
    Invité
    Invité(e)
    Par défaut
    Tu as pas un événement Destroy après ?

    Tu peux poster plus de code source ? car comme ca ..

  10. #10
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut
    Voci tout le code : j'ai ajouté le contenu de la fonction Cliquergauche directement dans le timer.
    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
    71
    72
    73
    74
    unit Unit_AutoRobot;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,Utilitaires, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      X,Y: Integer;
      FichierIni: textfile;
     
    Const
    //NomFichier='C:\users\Gerard\Appdata\AutoRobot.ini';
    NomFichier='AutoRobot.txt';
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Timer1.Enabled:= false;
        AssignFile(FichierIni,NomFichier);
        rewrite(FichierIni);
        writeln(FichierIni,IntToStr(Top));
        writeln(FichierIni,IntToStr(Left));
       CloseFile(FichierIni);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    Var Valeur: String;
    begin
      if FileExists(NomFichier) then
      Begin
        AssignFile(FichierIni,NomFichier);
        try
        reset(FichierIni);
        readln(FichierIni,Valeur);
        Top:=StrToInt(valeur);
        readln(FichierIni,Valeur);
        left:=StrToInt(valeur);
        finally
          CloseFile(FichierIni);
        end;
      End;
     
    end;
     
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      X:= Left-5;
      Y:=Top-5;
      SetCursorPos(X,Y);
      mouse_event(MOUSEEVENTF_LeftDOWN , 0, 0, 0, 0);
      mouse_event(MOUSEEVENTF_LefTUP,0,0, 0, 0);
    end;
     
     
    end.

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 217
    Par défaut
    As-tu une section finalization dans l'unité Utilitaires?
    C'est souvent une violation d'accès comme une libération sur un pointeur non alloué ou déjà libéré qui provoque une tel erreur en fin de programme

    déplace tes variables globales comme ceci

    Pour FichierIni: textfile; autant que cela soit une variable locale dans FormClose et FormCreate

    X et Y ne serve à rien SetCursorPos(Left-5, Top-5);

    Il faut éliminer tout code inutile en particulier les infâmes variables globales
    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

  12. #12
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut
    j'ai mis le fichier en variable locale. j'ai supprimé X,Y et utilitaires qui ne servait plus à rien (il contenait Cliquergauche).
    le formClose ne remplissait olus sa tâche et il y avair quand même le message d'erreur. je suis passé en FormCloseQuery...
    Rien n'y fait ! N'auriez vous pas le même problème si vous faites tourner l'appli vous-mêmes ?
    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
    71
    72
    73
    74
    unit Unit_AutoRobot;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    Const
    //NomFichier='C:\users\Gerard\Appdata\AutoRobot.ini';
    NomFichier='AutoRobot.txt';
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    VAR
      FichierIni: textfile;
    begin
      Timer1.Enabled:= false;
        AssignFile(FichierIni,NomFichier);
        rewrite(FichierIni);
        writeln(FichierIni,IntToStr(Top));
        writeln(FichierIni,IntToStr(Left));
       CloseFile(FichierIni);
       canclose:=true;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    Var Valeur: String;
      FichierIni: textfile;
    begin
      if FileExists(NomFichier) then
      Begin
        AssignFile(FichierIni,NomFichier);
        try
        reset(FichierIni);
        readln(FichierIni,Valeur);
        Top:=StrToInt(valeur);
        readln(FichierIni,Valeur);
        left:=StrToInt(valeur);
        finally
          CloseFile(FichierIni);
        end;
      End;
     
    end;
     
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      SetCursorPos(Left-5,Top-5);
      mouse_event(MOUSEEVENTF_LeftDOWN , 0, 0, 0, 0);
      mouse_event(MOUSEEVENTF_LefTUP,0,0, 0, 0);
    end;
     
     
    end.

  13. #13
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 717
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 717
    Par défaut
    Citation Envoyé par GerardJ Voir le message
    N'auriez vous pas le même problème si vous faites tourner l'appli vous-mêmes ?
    Aucun problème sous XE7 :
    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
    71
    72
    73
    74
    75
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
      Vcl.ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Timer: TTimer;
     
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure TimerTimer(Sender: TObject);
     
      private
     
      public
     
      end;
     
    const
       NomFichier = 'AutoRobot.txt';
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
       Valeur: String;
       FichierIni: Textfile;
    begin
       if FileExists(NomFichier) then
       begin
          AssignFile(FichierIni, NomFichier);
          try
             Reset(FichierIni);
             Readln(FichierIni, Valeur);
             Top := StrToInt(valeur);
             Readln(FichierIni, Valeur);
             Left := StrToInt(valeur);
          finally
             CloseFile(FichierIni);
          end;
       end;
    end;
     
    procedure TForm1.TimerTimer(Sender: TObject);
    begin
       SetCursorPos(Left - 5, Top - 5);
       mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
       mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    end;
     
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
       FichierIni: Textfile;
    begin
       Timer.Enabled := False;
     
       AssignFile(FichierIni, NomFichier);
       try
          Rewrite(FichierIni);
          Writeln(FichierIni, IntToStr(Top));
          Writeln(FichierIni, IntToStr(Left));
       finally
          CloseFile(FichierIni);
       end;
    end;
     
    end.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  14. #14
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut
    pouvez-vous me faire parvenir l'exe pour voir si cela marche chez moi ?
    Merci

  15. #15
    Membre confirmé

    Inscrit en
    Novembre 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 70
    Billets dans le blog
    1
    Par défaut
    Il me semble avoir trouvé...
    J'ai écrit de A à Z ce programme assez simple sur un autre ordinateur et je ne rencontre plus de problème. Cela viendrait donc de mon EDI qui déjà ne me créait plus la MAP lors des compils....
    Merci de votre contribution !

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

Discussions similaires

  1. Programme qui écrit dans un fichier
    Par unix27 dans le forum OTIC (ex-Genio)
    Réponses: 3
    Dernier message: 14/10/2013, 10h57
  2. Intégration d'un temps défilant dans un programme simple
    Par Java_doc dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 16/11/2009, 16h27
  3. [XL-2007] Runtime error 1004 pour programme VBA d'optimisation
    Par Ptit_pilou dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/08/2009, 17h28
  4. fonction qui écrit dans une barre de recherche sur internet
    Par ubssecurities dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/08/2008, 10h36
  5. une méthode qui écrit dans la sortie html ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/12/2003, 15h34

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