TTreenode.Data + Pointeurs / HEELLLPP PLZ !

TTreenode.Data + Pointeurs / HEELLLPP PLZ ! - Delphi/Pascal - Programmation

Marsh Posté le 06-04-2006 à 16:21:38    

Bonjour,
voila dans un treeview il y a la propriete Data (Pointer) qui permet de stocker des informations.
 
Je voudrais memoriser plusieurs infos a partir d une structure pour chaque noeuds.
Mais pas moyen de pouvoir recuperer mes infos, est ce un pb de pointeur ou de mon utilisation du Data ??
 
Voici du code plus detaille de ce que je voyais :
 
Type
  PMaVar = TMaVar^
  TMaVar = record
    monchemin: string;
    test: integer;
    fichier: string;
  end;
 
 
 
une fonction qui permet de reconstituer mon arborescence dans le treeview a partir d une bdd où je definis chaque data de chaque noeud en boucle :
 
    CNode := treeviewCible.Items.AddChild(PTreeNode_Actuel^, requete.FieldByName('EMPLACEMENT').AsString);
    New(Ptr);
    Ptr^.test   := requete.FieldByName('PROFONDEUR').AsInteger;
    Ptr^.monchemin := requete.FieldByName('POSITION_NODE').AsString;
    Ptr^.fichier     := requete.FieldByName('CHEMIN_EMPLACEMENT').AsString;
    Pointer_List.Add(Ptr);
    CNode.Data:= @Ptr;
    PTreeNode_Actuel:= @CNode;
 
et ensuite je voudrais ajouter un noeud a partir d un bouton mais quand je fais :
 
  iPosition := TMaVar(twEmplacement.Selected.data^).test;
 
pour recuperer justement une des informations dont j ai besoin, la valeur recuperee est totalement erronee.
Je n ai pas de plantage, mais des valeurs qui ne sont pas bonnes (genre 5 au lieu de 0 pour un integer, et du nimporte quoi pour les string.
 
 
 
QQun saurait il me dire pk ? y a t il un gros souci qq part dans mon code ?
 
Merci a toute ame genereuse qui essayera de faire avancer le schmilblick  :jap:


Message édité par mkracing66 le 06-04-2006 à 16:40:46
Reply

Marsh Posté le 06-04-2006 à 16:21:38   

Reply

Marsh Posté le 07-04-2006 à 14:43:12    

La première remarque, c'est que tu complique pour rien : Mettre  des pointeur partout ç'est mal(oui:je suis le président de l'Association d'Extermination des Pointeurs de Pointeurs)
 
Rapel1 : un objet est un pointeur.
Rapel 2 : un pointeur est une variable de 4 octect contenant une adresse
La ligne "PTreeNode_Actuel:= @CNode;" toute seul est dèja tout un poème.  [:adodonicoco]  
 
CNode est une variable contenant une adresse.
@CNode est l'adresse de la variable contenant une adresse
Apperemment, PTreeNode_Actuel est un pointeur pointant sur un TTreeNode
Donc, PTreeNode_Actuel est une variable destiné à contenir l'adresse d'une varible contenant une adresse  [:gijar]  
 
Du coup, la ligne est effectivement corecte, mais p'tet un poil trop compliqué, non?
 
 
Code sugeré :
 

var TreeNode_Actuel : TTreeNode;
  MaVar : TMaVar;
 
(...)
    CNode := treeviewCible.Items.AddChild(TreeNode_Actuel, requete.FieldByName('EMPLACEMENT').AsString);  
    New(Ptr);  
    Ptr^.test   := requete.FieldByName('PROFONDEUR').AsInteger;  
    Ptr^.monchemin := requete.FieldByName('POSITION_NODE').AsString;  
    Ptr^.fichier     := requete.FieldByName('CHEMIN_EMPLACEMENT').AsString;  
    Pointer_List.Add(Ptr);
    CNode.Data:= Ptr;  //et non @Ptr. Par contre, si tu avais un Variable de type TMaVar, tu pourait metre CNode := @MaVar
    TreeNode_Actuel:= CNode;


 
Je sais pas si ça sufira (par exemple, j'espère que tu initialise TreeNode_Actuel avant d'entrer dans la boucle), mais au moin, ca simplifie le debugage  [:airforceone]  
 
Note : Tu peut définitivement te débarasser des pointeur (du moin des pointeur explicite) en transformant ton record en un objet (les record sont pratique pour lire/ecrire dans des fichiers, mais si tu met des "String" dedant, ça vas pas bien marcher)


Message édité par el zozo le 07-04-2006 à 14:52:23
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed