Enregistre une fonction 'callback' définie par l'utilisateur pour un tri interne d'une ListView.
GUICtrlRegisterListViewSort ( controlID, "function" )
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é. |
Succès: | Retourne 1. |
Échec: | Retourne 0. |
!!! 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). |
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. |
; 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
; 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