Hallo zusammen,
folgendes Problem:
Ich möchte ein Listview nach verschiedenen Kriterien sortieren.
Dazu verwende ich GUICtrlRegisterListViewSort
Das funktioniert auch wunderbar.
Nun möchte ich diese Sortierfunktion auf einem anderen Weg starten (Hotkey, Buttonclick usw.)
Hier mal ein Beispiel zum spielen:
Spoiler anzeigen
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <Guilistview.au3>
#include <File.au3>
#include <Array.au3>
#include <SendMessage.au3>
; nuts (http://www.autoit.de)
[/autoit] [autoit][/autoit] [autoit]Global $nSortDir = 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 633, 544, 193, 125)
Global $ListView1 = GUICtrlCreateListView("Text|Nummer|Datum1|Datum2", 48, 16, 521, 385)
GUICtrlRegisterListViewSort(-1, "_LVSort")
Global $hLVHandle = GUICtrlGetHandle($ListView1)
_GUICtrlListView_SetColumn($hLVHandle, 0, "Text", 50, 1)
_GUICtrlListView_SetColumn($hLVHandle, 1, "Nummer", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 2, "Datum1", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 3, "Datum2", 150, 1)
Global $Button1 = GUICtrlCreateButton("Test", 216, 448, 177, 49, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
For $i = 0 To 5
$temp = Random(1, 31, 1)
If $temp < 10 Then $temp = "0" & $temp
GUICtrlCreateListViewItem("ABC|" & Random(1, 10050, 1) & "|2010\02\" & $temp & "|" & $temp & ".02.2010", $ListView1)
GUICtrlCreateListViewItem("DDC|" & Random(1, 10050, 1) & "|2011\03\" & $temp & "|" & $temp & ".03.2011", $ListView1)
Next
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
;sortiere nach col 2
_SendMessage(0x00130458, 78, 0x00000003, 0x008CE2AC)
$nSortDir = $nSortDir * - 1
Case $ListView1
DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hLVHandle, "int", 0, "int", 1)
$nSortDir = $nSortDir * - 1
EndSwitch
WEnd
Func _Sort_byNumber($item1, $item2)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($item1) < Number($item2) Then
$ret = -1
ElseIf Number($item1) > Number($item2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byNumber
[/autoit] [autoit][/autoit] [autoit]Func _Sort_byString($item1, $item2)
Local $ret = 0
If $item1 < $item2 Then
$ret = -1
ElseIf $item1 > $item2 Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
EndFunc ;==>_Sort_byString
Func _Sort_byDate($item1, $item2, $del = ".", $step = -1)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0, $sitem1, $sitem2, $aitem1, $aitem2
[/autoit] [autoit][/autoit] [autoit]$aitem1 = StringSplit($item1, $del)
$aitem2 = StringSplit($item2, $del)
Switch $step
Case - 1
For $i = $aitem1[0] To 1 Step -1
$sitem1 &= $aitem1[$i]
Next
For $i = $aitem2[0] To 1 Step -1
$sitem2 &= $aitem2[$i]
Next
Case 1
For $i = 1 To $aitem1[0]
$sitem1 &= $aitem1[$i]
Next
For $i = 1 To $aitem2[0]
$sitem2 &= $aitem2[$i]
Next
EndSwitch
;ConsoleWrite($sitem1 & " | "& $sitem2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($sitem1) < Number($sitem2) Then
$ret = -1
ElseIf Number($sitem1) > Number($sitem2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byDate
[/autoit] [autoit][/autoit] [autoit]Func _LVSort($hWnd, $nItem1, $nItem2, $nColumn)
[/autoit] [autoit][/autoit] [autoit]Local $val1, $val2, $nResult
[/autoit] [autoit][/autoit] [autoit]$val1 = GetSubItemText($hWnd, $nItem1, $nColumn)
$val2 = GetSubItemText($hWnd, $nItem2, $nColumn)
;ConsoleWrite($val1 & " | "& $val2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit]$nResult = 0
[/autoit] [autoit][/autoit] [autoit]Switch $nColumn
[/autoit] [autoit][/autoit] [autoit]Case 3
$nResult = _Sort_byDate($val1, $val2)
Case 2
$nResult = _Sort_byDate($val1, $val2, "\", 1)
Case 1
$nResult = _Sort_byNumber($val1, $val2)
Case 0
$nResult = _Sort_byString($val1, $val2)
EndSwitch
$nResult = $nResult * $nSortDir
Return $nResult
EndFunc ;==>_LVSort
[/autoit] [autoit][/autoit] [autoit]Func GetSubItemText($nCtrlID, $nItemID, $nColumn)
Local $stLvfi = DllStructCreate("uint;ptr;int;int[2];int")
Local $nIndex, $stBuffer, $stLvi, $sItemText
DllStructSetData($stLvfi, 1, $LVFI_PARAM)
DllStructSetData($stLvfi, 3, $nItemID)
$stBuffer = DllStructCreate("char[260]")
[/autoit] [autoit][/autoit] [autoit]$nIndex = GUICtrlSendMsg($nCtrlID, $LVM_FINDITEM, -1, DllStructGetPtr($stLvfi));
[/autoit] [autoit][/autoit] [autoit]$stLvi = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")
[/autoit] [autoit][/autoit] [autoit]DllStructSetData($stLvi, 1, $LVIF_TEXT)
DllStructSetData($stLvi, 2, $nIndex)
DllStructSetData($stLvi, 3, $nColumn)
DllStructSetData($stLvi, 6, DllStructGetPtr($stBuffer))
DllStructSetData($stLvi, 7, 260)
GUICtrlSendMsg($nCtrlID, $LVM_GETITEMA, 0, DllStructGetPtr($stLvi));
[/autoit] [autoit][/autoit] [autoit]$sItemText = DllStructGetData($stBuffer, 1)
[/autoit] [autoit][/autoit] [autoit]$stLvi = 0
$stLvfi = 0
$stBuffer = 0
Return $sItemText
EndFunc ;==>GetSubItemText
Also z.B. eine Sortierung von Spalte 2 durch klicken des Buttons.
Gruß nuts