Functions > GUI > GUICtrlUpdate >


GUICtrlRegisterListViewSort

Enregistre une fonction 'callback' définie par l'utilisateur pour un tri interne d'une ListView.

GUICtrlRegisterListViewSort ( controlID, "function" )

Paramètres

controlID L'identifiant du contrôle Listview que la fonction utilisateur doit trier.
function Le nom de la fonction utilisateur à appeler lorsque le tri 'callback' doit être exécuté.

Valeur de retour

Succès: Retourne 1.
Échec: Retourne 0.

Remarques

!!! Pour que la fonction utilisateur fonctionne, vous devez la définir avec 4 paramètres au maximum sinon la fonction ne sera pas appelée!!!
Exemple:
Func MySortFunction($nListViewID, $LParam1, $LParam2, $nColumn )
...
EndFunc

ou

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

Lorsque la fonction utilisateur est appelée, ces quatre paramètres ont les valeurs suivantes:

Position Paramètre Signification
1 controlID L'identifiant du contrôle Listview pour lequel la fonction de rappel est utilisée.
2 lParam1 La valeur lParam du premier item (par défaut l'item controlID).
3 lParam2 La valeur lParam du deuxième item (par défaut l'item controlID).
4 colonne La colonne qui a été cliquée pour être triée (le numéro de la première colonne est 0).

Les valeurs suivantes sont retournées pour changer le comportement de la fonction de tri 'callback':

Valeur retournée Signification
-1 Le 1er élément doit précéder le 2nd.
0 Pas de changement.
1 Le 1er élément doit suivre le 2ème.

Consultez aussi les exemples pour créer des éléments d'une Listview en les triant.

En relation

GUICtrlCreateListView

Exemples

Exemple 1

; Tri de 3 colonnes différentes

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

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("Column1|Col2|Col3", 10, 10, 280, 180)
    GUICtrlRegisterListViewSort(-1, "LVSort") ; Crée la fonction "SortLV" pour le rappel de tri

    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)

    ; Boucle jusqu'à ce que l'utilisateur quitte.
    Local $idMsg = GUIGetMsg()
    While $idMsg <> $GUI_EVENT_CLOSE 
        If $idMsg = $idLv Then
            $g_bSet = False
            $g_iCurCol = $g_iCol
            GUICtrlSendMsg($idLv, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($idLv), 0)
;~ DllCall ("user32.dll", "int", "InvalidateRect", "hwnd", GUICtrlGetHandle ($idLv), "int", 0, "int", 1)
        EndIf
        $idMsg = GUIGetMsg()
    WEnd

    GUIDelete()
EndFunc   ;==>Example

; Notre fonction tri callback
Func LVSort($hWnd, $nItem1, $nItem2, $iColumn)
    Local $sVal1, $sVal2, $iResult

    ; Change la direction du tri
    If $iColumn = $g_iCurCol Then
        If Not $g_bSet Then
            $g_iSortDir = $g_iSortDir * -1
            $g_bSet = True
        EndIf
    Else
        $g_iSortDir = 1
    EndIf
    $g_iCol = $iColumn

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

    ; Si c'est le 3ème colonne (celle qui commence par 0), alors compare les dates
    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 ; Pas de changement pour les positions de item1 et item2

    If $sVal1 < $sVal2 Then
        $iResult = -1 ; Met item2 avant item1
    ElseIf $sVal1 > $sVal2 Then
        $iResult = 1 ; Met item2 derrière item1
    EndIf

    $iResult = $iResult * $g_iSortDir

    Return $iResult
EndFunc   ;==>LVSort

; Obtient le texte d'un item listview dans une colonne spécifiée
Func GetSubItemText($idCtrl, $idItem, $iColumn)
    Local $tLvfi = DllStructCreate("uint;ptr;int;int[2];int")

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

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

    Local $iIndex = 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, $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


Exemple 2

; Tri avec auto-création des items par DllCall

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

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

Example()

Func Example()

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

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

    Local $idLv = GUICtrlCreateListView("Column1|Col2|Col3", 10, 10, 280, 180)
    GUICtrlRegisterListViewSort(-1, "LVSort2") ; Crée la fonction 'SortLV' pour le tri '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)

    ; Boucle jusqu'à ce que l'utilisateur quitte.
    Local $idMsg = GUIGetMsg()
    While $idMsg <> $GUI_EVENT_CLOSE
        If $idMsg = $idLv Then
            $g_bSet = False
            $g_iCurCol = $g_iCol
            GUICtrlSendMsg($idLv, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($idLv), 0)
            DllCall("user32.dll", "int", "InvalidateRect", "hwnd", ControlGetHandle($hGUI, "", $idLv), "int", 0, "int", 1)
        EndIf
        $idMsg = GUIGetMsg()
    WEnd
EndFunc   ;==>Example

; Notre fonction de tri callback
Func LVSort2($hWnd, $idItem1, $idItem2, $idColumn)
    Local $sVal1, $sVal2, $iResult

    ; Change la direction de tri
    If $idColumn = $g_iCurCol Then
        If Not $g_bSet Then
            $g_iSortDir = $g_iSortDir * -1
            $g_bSet = True
        EndIf
    Else
        $g_iSortDir = 1
    EndIf
    $g_iCol = $idColumn

    $sVal1 = GetSubItemText($hWnd, $idItem1, $idColumn)
    $sVal2 = GetSubItemText($hWnd, $idItem2, $idColumn)

    ; Si c'est le 3ème colonne (celle qui commence par 0), alors compare les dates
    If $idColumn = 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 ; Pas de changement des positions de item1 et de item2

    If $sVal1 < $sVal2 Then
        $iResult = -1 ; Met item2 avant item1
    ElseIf $sVal1 > $sVal2 Then
        $iResult = 1 ;Mettez item2 derrière élément1
    EndIf

    $iResult = $iResult * $g_iSortDir

    Return $iResult
EndFunc   ;==>LVSort2

; Crée et insére des items directement dans la Listview
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]) ;Enregistrez le texte de l'élément dans la structure

    DllStructSetData($tLvitem, 1, BitOR($LVIF_TEXT, $LVIF_PARAM))
    DllStructSetData($tLvitem, 2, $iIndex)
    DllStructSetData($tLvitem, 6, DllStructGetPtr($tText))
    ; Définit le lParam de la structure sur l'index unique de ligne dans le listview
    DllStructSetData($tLvitem, 9, $iIndex)

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

    If $iIndex > -1 Then
        ; Insére maintenant le reste du texte de la colonne
        For $i = 2 To $aText[0]
            DllStructSetData($tText, 1, $aText[$i])
            DllStructSetData($tLvitem, 3, $i - 1) ;Stocker l'index de sous-élément

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

    ; Change la largeur de colonne pour ajuster le texte de l'item
    For $i = 0 To 2
        GUICtrlSendMsg($idCtrl, $LVM_SETCOLUMNWIDTH, $i, -1)
        GUICtrlSendMsg($idCtrl, $LVM_SETCOLUMNWIDTH, $i, -2)
    Next
EndFunc   ;==>MyGUICtrlCreateListViewItem

; Récupére le texte d'un item listview dans une colonne spécifiée
Func GetSubItemText($idCtrl, $idItem, $iColumn)
    Local $tLvfi = DllStructCreate("uint;ptr;int;int[2];int")

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

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

    Local $iIndex = 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, $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