Le chemin complet d'un noeud "x" peut être récupérer via "x.FullPath". Cette méthode énumère en interne chaque père de "x". Or, si "y" a le même père que "x", il est inutile de remonter jusqu'à la racine de l'arbre... Pour combler cette lacune, je propose ici une autre méthode (TVWGetFullPath) qui tire avantage des précédents appels.
Source / Exemple :
'**************************************************************************************
' .FullPath vs GetFullPath
'
'Programmeur : Egyde (sendoval_fr@yahoo.fr)
'Date de création : 22/02/06
'**************************************************************************************
Option Explicit
Private m_strParentPath As String
Private m_strParentKey As String
'pr l'estimation des performances
Public Declare Function GetTickCount Lib "kernel32" () As Long
'pr récupérer le chemin complet d'un noeud,
'on fait appel à la propriété .FullPath
'Note : pour changer le séparateur (ici "/"), voir .PathSeparator du treeview
Public Function TVWFullPath(ByRef tSourceNode As Node) As String
TVWFullPath = tSourceNode.FullPath
TVWFullPath = Mid$(TVWFullPath, 2, Len(TVWFullPath) - 1) & "/"
End Function
'pr récupérer le chemin complet d'un noeud,
'on check si le noeud visité n'est pas le fils du père précédemment visité.
'Si c'est le cas, on renvoi le chemin complet en tenant compte de l'information
'précédemment sauvegardée. Si c'est pas le cas, on fait appel à la propriété
'.FullPath
Public Function TVWGetFullPath(ByRef tSourceNode As Node) As String
If tSourceNode.Parent Is Nothing Then ' on est à la racine
m_strParentKey = "K0"
m_strParentPath = "/"
TVWGetFullPath = "/"
Else
If m_strParentKey <> tSourceNode.Parent.Key Then
'le noeud courant n'est pas au même niveau que le noeud précédent
'on met donc à jour le chemin du père
m_strParentKey = tSourceNode.Parent.Key
m_strParentPath = TVWFullPath(tSourceNode.Parent)
End If
'on concatène au chemin du père le texte du fils
TVWGetFullPath = m_strParentPath & tSourceNode.Text & "/"
End If
End Function
Conclusion :
Lorsque l'arbre doit être visité de façon récursive (comme c'est le cas pour un explorateur automatique par exemple), la stratégie proposée est plus efficace qu'un appel naif à .FullPath (moyenne obtenue pour 9331 noeuds - voir projet joint) :
TVWFullPath : 0.60615 tick (par noeud, en moyenne)
TVWGetFullPath : 0.56093 tick
Toutefois, dans le cas d'un parcours "aléatoire" (ex : un utilisateur qui clic sur un noeud quelconque), .FullPath est, comme on pourrait s'y attendre, plus efficace en moyenne :
TVWFullPath : 0.81224 tick (par noeud, en moyenne)
TVWGetFullPath : 0.84225 tick
Un bon compromis consiste donc à utiliser .FullPath pour récupérer le chemin de noeuds qui n'ont a priori aucun lien de parenté et TVWGetFullPath lorsque la récupération du chemin se fait de façon récursive.
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.