[Ex] Fonction CheckAll-UncheckAll

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Redemption
Niveau 1
Niveau 1
Messages : 1
Enregistré le : mer. 19 sept. 2012 15:29
Status : Hors ligne

[Ex] Fonction CheckAll-UncheckAll

#1

Message par Redemption »

Bonjour à tous,

voila un an que j'ai cherché sur internet une méthode de checkall-uncheckall sur une treeviewlist, et j'ai jamais trouvé.
Au final j'ai décidé de développer il y a peu la fonction que bon nombre cherche sans trouver et le voici.

Le code ci-dessous contient un exemple complet.

Pour ll'integrer à votre treeview, il suffit de copier Dim $checkverif[1][2], les 2 fonctions, la variable $declared. Puis d'appeler les fonctions CheckAll_UncheckALL_Declaration avant le "while 1" et CheckAll_UncheckALL_Execution à l'intérieur du "While 1"

CheckAll_UncheckALL_Declaration(nom_de_la_treeview)
CheckAll_UncheckALL_Execution(nom_de_la_treeview, tableau_de_déclaration)

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <WindowsConstants.au3>


Dim $checkverif[1][2]
Func CheckAll_UncheckALL_Declaration($tree)

    ;Création des variables de vérification d'état coché
    ;---------------------------------------------------

    ;~  Ce code est une partie du checkall et uncheckall.
    ;~  Plus bas dans le code, quelques lignes permettent de cocher tous les efants d'un noeud si celui-ci est lui meme coché.
    ;~  Malheureusement, lorsqu'un neoud est coché, tous les enfants sont cochés et deviennent donc impossible à décocher par la suite parce que le noeud parent est coché.
    ;~  Ce est donc là pour mettre en place une vérification de différence d'état.
    ;~  On établi des variables de vérification avec pour valeur "false".
    ;~  Si le noeud et la variable de vérification sont identiques, le code ne fera rien, si ils sont différents, le code agira.
    ;~  Chaque noeuds parents de dernier niveau se verront attribué une variable véréfication

    ;cette premiere partie va déterminer si le premier élément visible est un parent et creer la premiere ligne du tableau
    $firstvisible = _GUICtrlTreeView_GetFirstVisible($tree) ;On récupère l'identifiant du premier élément visible
    $countverif = 0
    if _GUICtrlTreeView_GetChildren($tree, $firstvisible) Then ;si le premier élément visible a des enfants
        $checkverif[$countverif][0] = $firstvisible ;on inscrit l'identification de l'élément dans le tableau colonne 1
        $checkverif[$countverif][1] = False ;on inscrit l'état dela vérification dans le tableau colonne 2
        $countverif = $countverif + 2 ;on ajoute 2 à la variable pour redimensionner le tableau correctement
        ReDim $checkverif[$countverif][2] ;on redimensionne le tableau
        $countverif = $countverif - 1 ;On soustrait 1 à $countverif pour replacer le curseur de lecture au bon endroit
    EndIf
    ;cette partie s'occupe de tous les autres parents
    $getnext = _GUICtrlTreeView_GetNext($tree, $firstvisible) ;On récupère l'identifiant du second élément dans l'arborescence
    While $getnext <> 0
        if _GUICtrlTreeView_GetChildren($tree, $getnext) Then
            $checkverif[$countverif][0] = $getnext
            $checkverif[$countverif][1] = False
            $countverif = $countverif + 2
            ReDim $checkverif[$countverif][2]
            $countverif = $countverif - 1
        EndIf
        $getnext = _GUICtrlTreeView_GetNext($tree, $getnext)
    WEnd
    _ArrayDelete($checkverif, $countverif) ;On supprime la derniere ligne qui est vide
    Return $checkverif
EndFunc

Func CheckAll_UncheckALL_Execution($tree, $checkverif)
    $countverif = UBound($checkverif)-1
;~  Cette boucle permet la fonction checkall et uncheck all pour tous les ordinateurs affectés à un sous-tag

    For $i = 0 to $countverif Step 1 ;on lance la boucle
        $state = _GUICtrlTreeView_GetChecked($tree, $checkverif[$i][0]) ;On récupère l'état du noeud, soit True, soit False. cet état sera déployé à la suite du code
        if $state <> $checkverif[$i][1] Then ;Si l'ID du noeud sélectionné est egal à la valeur inscrit dans la colonne 1 du tableau et si la valeur de la variable $state est différente de la valeur de la colonne 2
            $checkverif[$i][1] = _GUICtrlTreeView_GetChecked($tree, $checkverif[$i][0])
            $firstchild = _GUICtrlTreeView_GetFirstChild($tree, $checkverif[$i][0]) ;on récupère l'id du premier enfant du noeud
            _GUICtrlTreeView_Expand($tree, $checkverif[$i][0]) ;on déploie l'arborescence du noeud
            _GUICtrlTreeView_SetChecked($tree, $firstchild, $state) ;on coche ou décoche selon $state le premier enfant du noeud
            $child = _GUICtrlTreeView_GetNextSibling($tree, $firstchild) ;on récupère l'id de l'enfant suivant
            while _GUICtrlTreeView_GetNextSibling($tree, $child) <> 0 ;Tant que l'id de la cible suivante ne retourne pas 0
                _GUICtrlTreeView_SetChecked($tree, $child, $state) ;on coche ou décoche selon $state l'enfant suivant du noeud
                $child = _GUICtrlTreeView_GetNextSibling($tree, $child) ;on récupère l'id de l'enfant suivant
            WEnd
            _GUICtrlTreeView_SetChecked($tree, $child, $state) ;on coche ou décoche selon $state la derniere cible enfant du noeud
            $checkverif[$i][1] = $state ;On inscrit la changement de valeur dans le tableau colonne 2
        EndIf
    Next
    $declared = $checkverif ;On réécrit le résultat de $déclared pour conserver le nouvel $checkverif
    Return $declared
EndFunc



;~  Déclaration des variables
Local $GUI, $hImage, $iImage, $hItem, $fDragging = False, $aDrag, $hTreeView
Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)

;~  Création de la boite de dialogue
$GUI = GUICreate("TreeView Create Drage Image", 400, 300)
$hTreeView = GUICtrlGetHandle(GUICtrlCreateTreeView(2, 2, 396, 268, $iStyle, $WS_EX_CLIENTEDGE))

;~ Création d'une liste aléatoire
_GUICtrlTreeView_BeginUpdate($hTreeView)
For $x = 1 To Random(2, 10, 1)
    $hItem = _GUICtrlTreeView_Add($hTreeView, 0, StringFormat("[%02d] New Item", $x))
    For $y = 1 To Random(2, 10, 1)
        _GUICtrlTreeView_AddChild($hTreeView, $hItem, StringFormat("[%02d] New Child", $y))
    Next
Next
_GUICtrlTreeView_EndUpdate($hTreeView)

$declared = CheckAll_UncheckALL_Declaration($hTreeView) ;Appel de la fonction
GUISetState() ;Afficher l'arborescence

While 1
    CheckAll_UncheckALL_Execution($hTreeView, $declared) ;Appel de la fonction
    $msg = GUIGetMsg()
    if $msg = $GUI_EVENT_CLOSE Then
        ExitLoop
    EndIf
WEnd
 
Modifié en dernier par Redemption le jeu. 20 sept. 2012 13:47, modifié 1 fois.
Répondre