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 :

Récupérer l'objet d'un TreeView


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut Récupérer l'objet d'un TreeView
    Bonjour,

    J'utilise pour la première fois un TTreeView pour dérouler un logigramme. Je le génère pour l'instant à partir de Logigramme = array[0..4] of MonRecord, fixé dans le code de FormCreate (je m'entraine !). Je n'arrive pas à récupérer l'objet associé à chaque noeud (que j'ai appeler ObjLogigramme).

    Définition de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TObjLogigramme = class(TObject) // un objet de 3 string ! c'est pour essayer !!
        Title   : String;
        Short   : String;
        Display : String;
      end;
    Procédure pour charger le TreeView à partir de Logigramme :
    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
      for i := 0 to high(Logigramme) do
      begin
        ObjLogigramme.Title   := Logigramme[i].Title;
        ObjLogigramme.Short   := Logigramme[i].Short;
        ObjLogigramme.Display := Logigramme[i].Display;
     
        if Logigramme[i].Parent = -1 then   // première racine
        begin
          ndNoeud := TVwLogigramme.Items.AddNode(nil, nil, Logigramme[i].Text, ObjLogigramme, naAddFirst);
          ndNoeud.ImageIndex := Logigramme[i].Image;
          ndNoeud.SelectedIndex := Logigramme[i].SelectedImage;
        end
        else // pour tous les autres = qui sont toujours les enfants de quelqu'un !
        begin
          NoeudParent := TVwLogigramme.Items.Item[Logigramme[i].Parent];
          ndNoeud := TVwLogigramme.Items.AddNode(nil, NoeudParent, Logigramme[i].Text, ObjLogigramme, naAddChild);
          ndNoeud.ImageIndex := Logigramme[i].Image;
          ndNoeud.SelectedIndex := Logigramme[i].SelectedImage;
          ndNoeud.MakeVisible;
        end;
      end;
    Et pour récupérer les données à partir d'un click dans le TreeView :
    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
    procedure TForm1.TVwLogigrammeClick(Sender: TObject);
    var
      ndNoeud : TTreeNode;
      Souris : TPoint;
    begin
      Souris.X := Mouse.CursorPos.X - TVwLogigramme.Left - Form1.ClientOrigin.X;
      Souris.Y := Mouse.CursorPos.Y - TVwLogigramme.Top  - Form1.ClientOrigin.y;
     
     
      ndNoeud := TVwLogigramme.GetNodeAt(Souris.X, Souris.Y);
     
      if NOT (ndNoeud <> nil) then exit;
     
      ObjLogigramme := TVwLogigramme.Selected.Data;
    // essai de visualisation des données :
      MonRichEdit.Clear;
      MonRichEdit.Lines.Add(ndNoeud.Text); // affiche le bon texte !
      MonRichEdit.Lines.Add(ObjLogigramme.Display);  // à partir de là :
      MonRichEdit.Lines.Add(ObjLogigramme.Short);    // n'affiche que le dernier ObjLogigramme créé !!
      MonRichEdit.Text := ObjLogigramme.Title;         // Help !!
    end;
    Qu'est-ce qui ne tourne pas rond dans ce code de récupération d'un objet ?
    de votre aide !
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    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 534
    Points : 25 082
    Points
    25 082
    Par défaut
    ndNoeud est un TTreeNode
    ndNoeud.Data est un Pointer
    TObjLogigramme(ndNoeud.Data) est ton objet
    Cela m'étonne que tu puisse affecter sans transtyper !

    n'oublie pas d'instancier plusieurs TObjLogigramme avec Create
    Et de les libérer !
    Là j'ai l'impression que tu n'as qu'un ObjLogigramme et que du coup, ça contient toujours le dernier noeud !

    Test aussi l'un des ces lignes, Selected et GetNodeAt pourrait parfois être déphasé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ObjLogigramme := ndNoeud.Data;
      ObjLogigramme := TVwLogigramme.Selected.Data;
    ObjLogigramme est une globale ! non ?
    ça m'étonne que ce code compile, j'aurais écrit ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjLogigramme := TObjLogigramme (TVwLogigramme.Selected.Data);
    Tu devrais revoir les Cours sur les Instances d'une Classe, c'est la 1ère fois que tu joue avec plusieurs instances d'un même objet ?
    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

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 745
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 745
    Points : 13 306
    Points
    13 306
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    ça m'étonne que ce code compile, j'aurais écrit ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjLogigramme := TObjLogigramme (TVwLogigramme.Selected.Data);
    Le compilateur râlerait si Data était de type TObject, mais avec un pointeur non typé, il n'y a aucun contrôle possible !
    Cette partie du code de Archonte est correct

    ps: Il est vrai que la méthode AddObject devrait plutôt s'appeler AddData dans le cas d'un TreeView

  4. #4
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Merci Shai pour ta réponse !

    Citation Envoyé par ShaiLeTroll Voir le message
    ndNoeud est un TTreeNode
    ndNoeud.Data est un Pointer
    TObjLogigramme(ndNoeud.Data) est ton objet
    Cela m'étonne que tu puisse affecter sans transtyper !
    Le compilateur ne dit rien ... [Turbo Delphi 2006]

    Citation Envoyé par ShaiLeTroll Voir le message
    n'oublie pas d'instancier plusieurs TObjLogigramme avec Create
    Et de les libérer !
    Là j'ai l'impression que tu n'as qu'un ObjLogigramme et que du coup, ça contient toujours le dernier noeud !
    C'est tout à fait ça !
    Citation Envoyé par ShaiLeTroll Voir le message
    Tu devrais revoir les Cours sur les Instances d'une Classe, c'est la 1ère fois que tu joue avec plusieurs instances d'un même objet ?
    Euh, oui ! c'est la première fois. Quant à relire des cours que je n'ai jamais eus ... (oui, je sais, c'est le coté autodidacte amateur qui ressort) !
    Citation Envoyé par ShaiLeTroll Voir le message
    (...) j'aurais écrit ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjLogigramme := TObjLogigramme (TVwLogigramme.Selected.Data);

    J'ai réécris cette partie, en créant de multiples ObjLogigramme. Mais je n'ai toujours pas l'affichage désiré :

    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
      ndNoeud := TVwLogigramme.Selected;
     
      if NOT (ndNoeud <> nil) then exit;
     
      ObjLogigramme := TObjLogigramme.Create;
     
      TRY
    // j'ai déjà essayé tout un tas de formulations ...
     
      ObjLogigramme := TObjLogigramme(TVwLogigramme.Selected.Data);
    //  ObjLogigramme := TVwLogigramme.Selected.Data;
    //  ObjLogigramme := TObjLogigramme(ndNoeud.Data);
    //  ObjLogigramme := ndNoeud.Data;
     
    {La valeur de ObjLogigramme à ce moment là est valeur inaccessible / valeur inaccessible / et cette chaine de caractère que j'abrège  'e'#0'a'#1'd'#0'i'#0'e'#0'n'#0'a'#0#0#0#$B#0'c'#0'e'#0't'#0'u'#0'r'#0't'#0'd'#0'i'#0'e'#0'n'#0'a'#0#0#0#$A#0'p'#0'i'#0'e'#0'k'#0't'#0'd'#0'i'#0'e'#0'n'#0'a'#0#0#0#9#0's'#0'e'#0's'#0't'#0'd'#0'i'#0'e'#0'n'#0'a'#0#0#0#0#0#7#0#$8D'•'#0#0'˜•'#0#0'£•'#0#0#$AD'•'#0#0'¸•'#0#0'Å•'#0#0'Ñ•'#0#0#0#0#2#0'p'#0'r'#0#0#0#2#0'o'#
     
    Bref je ne doit pas pointer au bon endroit ?}
     
      MonRichEdit.Clear;
     
      MonRichEdit.Lines.Add(ndNoeud.Text);
      MonRichEdit.Lines.Add(ObjLogigramme.Display);
      MonRichEdit.Lines.Add(ObjLogigramme.Short);
     
      FINALLY
      ObjLogigramme.Free;
      END;
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    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 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjLogigramme := TObjLogigramme.Create;
    C'est avant AddNode qu'il faut le mettre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     for i := 0 to high(Logigramme) do
      begin
        ObjLogigramme := TObjLogigramme.Create;
        ObjLogigramme.Title   := Logigramme[i].Title;
        ObjLogigramme.Short   := Logigramme[i].Short;
        ObjLogigramme.Display := Logigramme[i].Display;
    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 averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    C'est comme ça que j'ai modifié mon code après ta première réponse.
    En pas-à-pas : lors du chargement du treeview, à chaque étape, l'ObjLogigramme est bien rempli.
    C'est à la lecture d'un noeud (OnClick du TreeView) que ça coince : je peux juste récupérer le texte du noeud. Je n'arrive pas à récupérer l'objet (cf. infra).

    D'ailleurs ce code minimaliste se termine sur un "access violation" dans le finally alors que je ne fais rien de mon objet :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    procedure TForm1.TVwLogigrammeClick(Sender: TObject);
    var
      ObjLogigramme : TObjLogigramme;
      ndNoeud : TTreeNode;
      Souris : TPoint;
    begin
    // ObjLogigramme : valeur : nil  
      Souris.X := Mouse.CursorPos.X - TVwLogigramme.Left - Form1.ClientOrigin.X;
      Souris.Y := Mouse.CursorPos.Y - TVwLogigramme.Top  - Form1.ClientOrigin.y;
    
    
      ndNoeud := TVwLogigramme.GetNodeAt(Souris.X, Souris.Y);
    
      if NOT (ndNoeud <> nil) then exit;
    
      ObjLogigramme := TObjLogigramme.Create;
    // ObjLogigramme : valeur : ('', '', '')  
      TRY
      ObjLogigramme := TObjLogigramme(TVwLogigramme.Selected.Data);
    // ObjLogigramme : valeur : valeur inaccessible 
    // ObjLogigramme.Title    : valeur : valeur inaccessible  
    // ObjLogigramme.Short   : valeur : valeur inaccessible  
    // ObjLogigramme.Display : valeur : 'e'#0'a'#1'd'#0'i'#0'e'#0'n'#0'a'#0#0...  
    
    //  ObjLogigramme := TVwLogigramme.Selected.Data;
    //  ObjLogigramme := TObjLogigramme(ndNoeud.Data);
    //  ObjLogigramme := ndNoeud.Data;
    
      MonRichEdit.Clear;
      MonRichEdit.Lines.Add(ndNoeud.Text);
    //  MonRichEdit.Lines.Add(ObjLogigramme.Display);
    //  MonRichEdit.Lines.Add(ObjLogigramme.Short);
    //  MonRichEdit.Lines.Add(ObjLogigramme.Title);
    
      FINALLY
      ObjLogigramme.Free; // --> ici Echec du projet : 'access violation ...'
      END;
    end;
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  7. #7
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Grand Merci à ShaiLeTroll : tes remarques m'ont permis de relire (et relire, et relire, et ....) mon code, jusqu'à m'apercevoir que je libérai (.free) mon objet après la création du TreeView (dans la fonction de création du TreeView). Ces objets n'étaient donc plus utilisables lors d'un click sur le TreeView !!!!

    Merci également à AndNotOr : un petit encouragement suffit parfois à se replonger dans le code !
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

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

Discussions similaires

  1. récupérer objet d'un treeview
    Par pavlacki dans le forum Delphi
    Réponses: 1
    Dernier message: 01/08/2006, 00h30
  2. Récupérer un objet d'une liste déroulante
    Par Hell dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/01/2005, 14h59
  3. [servlet][bean]comment récupérer l'objet request
    Par otminou dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 27/09/2004, 14h40
  4. Réponses: 4
    Dernier message: 15/09/2004, 16h52
  5. Récupérer la sélection d'un TreeView
    Par nostroyo dans le forum Composants VCL
    Réponses: 6
    Dernier message: 16/06/2003, 12h30

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