das Problem ist nur wo und an welcher Stelle sollte ich dies einabuen, die Listview kann ich ja anscheinend nicht damit auslesen.
Da es sich ja um eine ListView handelt sieht das ganze wieder bisschen anders aus, als bei der Sortierung eines Arrays.
Die ListView bringt eine eigene Sortierlogik mit.
Die _ArraySortFlexible(), welche diese für Arrays beinhaltet brauchst du daher nicht.
Das was man aber bei der ListView-Sortierung machen kann ist, eine eigene Vergleichsfunktion mitzugeben (per GUICtrlRegisterListViewSort()).
Es reicht daher dort den Vergleich mit der in der ArrayPlus enthaltenen Vergleichsfunktion __ap_cb_comp_Natural() durchzuführen und dann werden auch die IPs richtig sortiert.
Bisschen nervig ist jedoch der Aufwand den man betreiben muss um die ListviewElemente auszulesen, sowie die Sortierreihenfolge ordentlich übergeben zu bekommen.
Dann klappt es aber wie gewünscht:
#include <GUIConstants.au3>
#include <ListViewConstants.au3>
#include <ArrayPlus.au3>
; Ausgangsarray:
Local $aListViewData[10][4] = [ _
["PC-001", "00:1A:2B:3C:4D:5E", "192.168.23.145", "Büro 101"], _
["PC-002", "00:2B:3C:4D:5E:6F", "10.0.15.87", "Empfang"], _
["PC-003", "00:3C:4D:5E:6F:7G", "172.16.78.209", "Besprechungsraum"], _
["PC-004", "00:4D:5E:6F:7G:8H", "192.168.1.3", "Buchhaltung"], _
["PC-005", "00:5E:6F:7G:8H:9I", "10.10.55.201", "Marketing"], _
["PC-006", "00:6F:7G:8H:9I:0J", "172.20.100.50", "Entwicklung 1"], _
["PC-007", "00:7G:8H:9I:0J:1K", "192.168.0.11", "Entwicklung 2"], _
["PC-008", "00:8H:9I:0J:1K:2L", "10.1.1.254", "Personalabteilung"], _
["PC-009", "00:9I:0J:1K:2L:3M", "172.31.255.1", "Kantine"], _
["PC-010", "00:0J:1K:2L:3M:4N", "192.168.100.100", "Serverraum"] _
]
; Variablen mit deren Hilfe man die Sortierreihenfolge handeln kann (Siehe Hilfe zu GUICtrlRegisterListViewSort())
Global $g_iCurCol = -1, _
$g_iSortDir = 1, _
$g_bSet = False, _
$g_iCol = -1
; GUI
Global $hGUI = GUICreate("LARCH-Network Browser", 600, 400)
Global $idListView = GUICtrlCreateListView("PC Name|MAC Address|IP Address|Bezeichnung", 10, 10, 580, 300, $LVS_REPORT) ; Hinzufügen der neuen Spalte
; GUI Events (hier OnEvent-Modus im Gegensatz zum 2. GUI)
Opt("GUIOnEventMode", 1)
GUISetOnEvent($GUI_EVENT_CLOSE, "raus")
; GUI-Ctrl Events (was passiert wenn man mit den Controls interagiert)
GUICtrlSetOnEvent($idListView, _cb_lv_clicked)
; andere Sortierfunktion für die Listview verknüpfen
GUICtrlRegisterListViewSort(-1, _myCompare)
; ListView füllen (fürs Beispiel)
For $i = 0 To UBound($aListViewData) -1
GUICtrlCreateListViewItem($aListViewData[$i][0] & "|" & $aListViewData[$i][1] & "|" & $aListViewData[$i][2] & "|" & $aListViewData[$i][3], $idListView)
Next
; Display the GUI.
GUISetState(@SW_SHOW, $hGUI)
; Endlosschleife um GUI am Leben zu halten
While Sleep(100)
WEnd
Func raus()
Exit
EndFunc
; wird ausgeführt wenn man mit dem ListView interagiert
Func _cb_lv_clicked()
$g_bSet = False
$g_iCurCol = $g_iCol
GUICtrlSendMsg($idListView, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($idListView), 0)
EndFunc
; eigene Vergleichsfunktion für die ListView-Sortierung
Func _myCompare($iControlID, $iA, $iB, $iColumn)
; Switch the sorting direction
If $iColumn = $g_iCurCol Then
If Not $g_bSet Then
$g_iSortDir *= -1
$g_bSet = True
EndIf
Else
$g_iSortDir = 1
EndIf
$g_iCol = $iColumn
; Werte der aktuellen Listviewelemente holen
Local $sA = GetSubItemText($iControlID, $iA, $iColumn)
Local $sB = GetSubItemText($iControlID, $iB, $iColumn)
; Größenvergleich zweier Elemente per Natural Compare
Return __ap_cb_comp_Natural($sA, $sB) * $g_iSortDir
EndFunc
; Retrieve the text of a listview item in a specified column
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
Alles anzeigen