1er tri ListView colonne numérique en ordre

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

1er tri ListView colonne numérique en ordre

#1

Message par papami »

Bonsoir à tous et Bonne Année :)

j'ai créé une listView qui me donne satisfaction à 99% "seulement" !
En effet, lors d'un premier clic sur en-tête de colonne en ordre ascendant à la création ... il ne se passe rien !

en fait il se passe qu'il y a bien un tri mais systématiquement ascendant au 1er clic sur en-tête :
c'est gênant si l'on veut visualiser en ordre inverse

ce n'est qu'au second clic au même endroit que l'ordre s'inverse

j'utilise _GUICtrlListView_RegisterSortCallBack

j'ai bien bidouillé un truc qui fait, pour une colonne donnée triée en création, que si 1er clic alors mouseClick pour
doubler le clic automatiquement, mais c'est lent et si le curseur est déplacé entre-temps c'est cuit !

On ne peut pas envoyer un paramètre pour inverser l'ordre d'un premier tri dans une colonne ?

Merci pour toute info
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11638
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: 1er tri ListView colonne numérique en ordre

#2

Message par Tlem »

Bonsoir papami.
Je viens de tester l'exemple 1 de la documentation pour _GUICtrlListView_RegisterSortCallBack et visiblement tout fonctionne correctement au premier clic !
Essayez de voir ce qui pourrait manquer entre votre code et celui de l'exemple (Peut-être un style). :wink:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

Re: 1er tri ListView colonne numérique en ordre

#3

Message par papami »

Bonjour Tlem
l'exemple Autoit : oui mais non !

Donc ouvrir exemple 1 et clic direct sur colonne 3 = pshitt !
en fait, comme déjà dit il y a bien un tri , mais sur une colonne déjà triée en ascendant c'est retrié en ascendant
et il faut alors recliquer pour inverser.
Pour de longues listes c'est gênant.

Si dans l'exemple vous remplacez les valeurs 1ère colonne des 3 lignes par 1,2,3 OU A,B,C = même résultat
contrairement à ce qui se passe dans une fenêtre Win : là si une colonne est déjà triée, par exemple nom ou date de modification,
le clic en en-tête de colonne fonctionne dans tous les cas et retrie en sens contraire.
ce que j'aimerais obtenir !

Eventuellement, connaissant la colonne concernée, avec un truc du genre "SI = colonneX ET SI 1er clic alors SENS tri = ...
ou évidemment si les concepteurs s'y intéressent un paramètre supplémentaire dans l'appel du Sort ... si cela n'existe pas déjà mais que je ne saurais pas chercher/trouver.

Merci pour toute info
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11638
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: 1er tri ListView colonne numérique en ordre

#4

Message par Tlem »

Bonjour.
Donc ouvrir exemple 1 et clic direct sur colonne 3 = pshitt !
en fait, comme déjà dit il y a bien un tri , mais sur une colonne déjà triée en ascendant c'est retrié en ascendant
et il faut alors recliquer pour inverser.
Ben c'est un comportement normal puisque _GUICtrlListView_SortItems tri toujours de la même manière.
Après si vous voulez un autre comportement, il faudra modifier cette fonction en conséquence, mais la tâche peu ne pas être simple ....
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1943
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: 1er tri ListView colonne numérique en ordre  

#5

Message par TommyDDR »

Pour moi, il n'y a pas de problème dans l'exemple, certes, l'affichage correspond a un tri sur la 3eme colonne, mais aucun tri n'a vraiment été fait dessus, ce sont juste les données qui ont été entrées par coïncidence dans le bon ordre, ce qui fait qu'au 1er clic, il va trier par ordre croissant, puis au 2eme, en décroissant.

Si vous n'avez pas des milliers d'items, vous pouvez contourner le problème en vérifiant avant le contenu de la listview et si après le tri, rien n'a bougé, vous rappelez SortItems :
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Global $g_idListView

Example()

Func Example()
    Local $hImage, $aIcons[3] = [0, 3, 6]
    Local $iExWindowStyle = BitOR($WS_EX_DLGMODALFRAME, $WS_EX_CLIENTEDGE)
    Local $iExListViewStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES, $LVS_EX_DOUBLEBUFFER)
    Local $iMsg

    GUICreate("ListView Sort", 300, 200)

    $g_idListView = GUICtrlCreateListView("Column1|Col2|Col3", 10, 10, 280, 180, -1, $iExWindowStyle)
    _GUICtrlListView_SetExtendedListViewStyle($g_idListView, $iExListViewStyle)

    ; Charge les images
    $hImage = _GUIImageList_Create(18, 18, 5, 3)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -7)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -12)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -3)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -4)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -5)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -6)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -9)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -10)
    _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", -11)
    _GUICtrlListView_SetImageList($g_idListView, $hImage, 1)

    _AddRow($g_idListView, "ABC|000666|10.05.2004", $aIcons)
    _AddRow($g_idListView, "DEF|444|11.05.2005", $aIcons, 1)
    _AddRow($g_idListView, "CDE|555|12.05.2004", $aIcons, 2)

    GUISetState(@SW_SHOW)

    _GUICtrlListView_RegisterSortCallBack($g_idListView)

    Do
        $iMsg = GUIGetMsg()
        If $iMsg = $g_idListView Then
            ; Démarre le tri de rappel
         Local $oldState = lviewToString($g_idListView)
            _GUICtrlListView_SortItems($g_idListView, GUICtrlGetState($g_idListView))
         If($oldState == lviewToString($g_idListView)) Then
            _GUICtrlListView_SortItems($g_idListView, GUICtrlGetState($g_idListView))
         EndIf
        EndIf
    Until $iMsg = $GUI_EVENT_CLOSE

    _GUICtrlListView_UnRegisterSortCallBack($g_idListView)
    GUIDelete()
EndFunc   ;==>Example

Func lviewToString($lview)
   Local $ret = ""
   Local $nbRows = _GUICtrlListView_GetItemCount($lview)
   For $i = 0 To $nbRows - 1
      $ret &= _GUICtrlListView_MapIndexToID($lview, $i) & "|"
   Next
   ConsoleWrite($ret & @CRLF)
   Return $ret
EndFunc


Func _AddRow($hWnd, $sItem, $aIcons, $iPlus = 0)
    Local $aItem = StringSplit($sItem, "|")
    Local $iIndex = _GUICtrlListView_AddItem($hWnd, $aItem[1], $aIcons[0] + $iPlus, _GUICtrlListView_GetItemCount($hWnd) + 9999)
    _GUICtrlListView_SetColumnWidth($hWnd, 0, $LVSCW_AUTOSIZE_USEHEADER)

    For $x = 2 To $aItem[0]
        _GUICtrlListView_AddSubItem($hWnd, $iIndex, $aItem[$x], $x - 1, $aIcons[$x - 1] + $iPlus)
        _GUICtrlListView_SetColumnWidth($hWnd, $x - 1, $LVSCW_AUTOSIZE)
    Next
EndFunc   ;==>_AddRow
Pour l'explication : L'index d'une ligne correspond à un positionnement dans la liste view alors qu'un ID a fixe pour chaque ligne, même si celle-ci change de position dans la liste. Donc en listant dans l'ordre les id des lignes, vous pouvez facilement voir si les lignes ont bougé ou non.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
papami
Niveau 4
Niveau 4
Messages : 96
Enregistré le : lun. 19 nov. 2007 17:25
Status : Hors ligne

Re: 1er tri ListView colonne numérique en ordre

#6

Message par papami »

Bonsoir,

Super, merci
C'est mieux que ma bidouille mouse re-clic !

maintenant je ne sais pas si je dois indiquer quelque part ici que mon problème est résolu ?
en tous cas il l'est

cdt
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11638
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: 1er tri ListView colonne numérique en ordre

#7

Message par Tlem »

Vous avez cliqué sur l'icône correspondant, donc le sujet est marqué résolu (la petite coche verte). ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre