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

Delphi Discussion :

TreeView et case à cocher.


Sujet :

Delphi

  1. #1
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut TreeView et case à cocher.
    Bonjour à tous,

    Je rencontre un problème avec l'utilisation d'un TreeView...Je souhaiterais affecter une case à cocher sur tous les noeuds (parents et enfants). Je sais qu'il existe des composants conçuent spécialement pour mais je n'ai pas le droit de les utiliser dans le cadre de mon job.

    Voici le code que j'ai (merci aux membres de dévellopez.com ) tiré de cet exemple.:
    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
    procedure TForm1.TreeView1Click(Sender: TObject);
    var
      P : TPoint;
    begin
      GetCursorPos(P);
      P := Treeview1.ScreenToClient(P);
      if (htOnStateIcon in Treeview1.GetHitTestInfoAt(P.X, P.Y)) then
        GestTreeViewCheckBoxes(Treeview1.Selected);
    end;
     
    procedure TForm1.GestTreeViewCheckBoxes(Node : TTreeNode);
    const
      cUnChecked = 0;
      cChecked = 1;
    begin
      if Assigned(Node) then
        begin
          if Node.StateIndex = cUnChecked then
            begin
              Node.StateIndex := cChecked;
              if Node.Parent.StateIndex = cUnChecked then Node.Parent.StateIndex := cChecked;
            end
          else
            if Node.StateIndex = cChecked then
            Node.StateIndex := cUnChecked
        end;
    end;
    Mon problème c'est que lorsque je clic sur une case à cocher, c'est toujours le premier élément qui est coché/décoché lorsque je clic sur les cases (sauf sur la première parceque là ça fait rien du tout.

    J'écoute toute suggestion, merci d'avance

    A+.

  2. #2
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Tu as le droit d'utiliser des composants open sources ?

  3. #3
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Non, lol.

    J'ai même pas le droit à la jvcl (parceque sur un autre logiciel il ont eu des problèmes de mise à jour des versions de Delphi), alors j'ai le droit qu'aux composants natifs...

    Je sais c'est dur la vie d'un programmeur...

    A+.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    J'ai fait un test et manifestement, l'image "case à cocher" n'apparaît que si StateIndex > 0. Donc :
    Dans la TImageList, définir 3 images :
    En 0, la case non cochée par exemple, (ça n'a pas d'importance)
    En 1 la case non coché,
    En 2 la case coché.
    Ensuite définir les constantes dans la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const
      cUnChecked = 1;
      cChecked = 2;
    Là, chez moi, ça fonctionne. Pour ma part je travaille en D6 et l'aide indique que l'image apparaît si StateIndex <> -1 ... Dans mon test, elle doit être > 0 (j'avoue qu'un truc m'échappe là ...)
    Attention : Le test effectué sur node.parent risque de planter si celui-ci n'existe pas. En plus, il ne coche que le node parent et non les parents du parent (on peut dire les grand-parents ? )
    J'ai changé le code de la procédure pour que tous les noeuds situés au dessus soient aussi cochés (procédure recursive). On peut encore l'améliorer pour faire la même chose lorsqu'on décoche une case ...

    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
    procedure TForm1.GestTreeViewCheckBoxes(Node : TTreeNode);
    const
      cUnChecked = 1;
      cChecked = 2;
    begin
      if Assigned(Node) then
        begin
          if Node.StateIndex = cUnChecked then
            begin
              Node.StateIndex := cChecked;
              if Assigned(Node.parent) and (Node.Parent.StateIndex = cUnChecked) then GestTreeViewCheckBoxes(Node.Parent);
            end
          else
            Node.StateIndex := cUnChecked;
        end;
    end;
    N'oublie pas d'initialiser StateIndex à 1 lors de la création d'un nouveau noeud ...
    Maintenant, il y a peut-être mieux comme méthode ....
    Bon courage !
    Eb.

  5. #5
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Il te manquerait pas un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TreeView1.Selected := TreeView1.GetNodeAt(MousePos.X,MousePos.Y);
    ?

  6. #6
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    Outre la remarque faite par ebastien (j'avais également déjà constaté ce comportement), j'utiliserais plutot l'évènement OnMouseDown plutôt que OnClick.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      with TTreeView(Sender) do
      begin
        if htOnStateIcon in GetHitTestInfoAt(X, Y) then
          GestTreeViewCheckBoxes(GetNodeAt(X,Y));
      end;
    end;
    [edit] qi130 m'a précédé, et suis d'accord avec lui: le pb est très certainement le selected [/edit]
    @+

  7. #7
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Ok,

    Merci beaucoup à vous tous, ça fonctionne très bien.

    (un léger détail pour les débutants comme moi, il faut s'assurer que le noeud "cliqué" ai un parent pour faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Node.Parent.StateIndex = cUnChecked then Node.Parent.StateIndex := cChecked;
    , sinon gare aux accès violation...

    A+.

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

Discussions similaires

  1. TreeView et cases à cocher
    Par supertoms dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/04/2008, 22h57
  2. Treeview et case à cocher
    Par BENSALAMA dans le forum Delphi
    Réponses: 2
    Dernier message: 09/07/2007, 15h47
  3. TreeView avec case à cocher
    Par da_latifa dans le forum Delphi
    Réponses: 9
    Dernier message: 07/10/2006, 01h01
  4. Treeview avec case à cocher
    Par valoji dans le forum Composants VCL
    Réponses: 4
    Dernier message: 28/01/2006, 21h35

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