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 :

recherche cause erreur EAccessViolation


Sujet :

Delphi

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut recherche cause erreur EAccessViolation
    Bonjour,

    A la fermeture d'une fenetre, je tente de détruire tout ses composant en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    i := ComponentCount-1;
      While i > 0 do begin
            if Components[i].Owner.Name = Self.Name then Begin
              try
               Components[i].Destroy;
               i := ComponentCount-1;
              except
              end;
     
            end Else
              Dec(i);
      End;
    L'erreur "EAccessViolation" apparait, Mes composants sont créés dynamiquement, et il semble que cette erreur vienne d'un acces à la memoire qui n'existe pas...
    mon application travail en local et en reseau, il se trouve que cett erreur ne se produit qu'a la fermeture d'un dossier reseau (mais je ne vois pas pourquoi).

    Petit test réalisé, les EAccessViolation semble apparaitre pour la destruction de composant de type "PageCOntrol"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Components[i].name;
    m'a retourné des noms de composant de type: PC_4, PC_3 PC_2...
    mais je n'arrive pas à les identifier d'avantage. Y-a-t-il une methode pour trouver d'avantages d'infos sur ses composants?

    quels tests puis-je faire pour resoudre ces problemes d'acces memoire ou trouver quels composants son innaccessibles???

    merci pour toute idee pour avancer

    a bientot

    eric

  2. #2
    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
    Par défaut

    d'après ton code, tu détruis tous les composant possédés par ta fenêtre, et là je me demande bien pourquoi ?
    car tu dois savoir que ta fenêtre libérera elle même tous les composants qu'elle possède à sa destruction. si tu n'essaie pas de libérer tes composants a la fermeture y a-til toujours une erreur ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    Citation Envoyé par evarisnea
    si tu n'essaie pas de libérer tes composants a la fermeture y a-til toujours une erreur ?
    L'erreur apparait à la libération de la Fiche (EcDossier) contenant les composants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         try
           EcDossier.Free;
           EcDossier := nil;
         Except
           EcDossier.Destroy;
           EcDossier := nil;
    //       ShowMessage('Attention destruction Dossier Level 2');
         end;

    aucun code n'est de moi, je tente seulement de debugger un petit peu un programme avec mes faibles connaissances Delphi, mais j'en apprend tous les jours sur ce forum !! merci


    Dailleur, Destroy ne doit jammais être appellé directement. C'est la méthode Free qui s'en charge.
    oui j'ai bien vu çà, mais ds la boucle de destruction de composants, le resultat est le même

  4. #4
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Donne le code où est déclaré ecDossier, et le code où il est créé (méthode Creat).

    A+

  5. #5
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut
    Est-ce que à un moment donné, dans le code, il-y-a création de composants ?
    Si oui ceux-là seulement doivent être libérés, sinon tu ne dois détruire rien du tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     EcDossier.Free;
     EcDossier := nil;
    Quelle est cette bizarerie ? libérer un composant pour lui donner une valeur nil ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    Citation Envoyé par Bejaia-In
    Est-ce que à un moment donné, dans le code, il-y-a création de composants ?
    Si oui ceux-là seulement doivent être libérés, sinon tu ne dois détruire rien du tout.

    Quelle est cette bizarerie ? libérer un composant pour lui donner une valeur nil ?
    oui c'est bizarre hein, d'ailleurs l'auteur du programme a répété cette bizarrerie partout

    enfin bref, j'ai modifié la boucle de destruction des composants de ma Fiche qui sont créés dedans, ils sont tous detruits (libérés? je suis ne pas au point dans la rhétorique) sans erreurs
    et dans mon Main, à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    EcDossier.Free;
    EcDossier := nil;
    je fais seulement
    et visiblement je n'ai plus d'erreur
    dans l'immédiat, çà me suffira, mais si quelqu'un a un peu de théorie sur la destruction d'objets/free/destroy et comment faire un code propre ds ces situations, je suis preneur car là je ne comprend pas tout


    pour Philippe Gormant je ne peux pas laisse le code du FormCreate car il est bcp trop long et sans commentaires, mais il créée essentiellement des boutons et des onglets en nombre TRES consequent....


    merci a tous

  7. #7
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Si les composants sont déclarés dans la partie Class de la fiche, il ne faut pas appeler leurs méthodes Destroy ni la méthode free. Dailleur, Destroy ne doit jammais être appellé directement. C'est la méthode Free qui s'en charge. Mais dans le cas où les composant sont déclaé de cette façon :

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
        TForm1 = class(TForm)
     
     
         public
            Image1 : TImage;
            Edit1     : TEdit;
     
     
    ......
    Ils appartiènent au conteneur qu'est la fiche (TFom1). A la fermeture de la fiche les composants sont automatiquement dédruis. Si un autre appel à la méthode Destroy ou Free, il y a forcément une violation d'accès.
    est parfaitement inutile.

  8. #8
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Bonjour.

    Si les comosants sont déclarés dans la partie Class de la fiche, il ne faut pas appeler leurs méthodes Destroy. Dailleur, Destroy ne doit jammais être appellé directement. C'est la méthode Free qui s'en charge. Mais dans le cas où les composant sont déclaé de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
        TForm1 = class(TForm)
     
     
         public
            Image1 : TImage;
            Edit1     : TEdit;
     
     
    ......
    Ils appartiènent au conteneur qu'est la fiche (TFom1). A la fermeture de la fiche les comosant sont automatiquement dédruis. Si un au appel à la méthode Destroy ou Free, il y a forcément une violation d'accès.

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

Discussions similaires

  1. Erreur EAccessviolation à l'execution
    Par bouzaidi dans le forum Delphi
    Réponses: 3
    Dernier message: 16/04/2007, 14h04
  2. Recherche multicritère erreur '3464' DCount()
    Par alex.a dans le forum Access
    Réponses: 8
    Dernier message: 18/05/2006, 13h57
  3. Message d'erreur Eaccessviolation
    Par Oluha dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/11/2005, 13h59
  4. [ASP]resultSet = "" cause erreur???
    Par DEC dans le forum ASP
    Réponses: 2
    Dernier message: 19/07/2004, 17h56
  5. Erreur EACCESSVIOLATION avec des compsts créés dynamiquement
    Par tsikpemoise dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/02/2004, 19h05

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