Funktionreferenz


GUICtrlRegisterListViewSort

Beschreibung anzeigen in

Registriert eine benutzerdefinierte Funktion für eine interne ListView Sortierungs-Rückruffunktion.

GUICtrlRegisterListViewSort ( controlID, "function" )

Parameter

controlID Der ListView-Control-Identifizierer (Control-ID), für den die Benutzerfunktion ausgeführt werden soll.
function Der Name der aufzurufenden Benutzerfunktion, wenn die Sortierungs-Rückruffunktion(sorting callback) läuft.

Rückgabewert

Erfolg: 1.
Fehler: 0.

Bemerkungen

!!! Um die Benutzerfunktion ausführbar zu machen, darf sie nur mit maximal 4 Funktionsparametern definiert werden, andernfalls wird die Funktion nicht aufgerufen !!!
z.B:
Func MySortFunktion($nListViewID, $LParam1, $LParam2, $nColumn)
...
EndFunc

Oder:

Func MySortFunktion($nListViewID, $LParam1, $LParam2)
...
EndFunc


Wenn die Benutzerfunktion aufgerufen wird, haben diese 4 Parameter folgende Werte:

Position Parameter Bedeutung
1 Control-ID Der ListView-Control-Identifizierer (Control-ID), für den die Benutzerfunktion ausgeführt werden soll.
2 lParam1 Der lParam-Wert des ersten Items (standardmässig die Control-ID des Items).
3 lParam2 Der lParam-Wert des zweiten Items (standardmässig die Control-ID des Items).
4 column Die Spalte, die zum Sortieren angeklickt wurde (die erste Spaltennummer ist 0).

Die folgenden Werte müssen returned werden, um das Verhalten der Sortierungs-Rückruffunktion zu ändern:

Rückgabewert Bedeutung
-1 Das erste Item soll VOR dem zweiten stehen.
0 Keine Änderung.
1 Das erste Item soll NACH dem zweiten stehen.

Siehe auch das Beispiel zum Sortieren von selbsterstellten GUI ListView-Items.

- - - - - - - - Erklärung der Controls - - - - - - - -

Verwandte Funktionen

GUICtrlCreateListView

Beispiel

Beispiel 1

#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>

;Sortiert Unterschiede in 3 Spalten

Global $g_iCurCol = -1
Global $g_iSortDir = 1
Global $g_bSet = False
Global $g_iCol = -1

Example()

Func Example()
    GUICreate("Test", 300, 200)

    Local $idLv = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 10, 10, 280, 180)
    GUICtrlRegisterListViewSort(-1, "LVSort") ; Registriere die Funktion "LVSort" für das Sortier-Callback

    GUICtrlCreateListViewItem("ABC|666|10.05.2004", $idLv)
    GUICtrlSetImage(-1, "shell32.dll", 7)
    GUICtrlCreateListViewItem("DEF|444|11.05.2005", $idLv)
    GUICtrlSetImage(-1, "shell32.dll", 12)
    GUICtrlCreateListViewItem("CDE|444|12.05.2004", $idLv)
    GUICtrlSetImage(-1, "shell32.dll", 3)

    GUISetState(@SW_SHOW)

    Local $idMsg
    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslös
    While 1
        $idMsg = GUIGetMsg()
        Switch $idMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idLv
                $g_bSet = False
                $g_iCurCol = $g_iCol
                GUICtrlSendMsg($idLv, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($idLv), 0)
        EndSwitch
    WEnd

    GUIDelete()
EndFunc   ;==>Example


; Unsere Sortier-Callback-Funktionen
Func LVSort($hWnd, $nItem1, $nItem2, $iColumn)
    Local $sVal1, $sVal2, $iResult

    ; Schaltet die Sortierrichtung um
    If $iColumn = $g_iCurCol Then
        If Not $g_bSet Then
            $g_iSortDir = $g_iSortDir * -1
            $g_bSet = 1
        EndIf
    Else
        $g_iSortDir = 1
    EndIf
    $g_iCol = $iColumn

    $sVal1 = GetSubItemText($hWnd, $nItem1, $iColumn)
    $sVal2 = GetSubItemText($hWnd, $nItem2, $iColumn)

    ; Wenn es die dritte Spalte ist (startet bei 0), dann vergleiche die Daten
    If $iColumn = 2 Then
        $sVal1 = StringRight($sVal1, 4) & StringMid($sVal1, 4, 2) & StringLeft($sVal1, 2)
        $sVal2 = StringRight($sVal2, 4) & StringMid($sVal2, 4, 2) & StringLeft($sVal2, 2)
    EndIf

    $iResult = 0 ; Keine Änderung in item1 und item2 Positionen

    If $sVal1 < $sVal2 Then
        $iResult = -1 ; Setzt item2 vor item1
    ElseIf $sVal1 > $sVal2 Then
        $iResult = 1 ; Setzt item2 hinter item1
    EndIf

    $iResult = $iResult * $g_iSortDir

    Return $iResult
EndFunc   ;==>LVSort


; Text eines Treeview-Items in einer bestimmten Spalte abrufen
Func GetSubItemText($idCtrl, $idItem, $iColumn)
    Local $tLvfi = DllStructCreate("uint;ptr;int;int[2];int")

    DllStructSetData($tLvfi, 1, $LVFI_PARAM)
    DllStructSetData($tLvfi, 3, $idItem)

    Local $stBuffer = DllStructCreate("char[260]")

    Local $nIndex = GUICtrlSendMsg($idCtrl, $LVM_FINDITEM, -1, DllStructGetPtr($tLvfi))

    Local $tLvi = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")

    DllStructSetData($tLvi, 1, $LVIF_TEXT)
    DllStructSetData($tLvi, 2, $nIndex)
    DllStructSetData($tLvi, 3, $iColumn)
    DllStructSetData($tLvi, 6, DllStructGetPtr($stBuffer))
    DllStructSetData($tLvi, 7, 260)

    GUICtrlSendMsg($idCtrl, $LVM_GETITEMA, 0, DllStructGetPtr($tLvi)) ;

    Local $sItemText = DllStructGetData($stBuffer, 1)

    Return $sItemText
EndFunc   ;==>GetSubItemText

Beispiel 2

#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>

Global $g_iCurCol = -1
Global $g_iSortDir = 1
Global $g_bSet = 0
Global $g_iCol = -1

;Sortierung mit selbsterzeugten Items per DllCall

Example()

Func Example()
    $g_iCurCol = -1
    $g_iSortDir = 1
    $g_bSet = 0
    $g_iCol = -1

    Local $hGUI = GUICreate("Test", 300, 200)

    Local $idLv = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 10, 10, 280, 180)
    GUICtrlRegisterListViewSort(-1, "LVSort") ; Registriere die Funktion "SortLV" für das Sortier-Callback

    MyGUICtrlCreateListViewItem("ABC|666|10.05.2004", $idLv, -1)
    MyGUICtrlCreateListViewItem("DEF|444|11.05.2005", $idLv, -1)
    MyGUICtrlCreateListViewItem("CDE|444|12.05.2004", $idLv, -1)

    GUISetState(@SW_SHOW)

    Local $idMsg
    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst.
    While 1
        $idMsg = GUIGetMsg()
        Switch $idMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $idLv
                $g_bSet = 0
                $g_iCurCol = $g_iCol
                GUICtrlSendMsg($idLv, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($idLv), 0)
                DllCall("user32.dll", "int", "InvalidateRect", "hwnd", ControlGetHandle($hGUI, "", $idLv), "int", 0, "int", 1)
        EndSwitch
    WEnd
EndFunc   ;==>Example

; Unsere Sortier-Callback-Funktionen
Func LVSort2($hWnd, $nItem1, $nItem2, $g_iColumn)
    Local $sVal1, $sVal2, $iResult

    ; Wechselt die Sortierrichtung
    If $g_iColumn = $g_iCurCol Then
        If Not $g_bSet Then
            $g_iSortDir = $g_iSortDir * -1
            $g_bSet = 1
        EndIf
    Else
        $g_iSortDir = 1
    EndIf
    $g_iCol = $g_iColumn

    $sVal1 = GetSubItemText($hWnd, $nItem1, $g_iColumn)
    $sVal2 = GetSubItemText($hWnd, $nItem2, $g_iColumn)

    ; Wenn es die dritte Spalte ist (startet bei 0), dann vergleiche die Daten
    If $g_iColumn = 2 Then
        $sVal1 = StringRight($sVal1, 4) & StringMid($sVal1, 4, 2) & StringLeft($sVal1, 2)
        $sVal2 = StringRight($sVal2, 4) & StringMid($sVal2, 4, 2) & StringLeft($sVal2, 2)
    EndIf

    $iResult = 0 ; Keine Änderung der Position von item1 und item2

    If $sVal1 < $sVal2 Then
        $iResult = -1 ; Setzt item2 vor item1
    ElseIf $sVal1 > $sVal2 Then
        $iResult = 1 ; Setzt item2 hinter item1
    EndIf

    $iResult = $iResult * $g_iSortDir

    Return $iResult
EndFunc   ;==>LVSort2

; Erzeugt und fügt Items direkt in Treeview ein
Func MyGUICtrlCreateListViewItem($sText, $idCtrl, $iIndex)
    Local $tLvitem = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int;")
    Local $tText = DllStructCreate("char[260]")
    Local $aText = StringSplit($sText, "|")

    If $iIndex = -1 Then $iIndex = GUICtrlSendMsg($idCtrl, $LVM_GETITEMCOUNT, 0, 0)

    DllStructSetData($tText, 1, $aText[1]) ; Speichere Text in die Struktur

    DllStructSetData($tLvitem, 1, BitOR($LVIF_TEXT, $LVIF_PARAM))
    DllStructSetData($tLvitem, 2, $iIndex)
    DllStructSetData($tLvitem, 6, DllStructGetPtr($tText))
    ; Setzt den lParam der Struktur zu dem Zeilenindex - einmalig in die Treeview
    DllStructSetData($tLvitem, 9, $iIndex)

    $iIndex = GUICtrlSendMsg($idCtrl, $LVM_INSERTITEMA, 0, DllStructGetPtr($tLvitem))

    If $iIndex > -1 Then
        ; Fügt nun den Rest des Spaltentextes ein
        For $i = 2 To $aText[0]
            DllStructSetData($tText, 1, $aText[$i])
            DllStructSetData($tLvitem, 3, $i - 1) ; Speichere den Subitem-Index

            GUICtrlSendMsg($idCtrl, $LVM_SETITEMTEXTA, $iIndex, DllStructGetPtr($tLvitem))
        Next
    EndIf

    ; Passe die Spaltenbreite dem Text an
    For $i = 0 To 2
        GUICtrlSendMsg($idCtrl, $LVM_SETCOLUMNWIDTH, $i, -1)
        GUICtrlSendMsg($idCtrl, $LVM_SETCOLUMNWIDTH, $i, -2)
    Next
EndFunc   ;==>MyGUICtrlCreateListViewItem

; Text eines Treeview-Items in einer bestimmten Spalte abrufen
Func GetSubItemText($idCtrl, $idItem, $iColumn)
    Local $stLvfi = DllStructCreate("uint;ptr;int;int[2];int")
    Local $tBuffer, $iIndex, $tLvi, $sItemText

    DllStructSetData($stLvfi, 1, $LVFI_PARAM) ; Finde das Item durch unseren gespeicherten Index
    DllStructSetData($stLvfi, 3, $idItem)

    Local $tBuffer = DllStructCreate("char[260]")

    Local $iIndex = GUICtrlSendMsg($idCtrl, $LVM_FINDITEM, -1, DllStructGetPtr($stLvfi)) ;

    Local $tLvi = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")

    DllStructSetData($tLvi, 1, $LVIF_TEXT)
    DllStructSetData($tLvi, 2, $iIndex)
    DllStructSetData($tLvi, 3, $iColumn)
    DllStructSetData($tLvi, 6, DllStructGetPtr($tBuffer))
    DllStructSetData($tLvi, 7, 260)

    GUICtrlSendMsg($idCtrl, $LVM_GETITEMA, 0, DllStructGetPtr($tLvi)) ;

    Local $sItemText = DllStructGetData($tBuffer, 1)

    Return $sItemText
EndFunc   ;==>GetSubItemText