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 :

violation d'accès à l'adresse ect


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut violation d'accès à l'adresse ect
    Malgrès tout se que j'ai pu lire sur le FAQ à propos de cette erreur qui apparament survient souvent je ne suis pas en mesure de rêgler mon problème etant donnée que je suis débutant en delphi et que la notion de destruction d'objet est floue pour moi vu que vient du C# avant delphi.

    alor voici le 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
    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
    procedure TForm1.DBGridLignePieceColExit(Sender: TObject);
    var
    ordre_lpi : string;
    begin
    if DBGridLignePiece.SelectedIndex = 0 then
    begin
      try
      //Requete permettant la selection de l'ordre_lpi
      requeteRCP := 'SELECT ORDRE_LPI FROM LIGNE_PIECE,PIECE WHERE LIGNE_PIECE.TYPE_PIE = PIECE.TYPE_PIE AND LIGNE_PIECE.TYPE_PIE ||'+QuotedStr('2610')+'|| LIGNE_PIECE.NUM_PIE =  '+QuotedStr(Facturation.DBGridFacturation.SelectedField.Value)+'AND LIBELLE_LPI = '+QuotedStr(DBGridLignePiece.SelectedField.OldValue)+' AND REFERENCE_CLIENT_PIE ='+QuotedStr(Edit1.Text)+' AND MONTANT_UNITAIRE_HT_LPI = '+FloatToStr(DBGridLignePiece.Fields[1].Value)+' GROUP BY ORDRE_LPI';
      QueryRefCliPie.Close;
      QueryRefCliPie.SQL.Clear;
      QueryRefCliPie.SQL.Add(requeteRCP);
      QueryRefCliPie.Open;
      ordre_lpi := QueryRefCliPie.Fields[0].AsString;
      except
          on e: exception do
             showmessage('echec recherche ordre_lpi'+e.Message);
      end;
       try
            //mise a jour du champs libelle_lpi grace a l'ordre_lpi trouvé
            requeteMAJ := 'UPDATE LIGNE_PIECE SET LIBELLE_LPI = '+QuotedStr(DBGridLignePiece.SelectedField.Value)+' WHERE TYPE_PIE ||'+QuotedStr('2610')+'|| NUM_PIE = '+QuotedStr(Facturation.DBGridFacturation.SelectedField.Value)+' AND ORDRE_LPI = '+ordre_lpi+'';
            QueryRefCliPie.Close;
            QueryRefCliPie.SQL.Clear;
            QueryRefCliPie.SQL.Add(requeteMAJ);
            QueryRefCliPie.ExecSQL;
       except
            on e: exception do
             showmessage('MAJ libelle_lpi planté'+e.Message);
       end;
    end;
    if DBGridLignePiece.SelectedIndex = 1 then
    begin
      try
          //Requete permettant la selection de l'ordre_lpi
          requeteRCP := 'SELECT ORDRE_LPI FROM LIGNE_PIECE,PIECE WHERE LIGNE_PIECE.TYPE_PIE = PIECE.TYPE_PIE AND LIGNE_PIECE.TYPE_PIE ||'+QuotedStr('2610')+'|| LIGNE_PIECE.NUM_PIE =  '+QuotedStr(Facturation.DBGridFacturation.SelectedField.Value)+'AND LIBELLE_LPI = '+QuotedStr(DBGridLignePiece.SelectedField.OldValue)+' AND REFERENCE_CLIENT_PIE ='+QuotedStr(Edit1.Text)+' AND MONTANT_UNITAIRE_HT_LPI = '+FloatToStr(DBGridLignePiece.Fields[1].Value)+' GROUP BY ORDRE_LPI';
          QueryRefCliPie.Close;
          QueryRefCliPie.SQL.Clear;
          QueryRefCliPie.SQL.Add(requeteRCP);
          QueryRefCliPie.Open;
          ordre_lpi := QueryRefCliPie.Fields[0].AsString;
      except
            on e: exception do
             showmessage('echec recherche ordre_lpi'+e.Message);
      end;
      try
          //mise a jour du champs libelle_lpi grace a l'ordre_lpi trouvé
          requeteMAJ := 'UPDATE LIGNE_PIECE SET MONTANT_UNITAIRE_HT_LPI = '+DBGridLignePiece.SelectedField.Value+' WHERE TYPE_PIE ||'+QuotedStr('2610')+'|| NUM_PIE = '+Facturation.DBGridFacturation.SelectedField.Value+'AND ORDRE_LPI = '+ordre_lpi+'';
          QueryRefCliPie.Close;
          QueryRefCliPie.SQL.Clear;
          QueryRefCliPie.SQL.Add(requeteMAJ);
          QueryRefCliPie.ExecSQL;
      except
            on e: exception do
             showmessage('MAJ montant_unitaire_ht_lpi planté'+e.Message);
       end;
      end;
    end;
    ça plante sur la ligne que j'ai pris soin de mettre en rouge.
    D'après se que j'ai lu je pense que c'est un objet qui est mal instancié, cependant la variable requeteMAJ est declarée dans la partie globale de mon unité.

    de ce fait je suis complètement perdu, et je n'arrive pas a savoir d'où vient le plantage etant donné que l'exception que j'essaye de levé moi même avec le bloc try except ne se déclanche même pas car arrêtée par la notification des exceptions du débogueur.

    donc voila je suis perdu

    si l'erreur pouvait sauter aux yeux de quelqu'un j'en serais ravi

    merci d'avance

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    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 : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Un petit coup de débogueur

    Ou alors à l'ancienne Avant ta ligne rouge ajoute

    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
    
    If not Assigned(DBGridLignePiece) then
      showmessage ('DBGridLignePiece');
    
     If not Assigned(DBGridLignePiece.SelectedField) then
      showmessage ('DBGridLignePiece.SelectedField');
    
    
    If not Assigned(Facturation) then
      showmessage ('Facturation');
    
    If not Assigned(Facturation.DBGridFacturation) then
      showmessage ('Facturation.DBGridFacturation');
    
    If not Assigned(Facturation.DBGridFacturation.SelectedField) then
      showmessage ('Facturation.DBGridFacturation.SelectedField');
    
    
    Mais il vaut mieux apprendre à se servir du débogueur c'est essentiel quand on débute

    a+

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Si requeteMAJ n'était pas déclaré, tu aurais un message à la compilation et non à l'exécution.

    Il faut regarder les objets:
    DBGridLignePiece.SelectedField
    Facturation.DBGridFacturation.SelectedField

    Par exemple si l'un des Grids n'a pas de case sélectionnée, SelectedField = nil ce qui entraîne la violation d'accès à la lecture de Value.

    Mets un point d'arrêt sur cette ligne. Lorsque tu t'arrêtes dessus, promène ta souris sur chaque mot. Tu verra tout de suite dans le Hint si l'objet vaut nil.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut
    Merci a vous deux,
    Andnotor il semblerais que tu sois le plus proche de la reponse car j'ai mis un point d'arret sur la requête et effectivement la valeur de DBGridLignePiece.SelectedFiel est a nil et ceci est du a mon avis a l'evenement qui provoque cette procédure car c'est l'evenement colexit.
    cependant j'ai absolument besoin de cette valeur n'y a t il pas un moyen d'y accèder quand même?

    Yurck j'aimerais beaucoup que tu m'en dise un peut plus quand a l'utilisation du debogueur je n'ais pas saisi se que tu voulais dire exactement, est ce que se serais de debogué pas à pas ?

    en tout cas merci beaucoup à vous deux!!

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    SI DBGridLignePiece.SelectedField est a nil ta requète n'a aucun sens.
    Tu dois donc gérer au début de ton évènement 'colexit' le cas où tu n'as pas de champ correct sélectionné.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut
    il y a pourtant bien quelque chose etant donné que je modifie simplement le champ je ne le supprime pas ceci etant dit je viens d'essayer quelque chose qui semble fonctionner :

    dès l'entrée dans mon bloc if je stock la valeur actuelle et l'ancienne valeur de se que je veux comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    valeurSelection := DBGridLignePiece.SelectedField.OldValue;
      nouvelleValeur :=DBGridLignePiece.SelectedField.NewValue;
    cependant une nouvelle erreure qui n'a pour moi aucun sens se declanche la voici :

    ---------------------------
    Notification des exceptions du débogueur
    ---------------------------
    Le projet Project1.exe a déclenché la classe d'exception EInvalidGridOperation avec le message 'Indice de grille hors limites'.
    ---------------------------
    Arrêter Continuer Aide
    ---------------------------
    qu'est ce que j'ais fait comme bêtise encore ??
    le plus drole c'est qu'il plante mais quand je relance mon application la modification est effective

  7. #7
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je pense que, de manière générale, tu as l'évènement 'colExit' quand tu "sors" d'une colonne.
    Par contre tu gères cet événement comme si tu 'entrais' toujours sur une nouvelle colonne alors que tu peux parfaitement 'sortir' de ta grille pour cliquer sur un bouton par exemple.

    Dans ce cas DBGrid.SelectedField est à Nil ce qui génère ton erreur d'origine et ta nouvelle erreur !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut
    très bien donc si je suis ton raisonnement je lance ma procédure sur le mauvais evenement et je ferais mieux de le déclancher sur oncolenter par exemple?

  9. #9
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Oui (sachant que je ne sais pas exactement ce que tu veux faire !!)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 83
    Points : 64
    Points
    64
    Par défaut
    et bien c'est exactement ça !!!!
    bon mis a part un petit problème de requête que je suis entrain de règler cela fonctionne !!
    merci d'avoir pris le temps de me repondre, ton aide m'a été précieuse !

    bonne journée et merci encore !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/01/2009, 12h02
  2. Violation d'accès à l'adresse
    Par gentilman_delphi dans le forum Bases de données
    Réponses: 12
    Dernier message: 04/03/2008, 19h51
  3. Violation d'accès à l'adresse x
    Par Gremlins13 dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2007, 16h48
  4. Réponses: 2
    Dernier message: 18/11/2007, 10h11
  5. "violation d'acces à l'adresse" en sortie de primi
    Par netah25 dans le forum C++Builder
    Réponses: 20
    Dernier message: 18/01/2005, 12h22

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