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 :

Erreur EAccessViolation sous Delphi


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Erreur EAccessViolation sous Delphi
    Bonsoir,

    Je cherche de puis quelques jours la solution au problème suivant:

    Le projet Project1.exe a déclenché la classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 00409318 dans le module 'Project1.exe'. Lecture de l'adresse 00000004'.

    Le but de la manip est de récupérer le nom des fichier d'un dossier "Images" et de les copier sur un ListBox. Jusque la tout va bien. Mais lorsque je clique sur le bouton qui permet d'affecter .jpg aux Timages j'ai donc le message d'erreur précédent.

    Voilà les 2 parties de 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
    27
    28
    29
    procedure TForm1.FormCreate(Sender: TObject);
     
    var
    n : Integer;
    F: TSearchRec;
     
    begin
     
    n:=FindFirst('C:\Users\Michel\Desktop\MEMORY\images\*.jpg',faAnyfile,F);
     
    ListBox1.Items.Add(F.FindData.cFileName);
     
    repeat
     
      begin
     
        n:=FindNext(F);
        if n=0 then
     
          begin
            ListBox1.Items.Add(F.FindData.cFileName);
          end;
     
      end;
    until n<>0 ;
     
    FindClose(F);
     
    end;
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
    i,k,j : Integer;
    tab:TMyArray;
     
     
    begin
     
    j:=1;
    k := 1;
      while k<7 do
        begin
          tab[k]:= j;
          tab[k+1]:= j;
          inc(j,1);
          inc(k,1);
        end;
    MixArray(tab);
     
    for i := 1 to 6 do
     
    begin
    ListBox2.Items.Strings[i-1]:= IntToStr(Tab[i]);
    end;
     
    Image1.Picture.LoadFromFile('C:\Users\Michel\Desktop\MEMORY\images\'+ListBox1.Items.Strings[tab[1]-1]);
    Panel1.Visible := true;
    Panel1.Caption := ListBox1.Items.Strings[tab[1]-1];
     
    Image2.Picture.LoadFromFile('C:\Users\Michel\Desktop\MEMORY\images\' + ListBox1.Items.Strings[tab[2]-1]);
    Panel2.Visible := true;
    Panel2.Caption := ListBox1.Items.Strings[tab[2]-1];
     
    Image3.Picture.LoadFromFile('C:\Users\Michel\Desktop\MEMORY\images\' + ListBox1.Items.Strings[tab[3]-1]);
    Panel3.Visible := true;
    Panel3.Caption := ListBox1.Items.Strings[tab[3]-1];
     
    Image4.Picture.LoadFromFile('C:\Users\Michel\Desktop\MEMORY\images\' + ListBox1.Items.Strings[tab[4]-1]);
    Panel4.Visible := true;
    Panel4.Caption := ListBox1.Items.Strings[tab[4]-1];
     
    Image5.Picture.LoadFromFile('C:\Users\Michel\Desktop\MEMORY\images\' + ListBox1.Items.Strings[tab[5]-1]);
    Panel5.Visible := true;
    Panel5.Caption := ListBox1.Items.Strings[tab[5]-1];
     
    Image6.Picture.LoadFromFile('C:\Users\Michel\Desktop\MEMORY\images\' + ListBox1.Items.Strings[tab[6]-1]);
    Panel6.Visible := true;
    Panel6.Caption := ListBox1.Items.Strings[tab[6]-1];
    Button1.Visible := false;
     
    end;
    J'ai fait du pas à pas et l'erreur apparaît tout à la fin de la procédure "Button1Click".

    Merci de votre aide,

    Cordialement.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    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 865
    Points : 11 333
    Points
    11 333
    Billets dans le blog
    6
    Par défaut
    Est-ce que tab[6]-1 n’excède pas ListBox1.Items.Count ?

    Le code du FindFirst ne teste pas si n<>0 et part du principe qu'on en a trouvé une (photo) : il vaudrait mieux remplacer le repeat..until n<>0 par un while n=0 do begin..end.

    La procédure MixArray ne pourrait-elle être fautive ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 548
    Points : 25 118
    Points
    25 118
    Par défaut
    Faudrait vérifier n résultat de FindFirst, qui DOIT être à zéro !
    Sinon F vaut probablement nil (0000 0004 cela doit être le FindHandle)

    D'ailleurs, il ne faut pas appeler tout de suite FindNext sinon tu loupes le 1er fichier.

    FindClose ne doit être appeler que si FindFirst a renvoyé Zéro !
    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

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut suite
    Bonsoir,

    Tout d'abord merci pour vos réponses rapides.
    Je ne pense pas que le MixArray me donne l'erreur. Car dans un premier temps j'avais mis le nom des fichiers dans un .text et je les recopiais dans le ListBox1; et je n'avais pas l'erreur.

    L'erreur est survenue que lorsque j'ai intégré le FindFirst / FindNext / FindClose.

    Par contre comme je le précise dans mon premier message, l'erreur s'affiche juste après le END de la procédure du Button1Click.

    Le seul lien entre les 2 procédures est la ListBox1.

    J'ai suivi vos conseils, à savoir vérifier le "n" avant le FindNext et le FindClose et le résultat est le même.

    Merci, je continue de chercher...

    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
     
    n:=FindFirst('C:\Users\Michel\Desktop\MEMORY\images\*.jpg',faAnyfile,F);
     
    ListBox1.Items.Add(F.FindData.cFileName);
     
     
    if n=0 then
    begin
     
    while n= 0 do
     
      begin
     
        n:=FindNext(F);
        if n=0 then
     
          begin
            ListBox1.Items.Add(F.FindData.cFileName);
           end;
     
      end;
     
    end;
    if n=0 then
     
    FindClose(F);
     
    end;

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Erreur trouvée...!!!
    Bonsoir tout le monde...

    Tout d'abord merci d'avoir répondu à ma discussion.

    Après plusieurs recherches (isolé des parties de programme etc...) j'ai enfin trouvé le problème.

    Dans le bout de programme:

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
    i,k,j : Integer;
    tab:TMyArray;
     
     
    begin
     
    j:=1;
    k := 1;
      while k<7 do
        begin
          tab[k]:= j;
          tab[k+1]:= j;
          inc(j,1);
          inc(k,1);
        end;
    MixArray(tab);
    Il faut mettre "While k<6"

    Mais en même temps pour remplir le tableau autant faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for j := 1 to 6 do
    tab[j] := j;
    MixArray(tab);
    Encore merci à tous et à bientôt...

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Pour les bornes du tableau tu peux utiliser Low(TMyArray) et High(TMyArray), cela évite de changer ton code à plusieurs endroits (ou éventuellement utiliser des constantes).
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  7. #7
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut ...
    Oui c'est vrai tu as raison. Merci du conseil.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 13/01/2012, 09h22
  2. Erreur Installation UIB sous Delphi 7
    Par MonPc dans le forum Composants VCL
    Réponses: 1
    Dernier message: 23/01/2010, 22h29
  3. DELPHP sous Delphi 2009 - Erreur chinoise?
    Par oiapoque dans le forum Web & réseau
    Réponses: 2
    Dernier message: 31/03/2009, 17h04
  4. Erreur Exception EDB EngineError sous Delphi 2007 Pro
    Par Nicolas Coolman dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/12/2007, 14h40
  5. Erreurs d'exécution sous delphi 5
    Par nkd dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2004, 17h25

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