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 :

Problème de pointeurs et de record


Sujet :

Langage Delphi

  1. #1
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut Problème de pointeurs et de record
    Salut tout le monde.
    J'ai un petit souci avec des pointeurs:
    J'ai une partie où je saisis un prénom,un nom et une adresse.Quand je clique sur le bouton "ajouter" le prénom saisi est affiché dans le TreeView et la propriété Data du TreeNode créé contient le pointeur vers le record TInfos contenant les champs Nom,prénom et adresse.
    Quand je double-clique sur le node,je récupère la propriété "Data",la convertis en TInfos,et affiche dans 3 labels.
    Seulement,quand je double-clique,les champs Nom et prénom sont vides,tandis que le champ adresse est vide.

    Je mets le code en pièce jointe,et merci d'avance pour vos réponses.
    Fichiers attachés Fichiers attachés
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  2. #2
    rbh
    rbh est déconnecté
    Membre confirmé Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 381
    Points : 471
    Points
    471
    Par défaut
    Salut
    il faut que tu alloues un espace mémoire pour ton pointeur.
    Regarde dans l'aide du côté de la fonction New;

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    tu peux aussi pour te simplifier l'écriture déclarer un type de pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type 
      PInfos = ^TInfos;
      TInfos = record
        nom : String;
        prenom : String;
        adr : String; 
      end;
    Si je ne me trompe pas, ton infos est une variable locale, donc en toute logique, Delphi, va libérer la structure dans "end;" de la procédure, ainsi ton pointeur pointe sur une zone mémoire qui peut soit être nullifié, soit contenir tout à fait autre chose ...

    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
    22
    23
    24
    25
    26
    27
    28
    29
    procedure TTest.Button1Click(Sender: TObject);
    var
        infos : PInfos;
        node : TTreeNode;
    begin
       new(Infos);
       infos^.nom := Edit1.Text; // ^ implicite mais c'est mieux de voir ce qu'on fait
       infos^.prenom := Edit2.Text;
       infos^.adr := Edit3.Text;
       node := TreeView1.Items.AddChild(TreeView1.TopItem,Edit2.Text);
       node.Data := Pointer(infos);
       Label7.Caption := infos.nom;
       Label8.Caption := infos.prenom;
       Label9.Caption := infos.adr;
     
    end;
     
    procedure TTest.TreeView1DblClick(Sender: TObject);
    var  
        tmp : TInfos;
    begin
      if Assigned(TreeView1.Selected.Data) then
      begin
        tmp := PInfos(TreeView1.Selected.Data)^;
        Label7.Caption := tmp.nom;
        Label8.Caption := tmp.prenom;
        Label9.Caption := tmp.adr;
      end;
    end;
    Ne pas oublier un Dispose lors de la suppression du Node !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Et si je créé tableau de TInfos globales,le redimensionner à chaque fois que je créé un TreeNode,est-ce que ça pourrait marcher(je ne suis pas sur mon PC de dev,c'est pour ça que je pose la question...)
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Inutile de faire une globale, c'est New qu'il te faut ... rien d'autres ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    En fait,jai alloué un tableau global de 1000 "TInfos",et j'ai fait pointé mon pointeur sur un item du tableau de TInfos.

    Sinon,l'aide Delphi n'est pas claire sur l'utilisation de New...
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    La Solution du Tableau peut fonctionner, mais c'est dommage de ne pas exploter la propriété Data fourni par le TreeView

    Sinon, pour le New, moi j'ai aussi commencé par l'utilisé pour l'un de mes projets de DUT, qui était un Editeur de Base de Registre, j'ai pris l'aide du TreeNode.Data, et l'exemple fourni, tu n'es peut-être pas encore habitué à manipuler l'aide, lit donc ceci, moi cela m'a vraiement aidé :

    Lorsqu'une application a terminé d'utiliser une variable dynamique créée avec New, elle devrait libérer la mémoire allouée pour la variable en utilisant la procédure standard Dispose.
    Le code suivant définit un type d'enregistrement TMyRec et un type pointeur sur cet enregistrement PMyRec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
    PMyRec = ^TMyRec;
    TMyRec = record
      FName: string;
      LName: string;
    end;
    En supposant que ces types soient utilisés, le code suivant ajoute un noeud à TreeView1 comme étant le dernier noeud de même niveau qu'un noeud spécifié. Un enregistrement TMyRec est associé à l'élément ajouté. Les champs FName et LName sont obtenus à partir des boîtes de saisie Edit1 et Edit2. Le paramètre Index est obtenu à partir de la boîte de saisie Edit3. L'élément n'est ajouté que si Index est une valeur valide.
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    var
      MyRecPtr: PMyRec;
      TreeViewIndex: LongInt;
    begin
      New(MyRecPtr);
      MyRecPtr^.FName := Edit1.Text;
      MyRecPtr^.LName := Edit2.Text;
      TreeViewIndex := StrToInt(Edit3.Text);
      with TreeView1 do
      begin
        if Items.Count = 0 then
          Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
        else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then
     
          Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);
      end;
    end;
    Après qu'un élément contenant un enregistrement TMyRec ait été ajouté, le code suivant extrait les valeurs FName et LName associées à l'élément et affiche les valeurs dans un libellé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button2Click(Sender: TObject);
     
    begin
      Label1.Caption := PMyRec(TreeView1.Selected.Data)^.FName + ' ' +
                      PMyRec(TreeView1.Selected.Data)^.LName;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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