|
|
|
|
|
Wenn Sie in einem TreeView-Steuerelement den Pfad eines
Eltern-Knotens kennen, in den Sie einen weiteren Knoten einfügen
möchten, müssen Sie zunächst diesen Eltern-Knoten ausfindig
machen. Sie durchlaufen dazu die Nodes-Collection und prüfen bei
jedem Knoten, ob dessen FullPath-Eigenschaft mit dem gegebenen Pfad
übereinstimmt. Ist dies der Fall, fügen Sie den neuen Knoten dort
ein.
Die Hilfsfunktion AddNode erweitert die Add-Methode
der Nodes-Collection um die Möglichkeit, im Parameter Relative
einen Pfad anzugeben. Zur Erkennung, ob Relative eine Pfadangabe
darstellen soll, dienen die zusätzliche Konstanten tvwPath und
tvwFullPath. Geben Sie tvwFullPath an, stellt der letzte Bestandteil
des in Relative übergebenen Pfades bereits den Text-Namen des neuen
Knotens und der Text-Parameter wird ignoriert Die übrigen Parameter
gleichen der originalen Add-Methode. Dazu prüft die Funktion
mittels der Hilfsfunktion CheckPath, ob ein konformer Pfad
übergeben worden ist (die Pfadangabe darf nicht mit dem
Pfadtrennzeichen beginnen oder enden) und passt ihn gegebenenfalls
an.
Public Const tvwPath = 10
Public Const tvwFullPath = 11
Public Function AddNode(TreeView As TreeView, _
Optional Relative As Variant, Optional RelationShip As Variant, _
Optional Key As Variant, Optional Text As Variant, _
Optional Image As Variant, Optional SelectedImage As Variant) _
As Node
Dim nParentNode As Node
Dim nPath As String
Dim nPathL As String
Dim nPos As Integer
Dim nText As String
Select Case RelationShip
Case tvwPath, tvwFullPath
nPath = CheckPath(TreeView, CStr(Relative))
With TreeView
If tvwFullPath Then
nPos = InStrRev(nPath, .PathSeparator)
If nPos Then
nText = Mid$(nPath, nPos + 1)
nPath = Left$(nPath, nPos - 1)
Else
Set AddNode = .Nodes.Add(, , Key, nPath, Image, _
SelectedImage)
Exit Function
End If
Else
nText = Text
End If
nPathL = LCase$(nPath)
For Each nParentNode In .Nodes
If LCase$(nParentNode.FullPath) = nPathL Then
Set AddNode = .Nodes.Add(nParentNode.Key, tvwChild, Key, _
nText, Image, SelectedImage)
Exit Function
End If
Next
End With
Case Else
On Error Resume Next
Set AddNode = TreeView.Nodes.Add(Relative, RelationShip, Key, _
Text, Image, SelectedImage)
End Select
End Function
Public Function CheckPath(TreeView As TreeView, Path As String) _
As String
Dim nPath As String
Dim nPathSeparator As String
nPathSeparator = TreeView.PathSeparator
If Left$(Path, 1) = nPathSeparator Then
nPath = Mid$(Path, 2)
Else
nPath = Path
End If
If Right$(nPath, 1) = nPathSeparator Then
nPath = Left$(nPath, Len(nPath) - 1)
End If
CheckPath = nPath
End Function
Die Funktion InstrRev steht leider erst ab Visual Basic 6 zur
Verfügung. Für frühere VB-Versionen können Sie die in "Retourkutsche"
vorgestellte Ersatzfunktion verwenden.
Wenn Sie die Technik verwenden, den vollen Pfad eines jeden
Knotens als Schlüssel für denselbigen zu vergeben (wie in "Knotenpfade
knüpfen" beschrieben), brauchen Sie den
Eltern-Knoten nicht erst zu suchen, sondern können ihn direkt
anhand der Pfadangabe bestimmen. Darüber hinaus können Sie dann
sogar Pfade in beliebiger Tiefe angeben, die noch gar nicht
existieren, und dafür sorgen, dass der gesamte Pfad in einem Rutsch
angelegt wird.
Diese Aufgabe löst die Funktion AddNodeAutoKey. Auch hier
können Sie einen Knoten wie gewohnt einfügen oder im Parameter
Relative über die Konstanten tvwPath die Übergabe des Pfades eines
Eltern-Knotens festlegen bzw. über tvwFullPath einen Pfad, der den
Text-Namen des Knotens bereits enthält. Im letzten optionalen
Parameter AddFullPath legen Sie nun noch fest, ob gegebenenfalls der
Pfad komplett angelegt werden soll, falls er noch nicht existieren
sollte (voreingestellt ist True).
Public Function AddNodeAutoKey(TreeView As TreeView, _
Optional Relative As Variant, Optional RelationShip As Variant, _
Optional Text As Variant, Optional Image As Variant, _
Optional SelectedImage As Variant, _
Optional ByVal AddFullPath As Boolean = True) As Node
Dim nParentNode As Node
Dim nNewNode As Node
Dim nPath As String
Dim nPos As Integer
Dim nText As String
Select Case RelationShip
Case tvwPath, tvwFullPath
nPath = CheckPath(TreeView, CStr(Relative))
With TreeView
If RelationShip = tvwFullPath Then
nPos = InStrRev(nPath, .PathSeparator)
If nPos Then
nText = Mid$(nPath, nPos + 1)
nPath = Left$(nPath, nPos - 1)
Else
Set nNewNode = .Nodes.Add(, , nPath, nPath, Image, _
SelectedImage)
If Not (nNewNode Is Nothing) Then
With nNewNode
.Key = .FullPath
End With
Set AddNodeAutoKey = nNewNode
End If
Exit Function
End If
Else
nText = Text
End If
On Error Resume Next
Set nParentNode = .Nodes(nPath)
On Error GoTo 0
If nParentNode Is Nothing Then
If AddFullPath Then
nPos = InStrRev(nPath, .PathSeparator)
If nPos Then
Set nParentNode = AddNodeAutoKey(TreeView, nPath, _
tvwFullPath, Image, SelectedImage)
Else
Set nParentNode = .Nodes.Add(, , nPath, nPath, Image, _
SelectedImage)
End If
End If
End If
If Not (nParentNode Is Nothing) Then
Set nNewNode = .Nodes.Add(nParentNode.Key, tvwChild, , _
nText, Image, SelectedImage)
If Not (nNewNode Is Nothing) Then
With nNewNode
.Key = .FullPath
End With
Set AddNodeAutoKey = nNewNode
End If
End If
End With
Case Else
Set nNewNode = TreeView.Nodes.Add(Relative, RelationShip, , _
Text, Image, SelectedImage)
If Not (nNewNode Is Nothing) Then
With nNewNode
.Key = .FullPath
End With
Set AddNodeAutoKey = nNewNode
End If
End Select
End Function
|
|
|