Soyez le premier à donner votre avis sur cette source.
Vue 9 483 fois - Téléchargée 621 fois
'************************************************************************************** '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
26 juin 2005 à 19:32
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
26 juin 2005 à 19:43
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.
26 juin 2005 à 20:32
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.
14 févr. 2008 à 11:04
29 sept. 2008 à 16:47
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.