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 :

TObjectList et variables...


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut TObjectList et variables...
    J'ai un truc étrange. J'ai dans une classe un TObjectList et un Integer. Dand une procedure, je libère le TObjectList et ma variable Integer est mise à 0

    Je suis en debug la valeur de la variable et lors du Free, j'ai ma variable mise à 0.

    Quelqu'un peut m'expliquer cela?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    le code de ta procedure ?

  3. #3
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut

    Ta variable est bien une variable membre ou une proriété utilisant une fonction Getter ?

    du style :

    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
     
    TMonObjet = class
    private
     FList : TObjecTList; 
     function GetMaVariable: Integer;
    public
     
      property MaVariable : Integer read GetMaVariable;
    end;
    ...
    function TMonObjet.GetMaVariable: Integer;
    begin
      if Assigned(FList) then
        Result := FList.Count
      else
       Result := 0;
    end;
    C'est juste une idée.

    cordialement

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    C'est
    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
     
    MaCalss = class
    private
      fNbr: Integer;
      FList: TObjectList;
    public
      procedure maProc;
    end
     
    constructor Create;
    begin
      FList := TObjectList(Self);
    end;
     
    procedure MaClass.MaProc;
    begin
      fNbr := 1;
      FList.free;
      //ici Fnbr = 0
    end;

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    constructor Create; 
    begin 
      FList := TObjectList(Self); 
    end;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    constructor MaClass.Create; 
    begin 
      inherited;
      FList := TObjectList.Create; 
    end;
    et n'oublie pas de déclarer constructor Create dans ta classe.

  6. #6
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Désolé, ce n'est pas l'erreur! J'ai juste oublié cela lors de la transcription de mon code. Evidemment que j'ai FList := TObjectList.Create(self);

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    ben met ton code exact comment tu veux qu'on y arrive sinon

  8. #8
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    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
     
    MaCalss = class
    private
      fNbr: Integer;
      FList: TObjectList;
    public
      constructor Create;
      procedure MaProc;
    end
     
    constructor Create;
    begin
      FList := TObjectList.Create(Self);
    end;
     
    procedure MaClass.MaProc;
    begin
      fNbr := 1;
      FList.free;
      //ici Fnbr = 0
    end;

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    le code de ton Create n'est pas rattaché à la classe

    tu as mis

    constructor Create;

    et non

    constructor MaClass.Create

  10. #10
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    C'est vraiment très curieux! je ne me souviens pas avoir vu un tel comportement.

    Les deux membres de ta classe semblent indépendants et pourtant ils se comportent comme s'ils étaient liés.

    Tu n'as pas oublié de méthodes qui auraient un effet significatif par hasard, du genre un calcul sur l'adresse de fNbr (avec un opérateur @ par exemple) ?

    Peux-tu fournir le texte complet de ta classe ?

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    utilise le copier coller

  12. #12
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Merci Bruno, mais ma classe est trop grosse. J'essaie juste de vous montrer où cela ne fonctionne pas. Evidement que mon create est rattaché à la classe. Delphi fait cela automatiquement avec Ctrl+Shift+C...

    Bref, pour en revenir au problème.

    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 TTreeManager.AddNode(Level, Index: Integer);
    var
      PID: Integer;
    begin
      FLevel := Level;
    //ici, Level et FLevel = 1
      if Level = 0
      then PID := Index
      else PID := FProject.Proj_ID;
      FBienNodes.Free;
      FImmNodes.Free;
    //ici FLevel = 0
      FImmNodes := TObjectList.Create(True);
      FBienNodes := TObjectList.Create(True);
     
      SetProjectID(PID);
    end;
    La déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type
      TTreeManager = class(TComponent)
      private
        FImmNodes: TObjectList;
        FBienNodes: TObjectList;
        bOnDestroy: Boolean;
        FLevel, FNewLevel: Integer;
      ...
    et le constructor (qui est bien déclaré... )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    constructor TTreeManager.Create;
    begin
      bOnDestroy := False;
      FImmNodes := TObjectList.Create(True);
      FBienNodes := TObjectList.Create(True);
      Fproject := TProj.Create;
      FLevel := 0;
      FIndex := 0;
      FNewLevel := 0;
      FNewIndex := 0;
      InitTree;
    end;

  13. #13
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    je ne comprends pas ce qui peut être à l'origine de ton problème à la lumière des éléments que tu nous donnes.

    Sans doute, un effet de bord dans le reste de la classe mais cela semble étrange.

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    est-ce que t'aurais pas oublié un inherited dans ton Create par hasard ?

    d'ailleurs, tu dérives d'un TComponent ce qui fait que ton Create doit avoir en paramètre un TComponent

  15. #15
    Membre habitué
    Inscrit en
    Mai 2005
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 258
    Points : 156
    Points
    156
    Par défaut
    Le create est Reintroduced pour avoir un autre paramètre que le Owner.

    J'ai été un peu fort lors de mon nettoyage pour ne mettre que la partie du code intéressantes.

    C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    constructor TTreeManager.Create(TrNodes: TTreeNodes);

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    bon laisse tomber, à chaque fois ça change. putain comment tu veux ton trouve une erreur qui typiquement provient non pas d'une faute de raisonnement global mais d'une simple histoire d'initialisation ou de débordement ou

    fout tout ton code même si ca fait 400 lignes ou j'abandonnes.

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2002, 13h32
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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