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

Composants VCL Delphi Discussion :

[TTreeView] Problème avec les pointeurs d'objet


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 169
    Points
    169
    Par défaut [TTreeView] Problème avec les pointeurs d'objet
    Bonjour à tous !

    Bon, ce sera pas évident à expliquer. Voici ce que j'utilise :

    - TreeView : TTreeView dont tous les noeuds, parents ou enfants, référent à un objet (TMyObject) grâce aux pointeurs.
    - TMyObject : Classe contenant diverses propriétés, que l'on résumera à une seule (Name: String, par exemple).
    - PMyObject : ^TMyObject (pointeur);
    - Pour ajouter un TMyObject au TreeView, j'utilise le drag&drop à partir d'une liste de TMyObject, mais il est interdit d'en ajouter à la racine.
    - J'ai donc un bouton 'Init' qui permet d'ajouter un TMyObject au départ, qui sera le parent de tous les autres.

    Méthode 'InitClick' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TMyClass.InitClick(Sender: TObject);
    var
      Parent: TMyObject;
      Ptr: PMyObject;
    begin
      Parent := TMyObject.Create("parent");
      New(Ptr);
      Ptr^ := Parent;
      TreeView.Items.AddObject(nil,Parent.Name,Ptr);
      TreeView.Selected := TreeView.Items[0];
    end;
    Jusque là, tout va bien.

    [Debugger]
    PMyObject(TreeView.Selected.Data)^: ('parent') // OK
    PMyObject(TreeView.Item[0].Data)^: ('parent') // Normal aussi

    - J'ajoute un enfant (quasiment de la même manière). Je peux donc changer la sélection (parent ou enfant).
    - Je sélectionne l'enfant :

    [Debugger]
    PMyObject(TreeView.Selected.Data)^: ('enfant') // C'est bon
    Et là :
    PMyObject(TreeView.Item[0].Data)^: Valeur inaccessible
    ou une connerie du genre :
    PMyObject(TreeView.Item[0].Data)^: ('#|çg||:')

    Bref, n'importe quoi, c'est à dire que l'objet pointé n'existe plus, comme si l'ajout de l'enfant avait supprimé ou remplacer l'espace mémoire où était le parent.

    Si je reviens sur le parent, ça plante forcément, vu que dans l'événement TreeViewChange, je fais des opérations sur le noeud. Aprés l'erreur, je vérifie, je reselectionne l'enfant : il est toujours là :
    PMyObject(TreeView.Selected.Data)^: ('enfant')

    Voilà. Si vous avez lu jusque là, je vous en remercie parce que c'est pas évident à expliquer et j'espère que vous avez compris et que vous pourrez m'aider.
    Note : ce ne doit pas être une grosse erreur, ça marchait avant, mais plus moyen de retrouver la solution.
    BlackWood
    Et comme apparemment, ça fait "class" dans une signature :
    , , , ,

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    1 - tes transtypages en pointeur d'objet ne servent à rien car les objets sont implémentés en Delphi par des pointeurs.
    Exemple :
    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 TForm1.Button1Click(Sender: TObject);
    var
      objet: TMonObjet;
    begin
      objet:= TMonObjet.Create;
      objet.Name:= 'Hello';
      TreeView1.Items.AddObject(nil, objet.Name, objet);
    end;
     
    procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
      if Assigned(Node) then
        Label1.Caption:= TMonObjet(Node.Data).Name;
    end;
    2 - Tu dois avoir un problème avec la méthode qui ajoute un noeud enfant, celle qui est "quasiment" identique

  3. #3
    Membre habitué Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Points : 169
    Points
    169
    Par défaut
    Effectivement, il n'y a pas besoins de pointeurs et ça facilite énormement la chose. Merci, mon problème est réglé. C'était au niveau des pointeurs dans ma méthode "quasiment" identique
    BlackWood
    Et comme apparemment, ça fait "class" dans une signature :
    , , , ,

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

Discussions similaires

  1. Problèmes avec les pointeurs
    Par dlaumor dans le forum C
    Réponses: 8
    Dernier message: 17/10/2007, 14h06
  2. Problème avec les pointeurs intelligents de boost.
    Par Le Barde dans le forum Boost
    Réponses: 2
    Dernier message: 05/09/2007, 12h47
  3. Petit problème avec les pointeurs et variable
    Par mitherkiller dans le forum C
    Réponses: 5
    Dernier message: 09/03/2007, 22h05
  4. problème avec les pointeurs en c
    Par dialloma dans le forum C
    Réponses: 14
    Dernier message: 01/01/2007, 21h22
  5. probléme avec les pointeurs
    Par killer_instinct dans le forum C++
    Réponses: 6
    Dernier message: 11/12/2006, 11h37

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