Rubrik: Controls · TreeView | VB-Versionen: VB6 | 23.09.02 |
TreeView-Inhalt speichern und einlesen Eine Universalroutine, mit der sich der Inhalt eines TreeView-Controls mit allem Drum und Dran speichern und laden lässt. | ||
Autor: Dieter Otter | Bewertung: | Views: 31.825 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie man den Inhalt einer ListBox oder einem ListView-Control speicherst bzw. wieder einliest haben wir Ihnen bereits vor längerer Zeit gezeigt.
Wie sieht es aber mit dem TreeView-Control aus?
Einfach nur die Einträge hintereinander in eine Textdatei speichern und wieder einlesen funktioniert hier nicht korrekt, da es sich meist nicht nur um Parentnodes (Eltern-Objekte) handelt, sondern um verschachelte Node-Strukturen.
Im nachfolgenden finden Sie ein Beispielcode, mit dem sich der Inhalt eines TreeViews mit allem Drum und Dran speichern und auch wieder restaurieren lässt. Hierbei werden nicht nur die Einträge und deren Verchachtelungen gespeichert, sondern auch alle Eigenschaften der einzelnen Node-Objekte, wie Image (Symbol), Bold (Fett), Checked (markiert) usw.
TreeView-Inhalt speichern
' TreeView-Inhalt speichern Public Sub tvw_Save(tvw As TreeView, ByVal sFile As String) Dim F As Integer Dim oNode As Node Dim NodeX As Node F = FreeFile Open sFile For Output As #F ' Alle Einträge speichern Set oNode = tvw.Nodes(1) Do tvw_SaveItems F, oNode Set oNode = oNode.Next Loop Until oNode Is Nothing Close #F End Sub
' TreeView-Einträge speichern ' ' ACHTUNG! Diese Prozedur wird rekursiv für jeden ' Zweig aufgerufen! ' Private Sub tvw_SaveItems(ByVal F As Integer, ByVal oNode As Node) Dim nIndent As Integer Dim sPath As String Dim sItem() As String Dim NodeX As Node With oNode sPath = .FullPath sItem = Split(sPath, "\") nIndent = UBound(sItem) ' Parent-Node Print #F, tvw_SaveSetData(nIndent, oNode) ' Jetzt alle direkten Child-Nodes If oNode.Children > 0 Then Set NodeX = oNode.Child Do With NodeX If NodeX.Children > 0 Then ' Prozedur rekursiv mit neuem Zweig aufrufen tvw_SaveItems F, NodeX Else ' Eintrag speichern Print #F, tvw_SaveSetData(nIndent + 1, NodeX) End If End With Set NodeX = NodeX.Next Loop Until NodeX Is Nothing End If End With End Sub
' Alle Infos eines Eintrags zusammenfassen Private Function tvw_SaveSetData(ByVal nIndent As Integer, _ oNode As Node) As String With oNode tvw_SaveSetData = String$(nIndent, ".") + vbTab + _ .Key + vbTab + .Text + vbTab + _ CStr(.Image) + vbTab + CStr(.SelectedImage) + vbTab + _ CStr(.ForeColor) + vbTab + CStr(.BackColor) + vbTab + _ CStr(.Bold) + vbTab + .Tag + vbTab + _ CStr(.Checked) + vbTab + CStr(.Expanded) + vbTab + _ CStr(.Sorted) End With End Function
TreeView-Inhalt aus Datei einlesen
' TreeView-Einträge aus Datei einlesen Public Sub tvw_Load(tvw As TreeView, ByVal sFile As String) Dim F As Integer Dim sLine As String Dim sData() As String Dim nIndent As Integer Dim sKey As String Dim sText As String Dim nImg As Integer Dim nImgSel As Integer Dim nForeColor As Long Dim nBackColor As Long Dim bBold As Boolean Dim sTag As String Dim bChecked As Boolean Dim bExpanded As Boolean Dim bSorted As Boolean Dim oNode As Node Dim NodeX As Node Dim nLastIndent As Integer ' Existiert die Datei? If Dir$(sFile, vbNormal) <> "" Then With tvw ' Treeview löschen .Nodes.Clear ' Darstellung abschalten .Visible = False DoEvents ' Datei zum Lesen öffnen F = FreeFile Open sFile For Input As #F ' Alle Einträge nacheinander einlesen nLastIndent = 0 While Not EOF(F) Line Input #F, sLine sData = Split(sLine, vbTab) ' Zeile in Einzel-Informationen zerlegen nIndent = Len(sData(0)) sKey = sData(1) sText = sData(2) nImg = Val(sData(3)) nImgSel = Val(sData(4)) nForeColor = Val(sData(5)) nBackColor = Val(sData(6)) bBold = CBool(sData(7)) sTag = sData(8) bChecked = CBool(sData(9)) bExpanded = CBool(sData(10)) bSorted = CBool(sData(11)) If nIndent = 0 Then ' Root Set oNode = .Nodes.Add(, , sKey, sText, nImg, nImgSel) tvw_LoadSetData oNode, nForeColor, nBackColor, _ bBold, bChecked, sTag, bExpanded, bSorted Else ' Parent ermitteln If nIndent < nLastIndent Then While nIndent < nLastIndent Set oNode = oNode.Parent nLastIndent = nLastIndent - 1 Wend ElseIf nIndent > nLastIndent And nIndent > 1 Then Set oNode = NodeX End If ' Eintrag hinzufügen Set NodeX = .Nodes.Add(oNode, tvwChild, _ sKey, sText, nImg, nImgSel) tvw_LoadSetData NodeX, nForeColor, nBackColor, _ bBold, bChecked, sTag, bExpanded, bSorted End If nLastIndent = nIndent Wend ' Darstellung wieder einschalten .Visible = True End With Close #F End If End Sub
' Setze alle gespeicherten Eigenschaften eines ' einzelnen TreeView-Eintrages Private Sub tvw_LoadSetData(oNode As Node, _ ByVal nForeColor As Long, ByVal nBackColor As Long, _ ByVal bBold As Boolean, ByVal bChecked As Boolean, _ ByVal sTag As String, ByVal bExpanded As Boolean, _ ByVal bSorted As Boolean) With oNode .ForeColor = nForeColor .BackColor = nBackColor .Bold = bBold .Checked = bChecked .Tag = sTag .Expanded = bExpanded .Sorted = bSorted End With End Sub
Aufruf der Funktionen
Um den Inhalt des TreeView-Inhaltes zu speichern, genügt folgender Aufruf:
tvw_Save TreeView1, App.Path & "\myTreeView.dat"
Um den gespeicherten Inhalt wieder einzulesen, folgender Aufruf:
tvw_Load TreeView1, App.Path & "\myTreeView.dat"