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 :

Violation - je n'en trouve pas la cause


Sujet :

Langage Delphi

  1. #1
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut Violation - je n'en trouve pas la cause
    Bonjour

    j ai de temps en temps une violation, et ca m ouvre IBUpdateSQL.pas, a la ligne 73

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    destructor TIBUpdateSQL.Destroy;
    var
     UpdateKind: TUpdateKind;
    begin
     if Assigned(FDataSet) and (FDataSet.UpdateObject = Self) then
       FDataSet.UpdateObject := nil;
     for UpdateKind := Low(TUpdateKind) to High(TUpdateKind) do
       FSQLText[UpdateKind].Free;
     inherited Destroy;
    end;
    le pb c est que si j essai de suivre au debugger, y a pas violations

    quand il arrive la, y a t il moyen de savoir qui a appellé ca ?
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par Cazaux-Moutou-Philippe Voir le message
    quand il arrive la, y a t il moyen de savoir qui a appellé ca ?
    Tu peux commencer par examiner la pile d'appel (Ctrl-Alt-S), ce qui te permettra de suivre le déroulement des évènements.

    @+ Claudius

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut


    il y a un truc qui m'interpelle dans ton code
    si l'objet ce retire automatiquement de FSQLText tu risque
    de faire un depasement d'indice
    c'est un peu comme si tu coupe la branche sur lequel tu te trouve
    pour palier a ceci il faut inverser ta boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ... 
     for UpdateKind := High(TUpdateKind) downto  Low(TUpdateKind)  do
       FSQLText[UpdateKind].Free;
    
     inherited Destroy;
    end;

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Bonjour Anapurna

    ce n'est pas mon code, mais quand ça viole ça ouvre cette unité Delphi
    IBUpdateSQL.pas

    Je suis en D7
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    j'ai regarder le code de l'unitée
    bon c'est un tableau donc le probleme ne vient pas de la

    a qu'elle moment tu appelle de destroy de ibsql
    ne ferait tu pas appel de l'objet alors que celui-ci est déjà supprimer ?


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  6. #6
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Quand je le suis au debugger, il arrive la

    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
    procedure TFIndividuIdentite.SuperFormDestroy(Sender: TObject);
    begin
      if assigned(aFIndividuEditEventLife) then
        FreeAndNil(aFIndividuEditEventLife);
     
      IBConjoints.close;
      IBQDetailConjoint.close;
      IBQEve.close;
      IBEnfants.close;
      IBQAjoutEnfant.close;
      IBQPatronymes.close;
      IBQPrenoms.close;
     
      application.ProcessMessages;
    end;
    puis passe la

    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
    procedure TFIndividuEditEventLife.SuperFormDestroy(Sender: TObject);
    begin
      if Assigned(l_CP) then
        FreeAndNil(l_CP);
      if Assigned(l_Dept) then
        FreeAndNil(l_Dept);
      if Assigned(l_Pays) then
        FreeAndNil(l_Pays);
      if Assigned(l_Villes) then
        FreeAndNil(l_Villes);
      if Assigned(l_Region) then
        FreeAndNil(l_Region);
      if Assigned(l_Insee) then
        FreeAndNil(l_Insee);
      if Assigned(l_lat) then
        FreeAndNil(l_lat);
      if Assigned(l_long) then
        FreeAndNil(l_long);
      if Assigned(fCodesRefTemoins) then
        FreeAndNil(fCodesRefTemoins);
      if Assigned(fLibellesRefTemoins) then
        FreeAndNil(fLibellesRefTemoins);
     
      IBQPhoto.close;
      ibqProfession.close;
      IBMultimedia.close;
      IBTemoins.close;
      IBQDetailTemoins.Close;
     
      application.ProcessMessages;
    end;
    et a la fin il part en AV
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    Citation Envoyé par Cazaux-Moutou-Philippe Voir le message
    Quand je le suis au debugger, il arrive la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TFIndividuIdentite.SuperFormDestroy(Sender: TObject);
    begin
      if assigned(aFIndividuEditEventLife) then
        FreeAndNil(aFIndividuEditEventLife); //<-- c'est ici que tu rentre dans TFIndividuEditEventLife.SuperFormDestroy
     
    // donc le probleme ce passe avant ça
    ...
    puis passe la

    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
    procedure TFIndividuEditEventLife.SuperFormDestroy(Sender: TObject);
    begin
    // maintenant il faut mettre un point d'arret afin de voir sur quelle variable ca plante 
      if Assigned(l_CP) then
        FreeAndNil(l_CP);
      if Assigned(l_Dept) then
        FreeAndNil(l_Dept);
      if Assigned(l_Pays) then
        FreeAndNil(l_Pays);
      if Assigned(l_Villes) then
        FreeAndNil(l_Villes);
      if Assigned(l_Region) then
        FreeAndNil(l_Region);
      if Assigned(l_Insee) then
        FreeAndNil(l_Insee);
      if Assigned(l_lat) then
        FreeAndNil(l_lat);
      if Assigned(l_long) then
        FreeAndNil(l_long);
      if Assigned(fCodesRefTemoins) then
        FreeAndNil(fCodesRefTemoins);
      if Assigned(fLibellesRefTemoins) then
        FreeAndNil(fLibellesRefTemoins);
     
     
       IBQPhoto.close;
       ibqProfession.close;
       IBMultimedia.close;
       IBTemoins.close;
       IBQDetailTemoins.Close;
      application.ProcessMessages;
    // est ce que jusqu'ici tous va bien ?
     
    end;

    je ne suis pas un partisant du freeandnil pour une forme
    il faut normalement faire un release afin que la forme traite tout les evenements avant de ce detruire

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // est ce que jusqu'ici tous va bien ?
    Oui mais apres il part en AV

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l faut normalement faire un release afin que la forme traite tout les evenements avant de ce detruire
    CAD ?
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if assigned(aFIndividuEditEventLife) then
        FreeAndNil(aFIndividuEditEventLife);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if assigned(aFIndividuEditEventLife) then
        aFIndividuEditEventLife.release;
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Merci

    je viens d'essayer ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if assigned(aFIndividuEditEventLife) then
        aFIndividuEditEventLife.release;
    mais quand je reouvre la fenetre j'ai une violation d'accès

    j ai fait ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if assigned(aFIndividuEditEventLife) then
    begin
        aFIndividuEditEventLife.release; 
        aFIndividuEditEventLife := nil;
    end;
    et la je n'ai plus d'AV
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    si ça marche tu peut mettre résolue.

    ce que je ne comprend pas normalement suite au release tu devrais pouvoir réouvrir la fenêtre sans que celle ci généré une violation d'accès

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Non c est toujours pas résolu, je viens encore d avoir cette meme AV
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    il faut que tu te mette en pas a pas pour savoir ou il plante exactement
    mais a priori tu essai d'accéder a un composant qui est déjà détruit.
    fait un application.processmessages après le release


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if assigned(aFIndividuEditEventLife) then
        aFIndividuEditEventLife.release;
    "aFIndividuEditEventLife" désigne quoi? un champ de ta Form? une interface?

    Tu peux avoir une violation d'accès au cours du ProcessMessages si l'un des messages de la pile de messages s'adresse à un des champs que tu viens de détruire et assigner à NIL...

    Dans ce cas, il faudrait essayer de créer une sorte de garbage collector, que ton application désalloue pendant sont Idle.
    *LeGEC*

  15. #15
    Membre extrêmement actif Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Points : 171
    Points
    171
    Par défaut
    Dans ce cas, il faudrait essayer de créer une sorte de garbage collector,
    Comment faire ?

    aFIndividuEditEventLife" désigne quoi?
    Une form
    Philippe Cazaux-Moutou
    C#
    Delphi
    Windev

    Guadeloupe

    www.ancestrologie.net/fr

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Re-salut,

    Faire un "garbage collector" (vraiment basique) :
    Un moyen de faire est de stocker une liste d'objets à détruire dans une liste/tableau/... et de détruire ces objets dans le OnIdle de ton application.

    Par exemple : dans une unité, tu crées une classe TGarbageBin :
    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
    unit TypeGarbageBin;
     
    interface
     
    uses
      Contnrs;
     
    type
      TGarbageBin = class(TObjectList)
        procedure DestroyAllOnIdle( Sender: TObject; var Done: Boolean );
      end;
     
      var
        GarbageBin : TGarbageBin;
     
    implementation
     
    { TGarbageBin }
     
    procedure TGarbageBin.DestroyAllOnIdle(Sender: TObject; var Done: Boolean);
      var
        i : integer;
    begin
    //faire "Clear" sur un TObjectList, qui a sa propriété OwnsObject
    //à TRUE, détruit tous les objets stockés dans la liste :
      Self.Clear;
    //pour dire qu'on a terminé le traitement sur l'évènement OnIdle :
      Done := TRUE;
    end;
     
    initialization
      GarbageBin := TGarbageBin.Create;
     
    finalization
      GarbageBin.Clear;
      FreeAndNil(GarbageBin);
     
    end.
    Puis tu branches la méthode "DestroyAllOnIdle" sur l'évènement OnIdle de l'application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //à l'endroit où tu initialises Application :
    Application.OnIdle := GarbageBin.DestroyAllOnIdle;
     
    //ou, si tu as déjà un évènement OnIdle, tu rajoutes un appel à cette fonction,
    //ou tu rajoutes DestroyAllOnIdle à l'aide de TApplicationEvents, ou...
    Quand tu veux détruire ta form, au lieu de la détruire explicitement, tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GarbageBin.Add(FormADetruire);
    C'est une version vraiment moche et rapide, qui ne vérifie pas si un objet n'est pas présent 2 fois dans la liste, et qui a plein d'autres défauts, mais ça pourrait te donner un point plus précis pour chercher qu'est-ce qui déclenche la violation d'accès.



    Sinon, il y a quand même d'autres choses à regarder avant de mettre en place un truc comme ça :
    est-ce que la form que tu détruis est encore visible quand tu appelles le free?
    est-ce que, en détruisant ta form, tu ne détruis pas aussi d'autres composants (soit des DataModules, soit des composants graphiques qui contiennent de l'information (des TEdit, ou autres...) ) qui sont en fait encore utilisés par d'autres éléments de ta form principale?
    *LeGEC*

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

Discussions similaires

  1. [jonas]eclipse ne trouve pas le plugin
    Par Stessy dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 17/07/2007, 11h43
  2. Le compilateur ne trouve pas glut32.dll
    Par Vathal dans le forum GLUT
    Réponses: 3
    Dernier message: 26/01/2004, 12h34
  3. je ne trouve pas la bonne syntaxe
    Par poelvo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/08/2003, 01h30
  4. [TP]trouve pas le graph.tpu
    Par kaygee dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 13/06/2003, 12h49
  5. [Kylix] [cgi] ne trouve pas libsqlmy.so.1 !
    Par Nepomiachty Olivier dans le forum EDI
    Réponses: 3
    Dernier message: 04/07/2002, 15h15

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