|
Mit Hilfe von rekursiven Prozeduren und Funktionen können Sie
alle Knoten eines TreeView-Steuerelements bearbeiten (siehe: "Knoten
drunter und drüber"). Auf diese Weise können Sie
auch die Knoten durchsuchen, und so beispielsweise alle Knoten
finden, deren Text- oder Key-Eigenschaft einem bestimmten (Text-)Muster
entspricht.
Sie übergeben der im folgenden vorgestellten Funktion im ersten
Parameter das zu suchende Textmuster (entsprechend den
Möglichkeiten des Like-Operators).
Im nächsten, optionalen Parameter StartNode können Sie einen
Knoten angeben, ab dem der Baum abwärts durchsucht werden soll.
Lassen Sie diesen Parameter weg, sollen alle Knoten im
TreeView-Steuerelement durchsucht werden. Dazu müssen Sie dann
dieses im nächsten Parameter übergeben. Im weiteren optionalen
Parameter geben Sie an, ob nur in den Text-Eigenschaften
(Voreinstellung), nur in den Key-Eigenschaften oder ob in beiden
Eigenschaften der Knoten gesucht werden soll. Im letzten optionalen
Parameter geben sie schließlich die Vergleichsmethode an
(Voreinstellung ist tfCompareText).
Damit die verschiedenen Kombinationen der zu durchsuchenden
Eigenschaften und der Vergleichsmethoden eine möglichst optimale
Performance erreichen, wird die eigentlich Suche in spezialisierten
privaten Hilfsprozeduren durchgeführt. Die Funktion gibt eine
Collection mit allen gefundenen Knoten zurück.
Da der Like-Operator
von der Option
Compare-Einstellung eines Moduls abhängig ist, werden in diesem
Modul Ersatzfunktionen verwendet, die der gewählten
Vergleichsmethode entsprechende Like-Operationen in zwei separaten
Modulen mit unterschiedlicher Option Compare-Einstellung aufrufen
(siehe: "Like
Binary oder Text").
Public Enum TreeViewCompareMethodConstants
tfCompareBinary
tfCompareText
End Enum
Public Enum TreeViewFindConstants
tfText = 1
tfKey = 2
tfBoth = 3
End Enum
Public Enum TreeViewFindErrorConstants
tfErrMissingParams = 35001
tfErrNoNodes = 35002
tfErrInvalidFindValue = 35003
tfErrInvalidCompareMethod = 35004
End Enum
Public Function TreeViewFind(FindText As String, _
Optional StartNode As Node, Optional TreeView As TreeView, _
Optional ByVal Find As TreeViewFindConstants = tfText, _
Optional ByVal CompareMethod As _
TreeViewCompareMethodConstants = tfCompareText) _
As Collection
Dim nFound As Collection
Dim nStartNode As Node
Set nFound = New Collection
If StartNode Is Nothing Then
If TreeView Is Nothing Then
Err.Raise tfErrMissingParams, "TreeViewFind"
Else
If TreeView.Nodes.Count Then
Set nStartNode = TreeView.Nodes(1).FirstSibling
Select Case CompareMethod
Case tfCompareBinary
Select Case Find
Case tfText
Do
zTreeViewFindTextCompareBinary nStartNode, _
FindText, nFound
Set nStartNode = nStartNode.Next
Loop Until nStartNode Is Nothing
Case tfKey
Do
zTreeViewFindKeyCompareBinary nStartNode, _
FindText, nFound
Set nStartNode = nStartNode.Next
Loop Until nStartNode Is Nothing
Case tfBoth
Do
zTreeViewFindBothCompareBinary nStartNode, _
FindText, nFound
Set nStartNode = nStartNode.Next
Loop Until nStartNode Is Nothing
Case Else
Err.Raise tfErrInvalidFindValue, "TreeViewFind"
End Select
Case tfCompareText
Select Case Find
Case tfText
Do
zTreeViewFindTextCompareText nStartNode, _
FindText, nFound
Set nStartNode = nStartNode.Next
Loop Until nStartNode Is Nothing
Case tfKey
Do
zTreeViewFindKeyCompareText nStartNode, _
FindText, nFound
Set nStartNode = nStartNode.Next
Loop Until nStartNode Is Nothing
Case tfBoth
Do
zTreeViewFindBothCompareText nStartNode, _
FindText, nFound
Set nStartNode = nStartNode.Next
Loop Until nStartNode Is Nothing
Case Else
Err.Raise tfErrInvalidFindValue, "TreeViewFind"
End Select
Case Else
Err.Raise tfErrInvalidCompareMethod, "TreeViewFind"
End Select
Else
Err.Raise tfErrNoNodes, "TreeViewFind"
End If
End If
Else
Select Case CompareMethod
Case tfCompareBinary
Select Case Find
Case tfText
zTreeViewFindTextCompareBinary StartNode, FindText, _
nFound
Case tfKey
zTreeViewFindKeyCompareBinary StartNode, FindText, _
nFound
Case tfBoth
zTreeViewFindBothCompareBinary StartNode, FindText, _
nFound
Case Else
Err.Raise tfErrInvalidFindValue, "TreeViewFind"
End Select
Case tfCompareText
Select Case Find
Case tfText
zTreeViewFindTextCompareText StartNode, FindText, nFound
Case tfKey
zTreeViewFindKeyCompareText StartNode, FindText, nFound
Case tfBoth
zTreeViewFindBothCompareText StartNode, FindText, nFound
Case Else
Err.Raise tfErrInvalidFindValue, "TreeViewFind"
End Select
Case Else
Err.Raise tfErrInvalidCompareMethod, "TreeViewFind"
End Select
End If
Set TreeViewFind = nFound
End Function
Hier nun stellvertretend eine der spezialisierten
Such-Prozeduren. Die Funktionsweise der übrigen Prozeduren ist
gleich. Sie finden sie im Modul, das Sie zu diesem Artikel
herunterladen können.
Private Sub zTreeViewFindTextCompareBinary(Node As Node, _
FindText As String, Found As Collection)
Dim nChildNode As Node
With Node
If LikeCompBinary(.Text, FindText) Then
Found.Add Node
End If
If .Children Then
Set nChildNode = .Child
Do
zTreeViewFindTextCompareBinary nChildNode, FindText, _
Found
Set nChildNode = nChildNode.Next
Loop Until nChildNode Is Nothing
End If
End With
End Sub
Beim TreeView-Steuerelement der Version 6 können
Sie der Tag-Eigenschaft eines Knotens auch Objekte zuweisen. Falls
Sie dieses praktische Feature nutzen, um Knoten mit Objekten zu
verbinden, können Sie die folgende Funktion dazu verwenden, den
oder die Knoten ausfindig zu machen, dessen bzw. deren
Tag-Eigenschaft Sie ein gegebenes Objekt zugewiesen haben. Im ersten
Parameter übergeben Sie das gesuchte Objekt. Im Parameter StartNode
geben Sie wieder den Startknoten an, oder Sie übergeben im
darauffolgenden Parameter das TreeView-Steuerelement (wie oben bei
der Funktion TreeViewFind beschrieben).
Falls Sie sicher sind, ein Objekt nur einem einzigen Knoten
zugeordnet zu haben, können Sie den letzten Parameter
OnlyFirstOccurance weglassen. Sein Voreinstellung True sorgt dafür,
dass nur der erste Knoten ermittelt wird, dessen Tag-Eigenschaft das
gesuchte Objekt zugewiesen ist. Als Rückgabewert der Funktion
erhalten Sie in diesem Fall den ermittelten Knoten.
Wollen Sie alle Knoten ermitteln, deren Tag-Eigenschaft das
gesuchte Objekt zugewiesen sein könnte, setzen Sie den Parameter
OnlyFirstOccurance auf False. Die Funktion gibt dann eine Collection
zurück, die den oder die gefundenen Knoten enthält.
Public Function TreeViewFindObjectInTag(FindObject As Object, _
Optional StartNode As Node, Optional TreeView As TreeView, _
Optional ByVal OnlyFirstOccurance As Boolean = True) As Object
Dim nFound As Object
Dim nStartNode As Node
If Not OnlyFirstOccurance Then
Set nFound = New Collection
End If
If StartNode Is Nothing Then
If TreeView Is Nothing Then
Err.Raise tfErrMissingParams, "TreeViewFindObjectInTag"
Else
If TreeView.Nodes.Count Then
Set nStartNode = TreeView.Nodes(1).FirstSibling
Do
zTreeViewFindObjectInTag nStartNode, FindObject, _
nFound, OnlyFirstOccurance
If OnlyFirstOccurance And Not (nFound Is Nothing) Then
Exit Do
End If
Set nStartNode = nStartNode.Next
Loop Until nStartNode Is Nothing
Else
Err.Raise tfErrNoNodes, "TreeViewFindObjectInTag"
End If
End If
Else
zTreeViewFindObjectInTag StartNode, FindObject, nFound, _
OnlyFirstOccurance
End If
Set TreeViewFindObjectInTag = nFound
End Function
Private Sub zTreeViewFindObjectInTag(Node As Node, _
FindObject As Object, Found As Object, _
ByVal OnlyFirstOccurance As Boolean)
Dim nChildNode As Node
With Node
If IsObject(.Tag) Then
If .Tag Is FindObject Then
If OnlyFirstOccurance Then
Set Found = Node
Exit Sub
End If
Else
Found.Add Node
End If
End If
If .Children Then
Set nChildNode = .Child
Do
zTreeViewFindObjectInTag nChildNode, FindObject, _
Found, OnlyFirstOccurance
Set nChildNode = nChildNode.Next
Loop Until nChildNode Is Nothing
End If
End With
End Sub
|