vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB601.03.11
ListView Spaltenreihenfolge speichern und wiederherstellen

Universal-Funktionen zum Speichern und Wiederherstellen der Spaltenreihenfolgen des ListView-Controls - für Common Controls Version 5.0 und 6.0

Autor:  Ralf SchlegelBewertung:     [ Jetzt bewerten ]Views:  1.740 
http://www.vb-zentrum.de/System:  Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt 

Zugegeben, einen solchen Tipp gibt es schon!
Nachfolgender Tipp verwendet jedoch das Microsoft API und funktioniert sowohl für das ListView aus den Common Controls Version 5.0, als auch für jendes aus den Common Controls 6.0.

Zum Speichern und Wiederherstellen der Spaltenreihenfolge stellt Microsoft im ListView API die Methoden LVM_SETCOLUMNORDERARRAY und LVM_GETCOLUMNORDERARRAY zur Verfügung, die wir in VB6 mit der SendMessage Funktion leicht implementieren können:

' Konstanten:
Private Const LVM_FIRST As Long = &H1000&
Private Const LVM_SETCOLUMNORDERARRAY As Long = (LVM_FIRST + 58)
Private Const LVM_GETCOLUMNORDERARRAY As Long = (LVM_FIRST + 59)
 
' Deklarationen der Systemfunktionen
Private Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long
 
Private Declare Function SendMessageLong Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As Long) As Long
' Spalten-Reihenfolge zuweisen
Private Function pSetColumnOrderArray(ByVal hwnd As Long, _
  ByVal iCount As Long, _
  ByRef lpiArray As Long) As Boolean
 
  pSetColumnOrderArray = SendMessage(hwnd, LVM_SETCOLUMNORDERARRAY, ByVal iCount, lpiArray)
End Function
' Spaltenreihenfolge ermitteln
Private Function pGetColumnOrderArray(ByVal hwnd As Long, _
  ByVal iCount As Long, _
  ByRef lpiArray() As Long) As Boolean
 
  ReDim lpiArray(iCount - 1)
  pGetColumnOrderArray = SendMessage(hwnd, LVM_GETCOLUMNORDERARRAY, ByVal iCount, lpiArray(0))
End Function

Es bietet sich nun an, diese Information in der Registry zu speichern. Wie man den Funktionen aber entnehmen kann, arbeitet Microsoft hierbei mit einem LongArray! Um nun dieses LongArray mit den VB Funktionen GetSetting und SaveSetting verarbeiten zu können, muss dieses Array in einen String gewandelt werden. Dafür benötigen wir 2 Hilfsfunktionen:

' Wandelt ein LongArray in einen String,
' wobei das Trennzeichen optional gewählt werden kann:
Private Function pLongArrayToString(ByRef lArray() As Long, _
  Optional delimiter As String = ";") As String
 
  Dim i As Long
 
  If IsArray(lArray) Then
    For i = LBound(lArray) To UBound(lArray)
      pLongArrayToString = pLongArrayToString & CStr(lArray(i)) & delimiter
    Next
  End If
End Function
' Zerlegt den übergebenen String gemäß Trennzeichen und
' gibt die Werte as LongArray zurück
Private Function pStringToLongArray(ByVal s As String, _
  Optional delimiter As String = ";") As Long()
 
  Dim i As Long
  Dim fld() As Long
  Dim fields() As String
 
  fields = Split(s, delimiter)
  ReDim fld(UBound(fields))
  For i = 0 To UBound(fields)
    fld(i) = Val(fields(i))
  Next i
  Erase fields
  pStringToLongArray = fld
End Function

Kommen wir nun zu den eigentlichen Funktionen: lvwLoadColumnOrder und lvwSaveColumnOrder.
Diesen Funktionen muss lediglich das ListView-Objekt übergeben werden. Die Deklaration "As Object" ermöglicht uns dabei die gleichzeitige Verwendung der ListViews der Common Controls 5.0 UND 6.0 in einem Projekt:

Public Sub lvwLoadColumnOrder(ByVal lstView As Object)
  Dim nr As Long, cols() As Long
  Dim regString As String
 
  With lstView
    nr = .ColumnHeaders.Count
    If nr = 0 Then Exit Sub
    regString = GetSetting(App.Title, "Settings", .Parent.Name & "." & .Name & "_Columns", "0;")
    cols = pStringToLongArray(regString)
    If UBound(cols) > nr Then ReDim Preserve cols(nr)
    pSetColumnOrderArray .hwnd, UBound(cols), cols(0)
  End With
End Sub
Public Sub lvwSaveColumnOrder(ByVal lstView As Object)
  Dim nr As Long, cols() As Long
  Dim regString As String
 
  With lstView
    nr = .ColumnHeaders.Count
    If nr = 0 Then Exit Sub
    pGetColumnOrderArray .hwnd, nr, cols
    regString = pLongArrayToString(cols)
    SaveSetting App.Title, "Settings", .Parent.Name & "." & .Name & "_Columns", regString
  End With
End Sub