Treeview : fastexpand/fastclear/fastclean

Description

Dans la série des codes dédiés au treeview, je propose ici 3 fonctions que j'ai appelé FastExpand, FastClear et FastClean. La 1ère permet de rendre visible tous les noeuds du treeview très rapidement tandis que les 2 dernières optimise l'effacement.

Le .zip que je fournis génère un arbre comprenant plus de 19500 noeuds.
A titre comparatif, sur mon AMD K6 1GhZ en mode compilé :

SlowExpand > 30 s
SlowClear : environ 1mn

FastExpand < 500 ms
FastClear < 150 ms
FastClean < 125 ms

Source / Exemple :


'**************************************************************************************
'Programmeur :             Egyde (sendoval_fr@yahoo.fr)
'Date de création :        25/06/05
'Dernière mise à jour :    22/02/06
'**************************************************************************************
Option Explicit

Private Declare Function SendMessage Lib "user32" _
 Alias "SendMessageA" (ByVal hwnd As Long, _
                       ByVal wMsg As Long, _
                       ByVal wParam As Long, _
                       lParam As Any) As Long

Private Const WM_SETREDRAW = &HB

Public Sub SlowExpand(ByRef tvw As TreeView)
    'on prend chaque noeud de l'arbre et on le rend visible
    'grâce à la méthode Expanded
    Dim tNode As Node
    For Each tNode In tvw.Nodes
        tNode.Expanded = True
    Next
End Sub

Public Sub SlowClear(ByRef tvw As TreeView)
    'on applique la méthode Clear "brutalement"
    tvw.Nodes.Clear
End Sub

Public Sub FastExpand(ByRef tvw As TreeView)
    'on procède comme pr SlowExpand à la différence près
    'qu'on interdit le rafraichissement de l'arbre
    'pendant l'opération
    SendMessage tvw.hwnd, WM_SETREDRAW, False, 0
    'malgré l'instruction précédente, on constate un "clignotement"
    'du contrôle. C'est dûe à la scrollbar, que je désactive ici
    'pour supprimer cet effet (le résultat est un code encore plus rapide!)
    tvw.Scroll = False ' Added : 22/02/06
    Call SlowExpand(tvw)
    tvw.Scroll = True  ' Added : 22/02/06
    SendMessage tvw.hwnd, WM_SETREDRAW, True, 0
End Sub

Public Sub FastClear(ByRef tvw As TreeView)
    'avant d'appliquer la méthode clear,
    'on "collapse" tous les noeuds de la racine
    Dim tNode As Node
    If tvw.Nodes.Count > 0 Then
        For Each tNode In tvw.Nodes
            If tNode.Parent Is Nothing Then
                '<- tNode est un noeud à la racine
                'ts les fils de tNode deviennent invisibles
                tNode.Expanded = False
            End If
        Next
        'on efface l'arbre
        tvw.Nodes.Clear
    End If
End Sub

Public Sub FastClean(ByRef tvw As TreeView)
    'plutôt que d'énumérer chaque noeud comme ds FastClear,
    'on exploite le fait que si un père est invisible,
    'alors tous ses fils le sont également
    While tvw.Nodes.Count > 0
        If tvw.Nodes(1).Expanded = True Then
            tvw.Nodes(1).Expanded = False
        End If
        tvw.Nodes.Remove 1
    Wend
End Sub

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.