Что нового

Получить направление сортировки _GUICtrlListView_SortItems + задать направление

timsky

Осваивающий
Сообщения
93
Репутация
28
Совсем недавно стал разбираться с гуями и опыта совсем мало. Есть затык один с ListView. Вот пример Creat0R, к которому прикрутил сортировку:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>
;

Global $iDouble_Click_Event = False
Global $iOne_Click_Event = False

$GUI = GUICreate("ListView - One Click & Double Click", 300, 200)

$hListView = GUICtrlCreateListView("Column", 10, 10, 280, 170)
_GUICtrlListView_RegisterSortCallBack($hListView)
_GUICtrlListView_SortItems($hListView, 0)

For $i = 1 To 10
    GUICtrlCreateListViewItem("Item " & $i, $hListView)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		
		Case $hListView
			MsgBox(0, GUICtrlGetState($hListView), GUICtrlRead($hListView))
			_GUICtrlListView_SortItems($hListView, GUICtrlGetState($hListView))
    EndSwitch
    
    If $iOne_Click_Event Then
        $iOne_Click_Event = 0
        ;ToolTip("Click")
    EndIf
    
    If $iDouble_Click_Event Then
        $iDouble_Click_Event = 0
        ;ToolTip("Double Click")
    EndIf
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    $iOne_Click_Event = True
                Case $NM_DBLCLK
                    $iDouble_Click_Event = True
            EndSwitch
    EndSwitch
    
    Return $GUI_RUNDEFMSG
EndFunc


1) Как получить направление сортировки?. Т.е. по возрастающей или убывающей. Нужно при следующем запуске помнить сортировку...

2) Почему когда _GUICtrlListView_SortItems($hListView, 0) отрабатывает при создании ListView, список сортируется "правильно":
1
2
3
...
10

А когда сортировка выполняется по клику, то "неправильно":
1
10
2
3
...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Получить тип сортировки _GUICtrlListView_SortItems() + глюк?

timsky [?]
Почему когда _GUICtrlListView_SortItems($hListView, 0) отрабатывает при создании ListView, список сортируется "правильно":

Здесь сортировка вообще не выполняется ,т.к. сортировка назначена до создания элементов
Код:
;_GUICtrlListView_SortItems($hListView, 0) ; было

For $i = 1 To 10
    GUICtrlCreateListViewItem("Item " & $i, $hListView)
Next
_GUICtrlListView_SortItems($hListView, 0); надо
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Получить тип сортировки _GUICtrlListView_SortItems() + глюк?

timsky [?]
Как получить тип сортировки?. Т.е. по возрастающей или убывающей
Код:
Case $hListView
            ;MsgBox(0, GUICtrlGetState($hListView), GUICtrlRead($hListView))
            _GUICtrlListView_SortItems($hListView, GUICtrlGetState($hListView))
			
			$iFormat = _GUICtrlHeader_GetItemFormat(_GUICtrlListView_GetHeader($hListView), 0)
			
			$nSort_State = 0
			
			If BitAND($iFormat, $HDF_SORTDOWN) Then
				$nSort_State = 1
			ElseIf BitAND($iFormat, $HDF_SORTUP) Then
				$nSort_State = -1
			EndIf
			
			ConsoleWrite("Sort State: " & $nSort_State & @LF)



Почему когда _GUICtrlListView_SortItems($hListView, 0) отрабатывает при создании ListView, список сортируется "правильно"
...
А когда сортировка выполняется по клику, то "неправильно"
Потому что сортировку ты делаешь до создания элементов, так ничего и не сортируется, это по умолчанию ListView сортирует "правильно".



Добавлено:
Сообщение автоматически объединено:

Для консистенции, можно задать для ListView стиль сортироваки как в _GUICtrlListView_SortItems:

Код:
$hListView = GUICtrlCreateListView("Column", 10, 10, 280, 170, BitOr($GUI_SS_DEFAULT_LISTVIEW, $LVS_SORTASCENDING))
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Получить тип сортировки _GUICtrlListView_SortItems() + глюк?

timsky [?]
А когда сортировка выполняется по клику, то "неправильно":

Для правильной сортировки достаточно сразу создавать форматированные строки :
Код:
For $i = 0 To 10
   ; GUICtrlCreateListViewItem("Item " & $i, $hListView)
     GUICtrlCreateListViewItem("Item " &StringFormat("%2d",$i), $hListView)
Next
 
Автор
timsky

timsky

Осваивающий
Сообщения
93
Репутация
28
Re: Получить тип сортировки _GUICtrlListView_SortItems() + глюк?

CreatoR
То, что нужно! :laugh:
Только я чет думал, что исходя из ответа смогу сам реализовать нужное направление сортировки, но что-то не получается. Пробовал _GUICtrlHeader_SetItemFormat($hListViewHeader, $iColumn, $HDF_SORTUP) но естественно, это просто меняет направление стрелки. Как теперь отсортировать список в нужном направлении?


gregaz [?]
Для правильной сортировки достаточно сразу создавать форматированные строки :
Да, я уже сделал так, спасибо :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
timsky [?]
реализовать нужное направление сортировки
Так ты уже это используешь:
Код:
_GUICtrlListView_SortItems($hListView, 0)


Ну и ещё я уже написал выше как в ListView задать соритровку.
 
Автор
timsky

timsky

Осваивающий
Сообщения
93
Репутация
28
CreatoR [?]
Ну и ещё я уже написал выше как в ListView задать соритровку.
Точно, я сразу даже не понял как-то смысл этого дополнения. :beer:
 
Верх