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 :

Problème avec Virtual Treeview


Sujet :

Composants VCL Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème avec Virtual Treeview
    Bonjour,

    J'ai petit souci... Lorsque je tente de supprimer un noeud, l'application me renvoie l'erreur "Invalid Pointer Opération"....
    A ce moment là je ne panique pas je regarde le très bon tutorial livré avec VT où je lis qu'il faut apparement libérer l'espace mémoire sur l'événement OnFreeNode via la fonction "Free" lorsque l'on souhaite supprimer un noeud.
    Mais voilà étant donné que je n'est pas pompé caractère par caractère le code du tutorial et bien je suis perdu et je n'arrive à accéder à cette fonction Free...
    Voici le type de noeud que j'ai déclaré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TTreeData = record
      Text : Widestring;
      ImageIndex : integer;
      end;
    PTreeData = ^TTreeData;
    Et la procédure à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TMaForme.MonArbreFreeNode(Sender: TBaseVirtualTree;
      Node: PVirtualNode);
    begin
    end;
    Donc si quelqu'un peut m'aider...

    Merci,

    WL[/code]

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    difficile de se faire une opinion avec si peu d'info
    comment inseres-tu tes données a tes nodes??

    note que le freenode n'est utile que si tu as ajouté des données en creant un nouveau pointer.
    sinon c'est inutile.



    mais vu d'ici tu devrais te servir plutot d'un record appelant la classe de donnée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    type 
     tnodedata = class
     public
         Text : Widestring; 
         ImageIndex : integer; 
     published
          constructor create({tes parametres});
         (destructor si tu en a besoin)
     end; 
     
      TTreeData = record 
         data:tnodedata,
      end; 
    PTreeData = ^TTreeData;

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Si tu fais ça, autant placer directement la valeur pointant sur la classe dans le champ Data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Node.Data := MesNodeData; // avec MesNodeData : TNodeData (classe)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par sjrd
    Si tu fais ça, autant placer directement la valeur pointant sur la classe dans le champ Data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Node.Data := MesNodeData; // avec MesNodeData : TNodeData (classe)
    c'est exactement l'idée, mais il n'est pas recommandé de le faire directement . il vaut mieux utiliser la methode addchild, qui permet une meilleure allocation de la memoire.

    la definition d'un record pour le data est necessaire car il faut au prealable indiquer quelle est la taille de Data et ce qu'il contient (data n'est pas defini par defaut par VT, et donc n'est pas forcement un pointeur). Avec le record qui pointe sur le tnodedata, on est sur que la taille ne varie jamais (et est optimisée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node:=MyTree.AddChild(nil,TNodeData.create{param});

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci, je vais essayer de suivre vos instruction bien que je n'ai pas encore tous saisie.... Enfin il n'est 07:40 c'est le début de la journée et je suis encore un peu endormie donc je ne perd pas espoir.

    Sinon pour à la première question qui m'a été posé concernant la façon dont j'insérais mes noeuds, voici mon code (il faut savoir que je travail à partir d'un fichier XML)

    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
    procedure TwinGestProjet.actMajTreeTacheExecute(Sender: TObject);
    var
      NodeT,NodeP:PVirtualNode;
      NodeData:PTreeData;
      i,j:integer;
     
    begin
    for i:=0 to lstTache.Count - 1 do
      begin
      NodeT := XMLTree.AddChild(nil);
      NodeData := XMLTree.GetNodeData(NodeT);
      NodeData.Text := lstTache.Items[i].NomTache;
      NodeData.ImageIndex := 0;
      for j:=0 to lstTache.Items[i].Probleme.Count - 1 do
        begin
        NodeP := XMLTree.AddChild(NodeT);
        NodeData := XMLTree.GetNodeData(NodeP);
        NodeData.Text := lstTache.Items[i].Probleme.Items[j].NomProbleme;
        NodeData.ImageIndex := 1;
        end;
      end;
    end;
    avec un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLTree.NodeDataSize := SizeOf(PTreeData);
    à la création de ma Form.

    Voilà.

    Merci

    WL

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    ok alors utilise les declarations que je t'ai proposé

    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
    type 
     tnodedata = class 
     public 
         Text : Widestring; 
         ImageIndex : integer; 
     published 
          constructor create(T: Widestring;I : integer); 
     end; 
     
      TTreeData = record 
         mydata:tnodedata, 
      end; 
    PTreeData = ^TTreeData;
     
     
    implementation
     
    constructor tnodedata.create(T: Widestring;I : integer); 
    begin
      Text : =t;  
      ImageIndex := i; 
    end;
    ce qui te permet, au lieu de faire ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NodeT := XMLTree.AddChild(nil); 
      NodeData := XMLTree.GetNodeData(NodeT); 
      NodeData.Text := lstTache.Items[i].NomTache; 
      NodeData.ImageIndex := 0;
    de de creer les nodes de cette facon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NodeT := XMLTree.AddChild(nil, tnodedata.create(lstTache.Items[i].NomTache,0));
    tout simplement

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ca marche nickel !

    Merci beaucoup

    WL

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

Discussions similaires

  1. Problème avec virtual PC
    Par freshman dans le forum Windows XP
    Réponses: 5
    Dernier message: 13/11/2008, 21h30
  2. Problème avec un TreeView
    Par steph_1 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 05/09/2007, 12h43
  3. problème avec Virtual Box
    Par belaggoun2000 dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 19/06/2007, 11h09
  4. Problème avec un TreeView VBA
    Par JojoAlex dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 22/05/2007, 16h59
  5. Problème avec un treeview
    Par adicor dans le forum MFC
    Réponses: 8
    Dernier message: 01/12/2006, 22h59

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