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

C++Builder Discussion :

Remplir un VirtualTreeView


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Points : 27
    Points
    27
    Par défaut Remplir un VirtualTreeView
    Bonjour, j'espère que certains ici connaissent le composant de Soft Gems (VirtualTreeView).

    J'essaie de l'utiliser pour la première fois sour C++ Builder 6.
    Ma première tâche simple est de rajouter des lignes (nodes) dans mon VirtualTreeView avec si possible les différentes valeurs sous les colonnes (Header). Malheureusement je n'ai à disposition que des démos pour Delphi et je peine à traduire le tout pour C++ Builder.

    Tout d'abord j'ai traduit le Record de Delphi nécessaire au stockage des données par cette déclaration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct TreeData
      {
      String Caption;
      };
    TreeData *DataTree;
    puis j'ai vu dans la démo qu'il fallait fournir à l'arbre les moyens de gérer/rafraîchir l'affichage des valeurs à partir des données de mon struct à travers les procédures InitNode et Get Text dont voila les versions Delphi:


    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
    procedure TMainForm.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
      var InitialStates: TVirtualNodeInitStates);
     
    var
      Data: PMyRec;
     
    begin
      with Sender do
      begin
        Data := GetNodeData(Node);
        // Construct a node caption. This event is triggered once for each node but
        // appears asynchronously, which means when the node is displayed not when it is added.
        Data.Caption := Format('Level %d, Index %d', [GetNodeLevel(Node), Node.Index]);
      end;
    end;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TMainForm.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
      var Text: WideString);
     
    var
      Data: PMyRec;
     
    begin
      // A handler for the OnGetText event is always needed as it provides the tree with the string data to display.
      // Note that we are always using WideString.
      Data := Sender.GetNodeData(Node);
      if Assigned(Data) then
        Text := Data.Caption;
    end;
    Que j'ai traduit (pour le début) en C++ Builder par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm3::VSTInitNode(TBaseVirtualTree *Sender,
          PVirtualNode ParentNode, PVirtualNode Node,
          TVirtualNodeInitStates &InitialStates)
    {
    TreeData *Data;
     
            Data=Sender->GetNodeData(Node);
     
     
    }
    Mais je chope une erreur à la compilation:
    [C++ Erreur] Unit3.cpp(245): E2034 Impossible de convertir 'void *' en 'TreeData *'
    Et effectivement il est logique que la fonction GetNodeData ne renvoyant qu'un pointeur vide, je ne puisse remplir mes données avec ! Mais comment Delphi fait-il pour que celà fonctionne ?
    Quelqu'un a une idée ?

  2. #2
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Tu as essayé de caster le résultat de GetNodeData tout simplement ?

  3. #3
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    Bonjour,

    Comme le dit Greybird, il faut faire un cast

    DBclik dans l'inspecteur d'objets, sur l'envenement OnGetText, Builder te
    produit le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void __fastcall TForm1::VirtualStringTree1GetText(TBaseVirtualTree *Sender,
          PVirtualNode Node, TColumnIndex Column, TVSTTextType TextType,
          WideString &CellText)
    {
        //--- Ajoute ton code
       TreeData* pTree;
        //--- Cast du Sender
        pTree = ((TreeData*)Sender)->GetNodeData(Node);
        //--- Tester si pointeur NULL
        if (pTree)
            CellText = pTree->Caption;
    }
    Tu doit egalement, si tu en a besoin, biensur, reconstruire le paquet VT_AddOn pour C++Builder6. La version fournie ne fonctionne qu'avec
    C++Builder 5

    Voila
    Bon courrage
    Alain

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 54
    Points : 27
    Points
    27
    Par défaut
    OK ça marche niquel maintenant merci

    Voila mon code final, en switchant sur la valeur de la colonne:

    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
    ptrMyRec Data;
       Data = (MyRec *) Sender->GetNodeData(Node);
       switch (Column) {
          case 0:
             CellText = Data->Name;
             break;
          case 1:
             CellText = IntToStr(Data->idorfirstbit);
             break;
          case 2:
             CellText = IntToStr(Data->lengthorlastbit);
             break;
          case 3:
             CellText = Data->type;
             break;
       }
    P.S: les données sont maintenant de type MyRec.

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

Discussions similaires

  1. remplir des tables a partir de fichiers TXT
    Par jeremie dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 10/03/2004, 15h50
  2. BCB6 => Remplir un ListView
    Par totofweb dans le forum C++Builder
    Réponses: 6
    Dernier message: 25/02/2004, 16h12
  3. remplir feuille excel
    Par thibaud60 dans le forum Access
    Réponses: 2
    Dernier message: 24/11/2003, 11h21
  4. [VB.NET] Créer et remplir un nouveau fichier Access
    Par Manue.35 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 18/07/2003, 16h42
  5. [TChart] comment remplir un histogramme avec du rouge strié.
    Par :GREG: dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/08/2002, 10h37

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