Zugegeben, einen solchen Tipp gibt es schon! 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. 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 |