Treeview : fastexpand/fastclear/fastclean

Soyez le premier à donner votre avis sur cette source.

Vue 9 261 fois - Téléchargée 593 fois

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

Ajouter un commentaire Commentaires
Messages postés
19
Date d'inscription
dimanche 15 avril 2007
Statut
Membre
Dernière intervention
20 octobre 2010

Arf!!
Encore oublié la note.
Messages postés
19
Date d'inscription
dimanche 15 avril 2007
Statut
Membre
Dernière intervention
20 octobre 2010

Merci, vos astuces m'ont été très utiles !
Messages postés
2
Date d'inscription
lundi 9 mai 2005
Statut
Membre
Dernière intervention
3 avril 2007

Bonne source, le fastexpand est efficace.
Messages postés
158
Date d'inscription
lundi 17 mai 2004
Statut
Membre
Dernière intervention
16 juillet 2007

Contrairement à FastClear qui énumère chaque noeud du treeview, la fonction FastClean applique Expanded = False aux seuls noeuds de la racine. Cette astuce permet de gagner quelques dizaines de ms (c pas énorme mais bon, c toujours ça :-).
Messages postés
158
Date d'inscription
lundi 17 mai 2004
Statut
Membre
Dernière intervention
16 juillet 2007

LockWindowUpdate ne fonctionnant pas (et étant déconseillé par Krosoft...), j'ai utilisé l'API SendMessage : FastClear est passé en dessous des 500ms. Merci beaucoup DARKSIDIOUS !

Si vous avez d'autres idées (ou des explications, notamment pour FastClear par exemple), n'hésitez pas.
Afficher les 8 commentaires

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.