Treeview : fastexpand/fastclear/fastclean

Soyez le premier à donner votre avis sur cette source.

Vue 9 483 fois - Téléchargée 621 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
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 juin 2005 à 19:32
Une petite astuce qui est utile, mais pas très esthétique cependant de masquer le contrôle.

Je te conseillerai plutôt de locker le raffraichissement du contrôle lors de l'expansion ou la suppression, puis de l'unlocker après en utilisant la fonction de l'API Windows LockWindowUpdate.

Je n'ai pas essayé, mais ca devrait être autant optimisé, et ca éviterai de voir le contrôle clignoter à chaque expansion !

DarK Sidious
cs_liquide Messages postés 1016 Date d'inscription samedi 22 mars 2003 Statut Membre Dernière intervention 24 juin 2008
26 juin 2005 à 19:43
J'ai rien contre, mais je trouve bizarre de chercher a le rendre lent, et encore plus lent que lent a voir le code. En général, on part d'une base de programmation pour augmenter la vitesse et non l'inverse, non ?

j'entend par la que tu forces ton treeview a ralentir, en general on a la base d'un code et on l'améliore. J'ai l'impression que tu as fait l'inverse pour nous montrer de l'efficacité de ton "fast" avec la méthode "ensurevisible", qui elle, et tout le monde le sait, force l'affichage du noeud a l'ecran. Cette méthode est employable quand l'oeil de l'utilisateur voit ce qui défile et lorsqu'il doit analyser une évolution des treeviews. En dehors de ca, personne ne programmera un ensurevisible sur 2000 noeud en meme temps par exemple( ou t'es l'homme qui valait 3 milliards :))

Par ailleur pour le fastexpand, n'est il pas mieux de faire un "expand" au lieu de faire un "ensurevisible" en appelant la méthode "slow", en somme tu ralentis encore ton "fastexpand". De meme, si tu rends ton controle invisible dans la méthode fastclear, est ce que le delai ne va pas diminuer en meme temps ?

Je ne dis pas que les testes ne valent rien, mais forcer un "expand" par la méthode "ensurevisible", n'est pas la solution idéale, puisque chacune de ses propriété ont leur particularité et sont dédiés a une utilisation bien différente.
Egyde Messages postés 158 Date d'inscription lundi 17 mai 2004 Statut Membre Dernière intervention 16 juillet 2007
26 juin 2005 à 20:32
Pour répondre à liquide, remplacer EnsureVisible par Expanded = true n'améliore pas les choses chez moi. Au contraire, le contrôle "clignote" avec expand, ce qui ralentit encore plus l'opération. Pour ce qui est de FastClear(), j'ai déjà essayé en rendant le contrôle insible avant d'appliquer la méthode .clear : c'est aussi lent que SlowClear()

Je vais aller piocher du côté de LockWindowUpdate, même si masquer le contrôle n'a rien d'inesthétique je pense puisque le contrôle n'a pas le temps de s'effacer.
thomthom63 Messages postés 2 Date d'inscription lundi 9 mai 2005 Statut Membre Dernière intervention 3 avril 2007
14 févr. 2008 à 11:04
Bonne source, le fastexpand est efficace.
LunaPurple Messages postés 19 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 20 octobre 2010
29 sept. 2008 à 16:47
Arf!!
Encore oublié la note.

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.