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' :
Jusque là, tout va bien.
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;
[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.
Partager