TreeView 2 Text
Permet de sauvegarder le contenu d'une TreeView dans
un fichier text et de le relire par la suite pour remplir
une (autre) TreeView
Cette nouvelle version fonctionne avec un format de fichier INI permetant d'utiliser
les API d'acces direct a ces fichiers
il est possible de sauvegarder les images ainsi que le style de chaque node
L'extention des ces fichiers est TVW, ceci permet d'associer un programme (contenu
dans le zip) pour ouvrir directement des images de TreeView
en double cliquant dessus depuis l'explorateur
Attention contraiment a ce qui ce passe sous WinNT l'API WritePrivateProfileString
ne semble pas acepter les tabulations, j'ai donc remplacé
le séparateur utilisé par un | (Alt Gr + 6), celui ci ne doit
donc pas se trouver dans un des champs text sauvegardés (node.text .tag
.key ...)
comme ce caractère est tres peu utilisé cela ne devrait pas trop
géner
Aucune autre limite la treeview obtenue est la replique exacte de celle sauvegardée
( Sources convertis en 6 couleurs avec mon programme VB to HTML)
'===========================================================================
'Active Visual Basic
'http://www.fredjust.com
'===========================================================================
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _
"GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias _
"WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpString As String, _
ByVal lpFileName As String) As Long
'===========================================================================
' SAVE A TREEVIEW TO A TVW TEXT FILE
'===========================================================================
Public Sub tvSaveToFile(TV As TreeView, ByVal FileName As String, _
Optional SaveNodeStyle As Boolean = False, _
Optional SaveNodeImage As Boolean = False)
Dim Neu As Node
Dim Tempo As String
Dim ImageIndex As Long
On Error Resume Next
'erase file if exist
Kill FileName
'write file info type
WritePrivateProfileString "FileInfo", "Type", "TVW FILE", FileName
WritePrivateProfileString "FileInfo", "Version", "1.0", FileName
'write TreeView Style
With TV
WritePrivateProfileString "TreeView", "Appearance", .Appearance, FileName
WritePrivateProfileString "TreeView", "BorderStyle", .BorderStyle, FileName
WritePrivateProfileString "TreeView", "Checkboxes", BoolToStr(.Checkboxes), FileName
WritePrivateProfileString "TreeView", "FullRowSelect", BoolToStr(.FullRowSelect), FileName
WritePrivateProfileString "TreeView", "HideSelection", BoolToStr(.HideSelection), FileName
WritePrivateProfileString "TreeView", "ImageList", .ImageList.Name, FileName
WritePrivateProfileString "TreeView", "Indentation", .Indentation, FileName
WritePrivateProfileString "TreeView", "LabelEdit", .LabelEdit, FileName
WritePrivateProfileString "TreeView", "LineStyle", .LineStyle, FileName
WritePrivateProfileString "TreeView", "PathSeparator", .PathSeparator, FileName
WritePrivateProfileString "TreeView", "Sorted", BoolToStr(.Sorted), FileName
WritePrivateProfileString "TreeView", "Style", .Style, FileName
WritePrivateProfileString "TreeView", "ToolTipText", .ToolTipText, FileName
WritePrivateProfileString "Nodes", "Count", CStr(.Nodes.Count), FileName
End With
'write NODES
For Each Neu In TV.Nodes
With Neu
Tempo = .Text
If Not .Parent Is Nothing Then
Tempo = Tempo & vbTab & .Parent.Index
Else
Tempo = Tempo & vbTab & "ROOT"
End If
Tempo = Tempo & vbTab & .Key & vbTab & .Tag & vbTab & BoolToStr(.Sorted)
'write text / parent / key / tag / sorted
WritePrivateProfileString "Nodes", "Node" & .Index, Tempo, FileName
If SaveNodeImage Then
Tempo = TV.ImageList.ListImages(.Image).Index
Tempo = Tempo & vbTab
Tempo = Tempo & TV.ImageList.ListImages(.SelectedImage).Index
Tempo = Tempo & vbTab
Tempo = Tempo & TV.ImageList.ListImages(.ExpandedImage).Index
'write image / selectedimage / expandedimage
WritePrivateProfileString "Nodes", "Image" & .Index, Tempo, FileName
End If
If SaveNodeStyle Then
Tempo = .ForeColor & vbTab & .BackColor & vbTab & BoolToStr(.Bold) & vbTab & BoolToStr(.Checked) & vbTab & BoolToStr(.Expanded)
'write ForeColor / BackColor / Bold / Checked / Expanded
WritePrivateProfileString "Nodes", "Style" & .Index, Tempo, FileName
End If
End With
Next
End Sub
fonction de lecture
'===========================================================================
' LOAD A TREEVIEW FROM A TVW FILE
'===========================================================================
Public Function tvLoadFromFile(TV As TreeView, ByVal FileName As String, _
Optional LoadTvStyle As Boolean = True, _
Optional LoadNodeStyle As Boolean = True, _
Optional LoadNodeImage As Boolean = True) As Long
Dim Neu As Node
Dim Tempo As String
Dim NodesCount As Long
Dim Champs
Dim i As Long
On Error Resume Next
'check file type
If ReadIniFile(FileName, "FileInfo", "Type", "") <> "TVW FILE" Then
tvLoadFromFile = -1
Exit Function
End If
With TV
.Visible = False
.Nodes.Clear
'read TreeView Style
If LoadTvStyle Then
.Appearance = ReadIniFile(FileName, "TreeView", "Appearance", .Appearance)
.BorderStyle = ReadIniFile(FileName, "TreeView", "BorderStyle", .BorderStyle)
.Checkboxes = ReadIniFile(FileName, "TreeView", "Checkboxes", .Checkboxes)
.FullRowSelect = ReadIniFile(FileName, "TreeView", "FullRowSelect", .FullRowSelect)
.HideSelection = ReadIniFile(FileName, "TreeView", "HideSelection", .HideSelection)
.Indentation = ReadIniFile(FileName, "TreeView", "Indentation", .Indentation)
.LabelEdit = ReadIniFile(FileName, "TreeView", "LabelEdit", .LabelEdit)
.LineStyle = ReadIniFile(FileName, "TreeView", "LineStyle", .LineStyle)
.PathSeparator = ReadIniFile(FileName, "TreeView", "PathSeparator", .PathSeparator)
.Sorted = ReadIniFile(FileName, "TreeView", "Sorted", .Sorted)
.Style = ReadIniFile(FileName, "TreeView", "Style", .Style)
.ToolTipText = ReadIniFile(FileName, "TreeView", "ToolTipText", .ToolTipText)
End If
End With
NodesCount = ReadIniFile(FileName, "Nodes", "Count")
'read Nodes
For i = 1 To NodesCount
Tempo = ReadIniFile(FileName, "Nodes", "Node" & i)
Champs = Split(Tempo, vbTab)
If Champs(1) = "ROOT" Then
Set Neu = TV.Nodes.Add(, , , Champs(0))
Else
Set Neu = TV.Nodes.Add(CLng(Champs(1)), tvwChild, , Champs(0))
End If
With Neu
.Key = Champs(2)
.Tag = Champs(3)
.Sorted = CBool(Champs(4))
'read image node
If LoadNodeImage Then
Tempo = ReadIniFile(FileName, "Nodes", "Image" & i)
Champs = Split(Tempo, vbTab)
.Image = CLng(Champs(0))
.SelectedImage = CLng(Champs(1))
.ExpandedImage = CLng(Champs(2))
End If
'read style node
If LoadNodeStyle Then
Tempo = ReadIniFile(FileName, "Nodes", "Style" & i)
Champs = Split(Tempo, vbTab)
.ForeColor = Champs(0)
.BackColor = Champs(1)
.Bold = Champs(2)
.Checked = Champs(3)
.Expanded = Champs(4)
End If
End With
Next
TV.Visible = True
tvLoadFromFile = Err.Number
End Function