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 :

Treeview avec des colonnes [IDE]


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut Treeview avec des colonnes
    Bonjour,

    je travaille avec C++ builder XE.
    je cherche un composant Treeview dans lequel il y aurait des colonnes.
    Je m'explique : j'ai besoin donc d'un treeview, où pour chaque noeud, j'aimerai pouvoir afficher des informations supplémentaires.
    J'ai installer les composants Jvcl mais je ne trouve rien qui correspond.
    Est ce que ce genre de composant existe (dans la Jvcl ou ailleurs?)
    J'ai pas mal chercher et il me semble que je ne suis pas la seule à avoir ce besoin !

    merci
    Pascale38

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    TMS ou DevExpress fournissent des grilles avec TreeView incopéré mais aussi l'inverse, je suppose !

    Sinon, perso, je l'ai codé à la main en Delphi, juste avec un OnCustomDrawItem et quelques DrawText que je décalais pour chaque colonne !
    Si tu je te retrouve le code ...

    Sinon le TVirtualTreeview fourni une gestion de colonne via OnGetText
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    Je ne connais pas TMS ni devExpress, je vais aller voir ce que c'est.
    En ce qui concerne le Virtual TreeView, je n'arrive pas à l'installer, j'ai l'erreur suivante :
    >>> BPL Output Directory is not defined in "Environment Options"
    >>> DCP Output Directory is not defined in "Environment Options"
    j'ai cherché sur le web, je ne suis pas la seule à avoir cette erreur mais je n'ai pas trouvé de réponse. J'ai essayé d'ouvrir le projet et de compiler mais il me manque des fichiers...

    merci pour ton aide.
    Pascale38

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    Ok TMS et devExpress malheureusement payant... mon patron va pas être d'accord
    Si tu retrouves ton code oui ça m'intéresse bien sûr !!
    merci !

    Pascale38

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Si ton Patron ne veut pas investir 500€ dans un pack TMS Grid, rappel lui que tu si tu y passe 3 jours, cela coutera tout aussi cher pour un résultat qui ne répresentent même pas 1% des fonctionnalités de TMS !

    Sinon, pour le code, il est en Delphi et je ne sais pas où je l'ai mis, tu devrais te lancer, c'est vraiment pas compliqué d'utiliser le Canvas et DrawText, tu as même des fonctions genre TabbedTextOut qui te permettent de faire l'alignement sans effort

    EDIT : tient, je me suis dit que cela serait un bon exercice pour moi de refaire cela en C++, c'est déjà une piste mais bon, je suppose que tu avais déjà réussi cela depuis hier 15h, tu as eu le temps de régler les détails ( comme la gestion du Focus) !

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::BtnTreeViewMiscColumnAddClick(TObject *Sender)
    {
      AnsiString Value;
      if (InputQuery("Ajout d'une Colonne", "Largeur ?", Value))
      {
        int ColWidth;
        if (TryStrToInt(Value, ColWidth))
        {
          if (ColWidth > 0)
          {
            TreeViewColWidths.push_back(ColWidth);
            TreeViewMisc->Invalidate();
          }
        }
      }
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::BtnTreeViewMiscColumnDeleteClick(TObject *Sender)
    {
      AnsiString Value;
      if (InputQuery("Suppression d'une Colonne", "Numéro (indice en base 0)", Value))
      {
        int ColIndex;
        if (TryStrToInt(Value, ColIndex))
        {
          if ((0 <= ColIndex) && (ColIndex < (int)TreeViewColWidths.size()))
          {
            for (TTreeViewColWidthList::iterator it = TreeViewColWidths.begin(); it != TreeViewColWidths.end(); ++it)
            {
              if (ColIndex == 0)
              {
                TreeViewColWidths.erase(it);
              }
              else
                ColIndex--;
            }
     
            TreeViewMisc->Invalidate();
          }
        }
      }
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::BtnTreeViewNodeAddClick(TObject *Sender)
    {
      TreeViewMisc->Items->AddChild(TreeViewMisc->Selected, "Node N°" + IntToStr(TreeViewMisc->Items->Count))->MakeVisible();
    }
     
    //---------------------------------------------------------------------------
     
    void __fastcall TVCLManipForm::TreeViewMiscAdvancedCustomDrawItem(
          TCustomTreeView *Sender, TTreeNode *Node, TCustomDrawState State,
          TCustomDrawStage Stage, bool &PaintImages, bool &DefaultDraw)
    {
      if ((Stage == cdPostPaint) && Sender->InheritsFrom(__classid(TTreeView)))
      {
        TTreeView *Tree = (TTreeView*)Sender;
        TRect NodeRect = Node->DisplayRect(true);
        if (NodeRect.Left > 0)
        {
          Tree->Canvas->TextOut(NodeRect.Left + 2, NodeRect.Top + 2, Node->Text);
     
          int ColIndex = 0;
          for (TTreeViewColWidthList::const_iterator it = TreeViewColWidths.begin(); it != TreeViewColWidths.end(); ++it)
          {
            Tree->Canvas->TextOut(NodeRect.Left + *it + 2, NodeRect.Top + 2, AnsiString().sprintf("Col N°%d - %d [%s]", ColIndex, *it, Node->Text));
            ColIndex++;
          }
        }
      }
    }
    //---------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private:	// Déclarations utilisateur
      typedef std::list<int> TTreeViewColWidthList;
      TTreeViewColWidthList TreeViewColWidths;
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    hé merci, non je n'ai pas eu le temps de re regarder car réunion et d'autres trucs à gérer avant.
    De plus je ne suis pas super à l'aise avec tous ça car pas du tout spécialiste de c++ builder et de ces composants. Donc merci, je pense que ce que tu as fait va beaucoup m'aider car à vrai dire je n'aurai pas trop su comment commencer !!
    Bon ben à moi de jouer !!
    Pascale38

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Citation Envoyé par Pascale38 Voir le message
    Je ne connais pas TMS ni devExpress, je vais aller voir ce que c'est.
    En ce qui concerne le Virtual TreeView, je n'arrive pas à l'installer, j'ai l'erreur suivante :
    >>> BPL Output Directory is not defined in "Environment Options"
    >>> DCP Output Directory is not defined in "Environment Options"
    j'ai cherché sur le web, je ne suis pas la seule à avoir cette erreur mais je n'ai pas trouvé de réponse. J'ai essayé d'ouvrir le projet et de compiler mais il me manque des fichiers.
    Pour installer VirtualTreeView, il faut déclarer le répertoire "source" et les répertoires BPL et DCP créés par l'installation dans le path:
    1) Ouvrir les options -> C++ Options -> Path and Directories (en anglais)
    2) Cliquer sur le bouton de "Include path" (le premier en haut à droite)
    3) Ajouter les répertoires "$(BDSCOMMDIR)\BPL" et "(tonpath)\Virtual Treeview\Source"
    4) Ok
    5) Cliquer sur le bouton de "Library path" (celui en dessous de l'include path)
    6) Ajouter les répertoires "$(BDSCOMMDIR)\BPL", "$(BDSCOMMDIR)\DCP" et "(tonpath)\Virtual Treeview\Source"
    7) Ok
    8) Ok

    Le VirtualTreeView est assez difficile à utiliser au début mais très efficace et rapide si tu as des grandes listes.

    Edit: J'ai retrouvé une autre note pour l'installation: il faut que la personnalité Delphi du RAD Studio soit installée
    http://www.soft-gems.net/support/for...pic.php?p=4945

    Bonne chance

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    merci ShaiLeTroll pour ton code, ça marche bien, mais ça ne donne pas vraiment ce que je veux, car je n'ai pas des "vraies colonnes". C'est à dire que l'utilisateur ne peut pas les redimensionner...
    Va falloir que j'arrive à décider mon boss à investir... c'est pas gagné !!

    Pascale38

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Pour le redimensionnent de tes colonnes !
    Une astuce, colle un composant avec des colonnes redimensionnable (TStringGrid, TListView, essaye les tous), réduit le juste de la taille des colonnes, retire les scrollbars, et dans le OnColumnResize (si dispo), tu modifie la liste TreeViewColWidths et force le dessin !
    Et le tour est joué !
    Tu peux aussi construire tes colonnes avec des Panels, avec OnMouseDown couplé à des SendMessage comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      PanelSplitterHorizontalTop->Perform(WM_LBUTTONUP, 0, 0);
      PanelTop->Perform(WM_NCLBUTTONDOWN, HTBOTTOM, 0);
    PanelTop et PanelSplitterHorizontalTop en align Top
    PanelSplitterHorizontalTop en dessous de PanelTop
    PanelSplitterHorizontalTop se comporte comme splitter avec juste ces deux lignes dans OnMouseDown !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {
      if (Sender->InheritsFrom(__classid(TPanel)))
      {
        ((TPanel*)Sender)->Perform(WM_LBUTTONUP, 0, 0);
        ((TPanel*)Sender)->Perform(WM_SYSCOMMAND, SC_MOVE + 2, 0); // Bloque tant que l'on maintient le bouton de la souris appuyé !
        OutputDebugString(AnsiString("End Move " + ((TPanel*)Sender)->Name).c_str());
      }
    }
    Un autre panel, posé sans rien modifier d'autre que OnMouseDown, tu obtiens un panel qui se peut être déplacé librement

    Encore un autre panel, aucune modification
    dans le constructeur de la fenêtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SetWindowLong(PanelImageSizeable->Handle, GWL_STYLE,
        GetWindowLong(PanelImageSizeable->Handle, GWL_STYLE) | WS_SIZEBOX);
     
      PanelImageSizeable->Width += 1; // C'est le seul truc efficace pour que WS_SIZEBOX soit pris en compte, Invalidate, SetWindowPos, rien ne passe à part cette bidouille
    tu obtiens un Panel redimensionnable à volonté !

    Il n'y a pas de limite aux possibilités, juste l'imagination et la détermination ...
    euh ça c'est pas un réplique de film ça ... merde, j'ai vu Green Lantern hier ...

    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

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 229
    Par défaut
    Tout ça devenait un peu trop compliqué à gérer pour moi ;-)
    J'ai finalement réussi à installer le VirtualTreeView qui est un composant bien pratique !!!
    Je rajouterai par rapport à l'installation de ce composant qui m'a donné du fil à retordre, que non seulement il faut avoir delphi d'installer, mais que ça n'est pas pour autant que le composant s'installe comme il faut (ce qui m'est arrivé).
    Dans ce cas il faut compiler et installer le composant à la main avec le profil delphi, ce qui ne pose pas de réel problème, à un bug de l'IDE près qui fait que le composant n'est pas visible en profil c++.
    Donc AVANT de compiler ou si votre composant n'est pas visible aller voir ce lien :
    http://blog.zachsaw.com/2008/10/delp...ring-in-c.html

    Je mets ce post en résolu ?
    merci beaucoup à tous pour votre aide !!!

    Pascale38

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

Discussions similaires

  1. DataTable avec des colonnes dynamiques
    Par PrinceDeLu dans le forum JSF
    Réponses: 5
    Dernier message: 15/04/2011, 10h54
  2. [Struts-Layout] treeview avec des checkbox
    Par guiillaume63 dans le forum Struts 1
    Réponses: 3
    Dernier message: 16/05/2007, 14h46
  3. Réponses: 3
    Dernier message: 10/05/2007, 14h12
  4. Réponses: 4
    Dernier message: 05/12/2006, 11h43
  5. [CSS] Remplacer un tableau avec des colonnes
    Par mullger dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 22/08/2006, 15h30

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