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 :

Objet pas à nil à sa déclaration


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Homme Profil pro
    Chef de Projet ATIC
    Inscrit en
    Novembre 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chef de Projet ATIC
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 274
    Points : 508
    Points
    508
    Par défaut Objet pas à nil à sa déclaration
    Bonjour à tous,

    J'ai un petit soucis non compréhensible. A certains moments, Delphi considère une nouvelle variable Objet comme étant assignée et <> nil, alors qu'il n'y a eu que sa déclaration et pas de MonObjet := TObjet.Create .

    Voici 1 fonction ChargeAuteurs :

    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 ChargeAuteurs;
    var
      OdbcAuteur: TOdbcStmt;
      Auteur: TAuteur;
    begin
      if not assigned(AuteurVide) then
        AuteurVide := TAuteur.Create;
      AuteurVide.Efface;
      // Création ou clear de la liste
      if not assigned(ListeAuteurs) then
        ListeAuteurs := TListeAuteurs.Create
      else
        ListeAuteurs.Clear;
     
      InitStatement(OdbcAuteur);
    ...
      CloseStatement(OdbcAuteur);
      FreeAndNil(OdbcAuteur);
    Il existe une autre fonction ChargeCategories copiée sur la même base

    La fonction InitStatement est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Initialise un nouveau Statement
    function InitStatement(var varOdbcStmt: TOdbcStmt): boolean;
    begin
      Result := True;
      if (not assigned(varOdbcStmt)) or (varOdbcStmt = nil) then
        varOdbcStmt := TOdbcStmt.Create(Application);
      varOdbcStmt.AutoFirstRow := False;
      varOdbcStmt.OdbcConnexion := odbcCnx;
      if not (varOdbcStmt.Connect) then
      begin
        VistaErreur(Application.MainForm, 'Message d''erreur', '', varOdbcStmt.ErrorMessage);
        Result := False;
      end;
    end;
    J'utilise ces fonctions dans le OnCreate de ma form principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        // Charge les catégories
        ChargeCategories;
        for i := 0 to listeCategories.Count - 1 do
        begin
          cboRechercheCategorie.Items.Append(TCategorie(listeCategories[i]).Nom);
          cboConsultCategorie.Items.Append(TCategorie(listeCategories[i]).Nom);
        end;
        // Charge les utilisateurs
        ChargeAuteurs;
        for i := 0 to ListeAuteurs.Count - 1 do
          cboAuteur.Items.Append(TAuteur(ListeAuteurs[i]).Nom);
    Lors de l'appel InitStatement depuis ChargeAuteur, la ligne if (not assigned(varOdbcStmt)) or (varOdbcStmt = nil) retourne Faux, alors que pour tous les autres appels varOdbcStmt = nil

    Ce qui est encore plus bizarre, c'est que si j'appelle ChargeCategorie puis ChargeAuteurs l'un après l'autre, sans code entre les deux, ça fonctionne bien. Si je les inverse, ça ne fonctionne plus... 2 fois ChargeAuteur de suite, le 1er pose problème et pas le second... l'erreur est toujours sur l'objet créé dans ChargeAuteurs.

    J'avoue ne plus savoir où chercher pour essayer d'avoir un comportement normal.

    Ah oui, c'est sous D2009 update 3.

    Merci

  2. #2
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Le probleme vient du fait que ta variable odbcAuteur est locale a une fonction.
    Dans un objet, tous les champs sont initialisés à 0 (nil, false, ...) lors de l'instanciation. Pour tout le reste (variables locales, globales, ...), la valeur de départ est ce qu'il y a à cet endroit de la memoire au moment de l'appel. C'est souvent 0 (car je pense qu'il y a beaucoup d'emplacement memoire à 0 durant une execution), mais en réalité ca peut etre n'importe quoi. par exemple, si tu ecris la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function Boucle:
    var
      i: integer;
    begin
      while i < 100 do
        sleep(0);
    end;
    dans beaucoup de cas, le "i" sera mappé sur un espace memoire qui vaut 0, mais dans d'autres cas, ca ne sera pas le cas, et ca peut etre lié a une variable que tu va modifier à un endroit totalement opposé du code, mais qui modifiera l'emplacement ou sera allouée plus tard ta variable.

    J'espere avoir été clair.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Et pour complèter, tu peux affecter nil par défaut aux variables globales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      MonObjet :TMonObjet = nil;

  4. #4
    Membre confirmé

    Homme Profil pro
    Chef de Projet ATIC
    Inscrit en
    Novembre 2005
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Chef de Projet ATIC
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 274
    Points : 508
    Points
    508
    Par défaut
    Merci pour vos réponses.

    Je connaissais le principe pour les variables "non objet" et pour les propriétés d'un objet après sa création, mais j'étais persuadé que la référence d'un objet valait toujours nil tant qu'il n'était pas créé.

    Il ne me reste plus qu'à revoir pas quelques lignes de code pour éviter ces effets non souhaités Ou comment perdre quelques heures à chercher une erreur là où il n'y en pas.

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

Discussions similaires

  1. NoMethodError sur nil:NilClass pour un objet qui n'est pas nil
    Par Bestiol dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 11/10/2010, 22h36
  2. Réponses: 0
    Dernier message: 21/10/2009, 13h37
  3. [XL-2003] [VBA] Objet Chart dans Userform : déclaration des données ?
    Par CriCri98 dans le forum Excel
    Réponses: 2
    Dernier message: 18/08/2009, 16h08
  4. Réponses: 2
    Dernier message: 09/12/2008, 09h57
  5. comparer deux objets pas si simple ?
    Par StIcK dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 20h55

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