|
Das Auslesen des Inhalts bzw. der Struktur eines TreeView-Steuerelements aus den Microsoft Common Controls in einen String (etwa zur Speicherung in einer Datei oder zum Kopieren in eine andere Anwendung) ist an sich recht einfach. Sie durchlaufen der Reihe nach alle Knoten und jeweils deren Kind-Knoten, und wiederum jeweils deren Kind-Knoten usw., bis Sie die Struktur in alle Verästelungen hinein abgegrast haben. Entsprechend der Tiefe eines Knotens in der Struktur fügen Sie Füllzeichen ein, etwa Tabulatorzeichen, um die Einrückung darzustellen oder das Einfügen in eine Tabelle zu ermöglichen.
Da Sie ja meistens nicht wissen können, wie umfangreich und wie tief die Knoten-Struktur angelegt ist, eignet sich am besten ein so genannter "rekursiver" Aufruf einer Prozedur. In dieser wird zunächst ein Knoten bearbeitet, und anschließend wird die gleiche Funktion für alle Kind-Knoten erneut aufgerufen. Enthält ein Knoten keine Kind-Knoten, wird der aktuelle Aufruf der Prozedur verlassen, ohne weiter in die Tiefe zu gehen.
Da eine TreeView-Struktur auf der obersten Ebene mehrere gleichberechtigte Knoten enthalten kann, also nicht unbedingt nur einen einzigen Stammknoten haben muss, werden im ersten Schritt zunächst vom ersten Knoten der obersten Ebene (dem Knoten mit dem Index 1 in der Nodes-Collection) ausgehend nacheinander dieser und dann dessen "Zwillinge" (Siblings) bearbeitet, bevor die Aufrufe der in die Tiefe der Struktur führenden rekursiven Prozedur erfolgt.
Der Hilfsfunktion TreeViewContents übergeben Sie im ersten Parameter das betreffende TreeView-Steuerelement. Dann folgt optional der Parameter IndentString, der das bzw. die Füllzeichen zur Darstellung der Tiefe enthält (Voreinstellung: vbTab). Im optionalen Parameter NodeSeparator geben Sie an, durch welche(s) Zeichen die Knoten in der resultierenden Auflistung voneinander getrennt werden sollen (Voreinstellung: Zeilentrennung = vbCrLf).
Falls Sie nicht die komplette Knoten-Struktur erfassen wollen, sondern erst die Struktur ab einem bestimmten Knoten, geben Sie diesen optional im Parameter StartNode an. In diesem Fall können Sie im optionalen Parameter IncludeStartNodeIndentation festlegen, ob auch die Tiefe dieses Startknotens durch Füllzeichen dargestellt werden soll. Im letzten optionalen Parameter ChildrenIfExpanded können Sie schließlich noch bestimmen, ob die Kind-Knoten samt der darunter liegenden weiteren Verzweigungen der Struktur nur dann erfasst werden sollen, wenn ein Knoten geöffnet ist (Expanded = True).
Public Function TreeViewContents(TreeView As TreeView, _
Optional IndentString As String = vbTab, _
Optional NodeSeparator As String = vbCrLf, _
Optional StartNode As Node, _
Optional ByVal IncludeStartNodeIndentation As Boolean, _
Optional ByVal ChildrenIfExpanded As Boolean) As String
Dim nNode As Node
Dim nContents As String
Dim nParts() As String
Dim nIndentation As String
Dim i As Integer
With TreeView.Nodes
If StartNode Is Nothing Then
Set nNode = .Item(1)
Do While Not (nNode Is Nothing)
nContents = nContents & nNode.Text & NodeSeparator
zNodes nNode, nContents, "", IndentString, NodeSeparator, _
ChildrenIfExpanded
Set nNode = nNode.Next
Loop
Else
If IncludeStartNodeIndentation Then
nParts = Split(StartNode.FullPath, TreeView.PathSeparator)
If Len(IndentString) = 1 Then
nIndentation = String(UBound(nParts), IndentString)
Else
For i = 0 To UBound(nParts) - 1
nIndentation = nIndentation & IndentString
Next 'i
End If
End If
With StartNode
nContents = nIndentation & .Text & NodeSeparator
If ChildrenIfExpanded Then
If .Expanded Then
zNodes StartNode, nContents, nIndentation, _
IndentString, NodeSeparator, ChildrenIfExpanded
End If
Else
zNodes StartNode, nContents, nIndentation, _
IndentString, NodeSeparator, ChildrenIfExpanded
End If
End With
End If
End With
TreeViewContents = nContents
End Function
Private Sub zNodes(Node As Node, Contents As String, _
ByVal Indentation As String, IndentString As String, _
NodeSeparator As String, _
ByVal ChildrenIfExpanded As Boolean)
Dim nLine As String
Dim nChild As Node
With Node
Set nChild = .Child
Indentation = Indentation & IndentString
If ChildrenIfExpanded Then
If Not .Expanded Then
Exit Sub
End If
End If
End With
Do While Not (nChild Is Nothing)
Contents = Contents & Indentation & nChild.Text & NodeSeparator
zNodes nChild, Contents, Indentation, IndentString, _
NodeSeparator, ChildrenIfExpanded
Set nChild = nChild.Next
Loop
End Sub
|