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 :

tTreeView et CheckBox : ItemSelected


Sujet :

Composants VCL Delphi

  1. #1
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut tTreeView et CheckBox : ItemSelected
    Bonjour à tous,
    Dans un tTreeView (VCL) sur lequel j'ai ajouté des CheckBox, je cherche à répercuter le changement d'un noeud vers ses descendants.
    Mon code fonctionne presque sauf que le nœud sélectionné correspond toujours à celui en surbrillance mais pas à celui qui vient d'être coché ou décoché.
    Y a-t-il une solution pour récupérer le nœud modifié ? Utilisation du Handle ?
    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
     
     
    function IsChecked(Node: tTreeNode): Boolean;
    var
      tvItem: tTvItem;
    begin
      tvItem.mask := tvIf_State;
      tvItem.hItem := Node.ItemId;
      TreeView_GetItem(Node.TreeView.Handle, tvItem);
      result := tvItem.state and tvIs_Checked > 0;
    end;
     
    procedure CheckTvNode(Node: tTreeNode; bState: Boolean);
    var
      tvItem: tTvItem;
    begin
      tvItem.mask := tvIf_State;
      tvItem.StateMask := tvIs_StateImageMask;
      tvItem.hItem := Node.ItemId;
      if bState then
        tvItem.state := tvIs_Checked
      else
        tvItem.state := tvIs_unChecked;
      TreeView_SetItem(Node.TreeView.Handle, tvItem);
    end;
     
    procedure TfrmMain.tvDirectoryClick(Sender: TObject);
    var
      pDirectoryTmp: pDirectory;
      NodeTmp: tTreeNode;
      bChecked: Boolean;
     
      { ---------------------------------------------- }
      procedure UpdateChild(NodeAct: tTreeNode);
      begin
        NodeAct := NodeAct.getFirstChild;
        if NodeAct <> nil then
          repeat
            CheckTvNode(NodeAct, bChecked);
            UpdateChild(NodeAct);
            NodeAct := NodeAct.GetNextSibling;
          until NodeAct = nil;
      end;
     
    { ---------------------------------------------- }
    begin
      if tvDirectory.Selected.Data = nil then
        exit;
     
      NodeTmp := tvDirectory.Selected;
      pDirectoryTmp := NodeTmp.Data;
      bChecked := IsChecked(tvDirectory.Selected);
      pDirectoryTmp.edSelected := bChecked;
      UpdateChild(NodeTmp); // Child ?
      tvDirectory.Refresh;
    end;
    Merci par avance...

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 123
    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 123
    Par défaut
    n'utilise pas Selected mais plutôt un Tree.GetNodeAt, Mouse.CursorPos et ScreenToClient
    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 expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Merci ShailLeTroll,
    La solution n'était pourtant pas si loin...

    Pour ceux qui chercheraient à créer une fonction semblable, le code corrigé qui fonctionne :
    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
     
    function IsChecked(Node: TTreeNode): Boolean;
    var
      tvItem: tTvItem;
    begin
      with tvItem do
      begin
        mask := tvIf_State;
        hItem := Node.ItemId;
      end;
      TreeView_GetItem(Node.TreeView.Handle, tvItem);
      result := tvItem.state and tvIs_Checked > 0;
    end;
     
    procedure CheckTvNode(Node: TTreeNode; bState: Boolean);
    var
      tvItem: tTvItem;
    begin
      with tvItem do
      begin
        mask := tvIf_State;
        StateMask := tvIs_StateImageMask;
        hItem := Node.ItemId;
        if bState then
          state := tvIs_Checked
        else
          state := tvIs_unChecked;
      end;
      TreeView_SetItem(Node.TreeView.Handle, tvItem);
    end;
     
    procedure TfrmMain.tvDirectoryClick(Sender: TObject);
    var
      pDirectoryTmp: pDirectory;
      NodeTmp: TTreeNode;
      bChecked: Boolean;
      pt: TPoint;
     
      { ---------------------------------------------- }
      procedure UpdateChild(NodeAct: TTreeNode);
      begin
        NodeAct := NodeAct.getFirstChild;
        if NodeAct <> nil then
          repeat
            CheckTvNode(NodeAct, bChecked);
            if NodeAct.Data <> nil then
            begin
              pDirectoryTmp := NodeAct.Data;
              pDirectoryTmp.edSelected := bChecked;
            end;
     
            UpdateChild(NodeAct); // Recursif : Child
            NodeAct := NodeAct.GetNextSibling; // Next node
          until NodeAct = nil;
      end;
     
    { ---------------------------------------------- }
    begin
      pt := tvDirectory.ScreenToClient(Mouse.CursorPos);
      NodeTmp := tvDirectory.GetNodeAt(pt.X, pt.Y);
     
      if NodeTmp = nil then
        exit;
      pDirectoryTmp := NodeTmp.Data;
     
      bChecked := IsChecked(NodeTmp);
      pDirectoryTmp.edSelected := bChecked;
     
      UpdateChild(NodeTmp); // Child ?
      tvDirectory.Refresh;
    end;
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     tvIs_Checked = $2000;
      tvIs_Unchecked = $1000;
    et dans le Form.create :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      // For CheckBox in tTreeView
      SetWindowLong(tvDirectory.Handle, gwl_Style, GetWindowLong(tvDirectory.Handle,
        gwl_Style) or tvs_CheckBoxes);
    Résolu

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

Discussions similaires

  1. TTreeView + 4 CheckBox sur chaque Node
    Par smartland dans le forum Delphi
    Réponses: 1
    Dernier message: 17/06/2006, 03h00
  2. TTreeView -> Comment ouvrir une unité ?
    Par DaLove dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/12/2002, 12h30
  3. Couleur des noeuds ds 1 TTreeView
    Par vincent DD dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/09/2002, 14h54
  4. Couleur d'un CheckBox
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/07/2002, 15h48
  5. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 16h00

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