Menu sources

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)

Déclaration des API utilisées

'===========================================================================
'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

Fonction de sauvegarde

'===========================================================================
'   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