Rubrik: | VB-Versionen: VB6 | 01.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 Schlegel | Bewertung: | Views: 1.767 |
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