Menu sources

ListView 2 Text


Permet de sauvegarder le contenu d'une ListView dans un fichier texte et de le relire par la suite pour remplir une (autre) ListView
La sauvegarde peut aussi ce faire en HTML ou dans un format compréhensible par EXCEL

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 est le style de chaque ligne
l'apparence de la liste est également sauvegardée

L'extention des ces fichiers est LVW, ceci permet d'associer un programme pour ouvrir directement des images de ListView vb
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 (item.text .tag .key ...)
comme ce caractère est tres peu utilisé cela ne devrait pas trop géner

La sauvegarde en HTML et en fichier CSV utilise elle l'objet FileSystemObject qui ne marche que sous VB6

Aucune autre limite la listview obtenue est la replique exacte de celle sauvegardée

( Sources convertis en 6 couleurs avec mon programme VB to HTML)


Déclaration des API

'===========================================================================
'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 LIST VIEW IN A LVW TEXT FILE
'===========================================================================
Public Sub lvSaveToFile(ByVal LV As ListView, ByRef FileName As String)

    Dim i As Long
    Dim j As Long
    Dim lng As Long
    Dim tempo As String


    On Error Resume Next

    'erase file if exist
    Kill FileName

    'write file info type
    WritePrivateProfileString "FileInfo", "Type", "LVW FILE", FileName
    WritePrivateProfileString "FileInfo", "Version", "1.0", FileName

    With LV
        WritePrivateProfileString "ListView", "Appearance", .Appearance, FileName
        WritePrivateProfileString "ListView", "BackColor", .BackColor, FileName
        WritePrivateProfileString "ListView", "BorderStyle", .BorderStyle, FileName
        WritePrivateProfileString "ListView", "Checkboxes", BoolToStr(.Checkboxes), FileName
        WritePrivateProfileString "ListView", "FlatScrollBar", BoolToStr(.FlatScrollBar), FileName
        WritePrivateProfileString "ListView", "ForeColor", .ForeColor, FileName
        WritePrivateProfileString "ListView", "FullRowSelect", BoolToStr(.FullRowSelect), FileName
        WritePrivateProfileString "ListView", "GridLines", BoolToStr(.GridLines), FileName
        WritePrivateProfileString "ListView", "HideColumnHeaders", BoolToStr(.HideColumnHeaders), FileName
        WritePrivateProfileString "ListView", "HideSelection", BoolToStr(.HideSelection), FileName
        WritePrivateProfileString "ListView", "HotTracking", BoolToStr(.HotTracking), FileName
        WritePrivateProfileString "ListView", "HoverSelection", BoolToStr(.HoverSelection), FileName
        WritePrivateProfileString "ListView", "LabelEdit", .LabelEdit, FileName
        WritePrivateProfileString "ListView", "Sorted", BoolToStr(.Sorted), FileName
        WritePrivateProfileString "ListView", "SortKey", .SortKey, FileName
        WritePrivateProfileString "ListView", "SortOrder", .SortOrder, FileName
        WritePrivateProfileString "ListView", "Tag", .Tag, FileName
        WritePrivateProfileString "ListView", "View", .View, FileName
        
        'save ColumHeaders
        WritePrivateProfileString "ColumHeaders", "Count", .ColumnHeaders.Count, FileName

        For i = 1 To .ColumnHeaders.Count
            tempo = .ColumnHeaders(i).Text
            tempo = tempo & "|" & .ColumnHeaders(i).Key
            tempo = tempo & "|" & .ColumnHeaders(i).Tag
            tempo = tempo & "|" & .ColumnHeaders(i).Width
            tempo = tempo & "|" & .ColumnHeaders(i).Alignment
            lng = .ColumnHeaders(i).Icon
            tempo = tempo & "|" & CStr(lng)
            WritePrivateProfileString "ColumHeaders", "Colum" & CStr(i), tempo, FileName
        Next

        'save ListItems
        WritePrivateProfileString "ListItems", "Count", .ListItems.Count, FileName

        For i = 1 To .ListItems.Count

            tempo = .ListItems(i).Text

            For j = 1 To LV.ColumnHeaders.Count - 1
                tempo = tempo & "|" & .ListItems(i).SubItems(j)
            Next
            
            'save ListItems text and subItems
            WritePrivateProfileString "ListItems", "ItemText" & CStr(i), tempo, FileName

            tempo = .ListItems(i).Key
            tempo = tempo & "|" & .ListItems(i).Tag
            tempo = tempo & "|" & .ListItems(i).ToolTipText
            lng = .ListItems(i).SmallIcon
            tempo = tempo & "|" & CStr(lng)
            tempo = tempo & "|" & .ListItems(i).ForeColor
            tempo = tempo & "|" & BoolToStr(.ListItems(i).Bold)
            tempo = tempo & "|" & BoolToStr(.ListItems(i).Checked)
            tempo = tempo & "|" & BoolToStr(.ListItems(i).Ghosted)

            'save ListItems other options
            WritePrivateProfileString "ListItems", "ItemOption" & CStr(i), tempo, FileName
        Next

    End With

End Sub


Fonction de lecture

'===========================================================================
'   LOAD A LIST VIEW FROM A LVW FILE
'===========================================================================
Public Function lvLoadFromFile(ByVal LV As ListView, ByRef FileName As String, _
                      Optional ByVal LoadColums As Boolean = True, _
                      Optional ByVal LoadListViewStyle As Boolean = True, _
                      Optional ByVal LoadItemsOptions As Boolean = True) As Long

    Dim i As Long
    Dim j As Long
    Dim lng As Long
    Dim tempo As String

    Dim champs
    Dim colonne As ColumnHeader
    Dim Ligne As ListItem


    On Error Resume Next

    'check file type
    If ReadIniFile(FileName, "FileInfo", "Type", "") <> "LVW FILE" Then
    lvLoadFromFile = -1
        Exit Function
    End If

    With LV
        .Visible = False
        .ListItems.Clear
        
        If LoadListViewStyle Then
            .Appearance = ReadIniFile(FileName, "ListView", "Appearance", .Appearance)
            .BackColor = ReadIniFile(FileName, "ListView", "BackColor", .BackColor)
            .BorderStyle = ReadIniFile(FileName, "ListView", "BorderStyle", .BorderStyle)
            .Checkboxes = ReadIniFile(FileName, "ListView", "Checkboxes", .Checkboxes)
            .FlatScrollBar = ReadIniFile(FileName, "ListView", "FlatScrollBar", .FlatScrollBar)
            .ForeColor = ReadIniFile(FileName, "ListView", "ForeColor", .ForeColor)
            .FullRowSelect = ReadIniFile(FileName, "ListView", "FullRowSelect", .FullRowSelect)
            .GridLines = ReadIniFile(FileName, "ListView", "GridLines", .GridLines)
            .HideColumnHeaders = ReadIniFile(FileName, "ListView", "HideColumnHeaders", .HideColumnHeaders)
            .HideSelection = ReadIniFile(FileName, "ListView", "HideSelection", .HideSelection)
            .HotTracking = ReadIniFile(FileName, "ListView", "HotTracking", .HotTracking)
            .HoverSelection = ReadIniFile(FileName, "ListView", "HoverSelection", .HoverSelection)
            .LabelEdit = ReadIniFile(FileName, "ListView", "LabelEdit", .LabelEdit)
            .Sorted = ReadIniFile(FileName, "ListView", "Sorted", .Sorted)
            .SortKey = ReadIniFile(FileName, "ListView", "SortKey", .SortKey)
            .SortOrder = ReadIniFile(FileName, "ListView", "SortOrder", .SortOrder)
            .Tag = ReadIniFile(FileName, "ListView", "Tag", .Tag)
            .View = ReadIniFile(FileName, "ListView", "View", .View)
        End If
       

        If LoadColums Then
        
            'read ColumHeaders
            lng = ReadIniFile(FileName, "ColumHeaders", "Count", "0")

            For i = 1 To lng

                champs = Split(ReadIniFile(FileName, "ColumHeaders", "Colum" & CStr(i), ""), "|")

                If LV.ColumnHeaders.Count <= i Then
                  Set colonne = LV.ColumnHeaders.Add()
                Else
                    Set colonne = LV.ColumnHeaders(i)
                End If

                With colonne
                    .Text = champs(0)
                    .Key = champs(1)
                    .Tag = champs(2)
                    .Width = champs(3)
                    .Alignment = champs(4)
                    .Icon = CLng(champs(5))
                End With

            Next

        End If

        'read ListItems
        lng = ReadIniFile(FileName, "ListItems", "Count", "0")
        .Visible = False
        .ListItems.Clear
        .Visible = True
        For i = 1 To lng

            'read ListItems text and subItems
            champs = Split(ReadIniFile(FileName, "ListItems", "ItemText" & CStr(i), ""), "|")

            Set Ligne = LV.ListItems.Add(, , champs(0))

            With Ligne

                For j = 1 To UBound(champs)
                    .SubItems(j) = champs(j)
                Next

                If LoadItemsOptions Then
                    'load ListItems another options
                    champs = Split(ReadIniFile(FileName, "ListItems", "ItemOption" & CStr(i), ""), "|")
                    .Key = champs(0)
                    .Tag = champs(1)
                    .ToolTipText = champs(2)
                    .SmallIcon = CLng(champs(3))
                    .ForeColor = champs(4)
                    .Bold = champs(5)
                    .Checked = champs(6)
                    .Ghosted = champs(7)
                End If

            End With

        Next
        .Visible = True
    End With

    lvLoadFromFile = Err.Number
End Function


Sauvegarde en HTML 

'===========================================================================
'   SAVE A LIST VIEW IN A HTML FILE
'===========================================================================
Public Sub lvSaveToHtmlFile(ByVal LV As ListView, ByRef FileName As String, _
    Optional Border As String = "1")

    Dim i As Long
    Dim j As Long
    Dim lng As Long
    Dim tempo As String

    Dim FSO As New FileSystemObject
    Dim TXTstream As TextStream

    On Error Resume Next

    Set TXTstream = FSO.CreateTextFile(FileName)

    With TXTstream
        .WriteLine "<HTML>"
    .WriteLine "<BODY BGCOLOR=""#FFFFFF"" TEXT=""#000000"" LINK=""#000080"" VLINK=""#800080"" ALINK=""#FF0000"">"
    .WriteLine Chr(9) & "<TABLE BORDER=" & Border & ">"
    .WriteLine Chr(9) & Chr(9) & "<TR>"
        For i = 1 To LV.ColumnHeaders.Count
            .WriteLine Chr(9) & Chr(9) & Chr(9) & "<TD><B>" & CStr(LV.ColumnHeaders(i).Text) & "</B></TD>"
        .WriteLine Chr(9) & Chr(9) & "</TR>"
        For i = 1 To LV.ListItems.Count
            .WriteLine Chr(9) & Chr(9) & "<TR>"
          .WriteLine Chr(9) & Chr(9) & Chr(9) & "<TD>" & LV.ListItems(i).Text & "</TD>"
      For j = 1 To LV.ColumnHeaders.Count - 1
                .WriteLine Chr(9) & Chr(9) & Chr(9) & "<TD>" & CStr(LV.ListItems(i).SubItems(j)) & "</TD>"
    Next

            .WriteLine Chr(9) & Chr(9) & "</TR>"
    Next

        .WriteLine Chr(9) & "</TABLE>"
    .WriteLine "</HTML>"
    .Close
    End With
End Sub


sauvegarde en CSV (text séparateur tabulation)

'===========================================================================
'   SAVE A LIST VIEW IN A CSV FILE OPENABLE WITH EXCEL
'===========================================================================
Public Sub lvSaveToExcelFile(ByVal LV As ListView, ByRef FileName As String)

    Dim i As Long
    Dim j As Long

    On Error Resume Next
    
    Dim FSO As New FileSystemObject
    Dim TXTstream As TextStream

    Set TXTstream = FSO.CreateTextFile(FileName)

    With TXTstream
        
        For i = 1 To LV.ColumnHeaders.Count - 1
            .Write CStr(LV.ColumnHeaders(i).Text) & Chr(9)
        Next
        
        .WriteLine CStr(LV.ColumnHeaders(LV.ColumnHeaders.Count).Text)
        
        
        For i = 1 To LV.ListItems.Count - 1
            .Write LV.ListItems(i).Text & Chr(9)

            For j = 2 To LV.ColumnHeaders.Count - 1
                .Write LV.ListItems(i).SubItems(j - 1) & Chr(9)
            Next
            .WriteLine LV.ListItems(i).SubItems(LV.ColumnHeaders.Count - 1)

        Next
        .Close
    End With
    Set TXTstream = Nothing
    Set FSO = Nothing
End Sub


'===========================================================================
'   SAVE A LIST VIEW IN A CSV FILE OPENABLE WITH EXCEL
'===========================================================================
Public Sub lvLoadFromCsvFile(ByVal LV As ListView, ByRef FileName As String, _
    separateur As String)

    Dim i As Long
    Dim LigneTexte  As String
    Dim ColonneTexte
    
    Dim Ligne As ListItem
    

    On Error Resume Next
    
    Dim FSO As New FileSystemObject
    Dim TXTstream As TextStream

    Set TXTstream = FSO.OpenTextFile(FileName)

    LV.ListItems.Clear
    
    Do
        LigneTexte = TXTstream.ReadLine
        ColonneTexte = Split(LigneTexte, separateur)
        
        Set Ligne = LV.ListItems.Add(, , ColonneTexte(0))

        For i = 1 To UBound(ColonneTexte)
            Ligne.SubItems(i) = ColonneTexte(i)
        Next
    
    Loop Until TXTstream.AtEndOfStream
    
    Set TXTstream = Nothing
    Set FSO = Nothing
End Sub