ListView sortieren

  • Guten Morgen.

    Ich habe ein kleines Problem beim Sortieren einer ListView. Darin stehen Schulklassen, und diese will ich dann nach Jahrgang sortieren.
    Mit dem Befehl _GUICtrlListView_SimpleSort() funktioniert das auch ganz gut. Bloß wird dann zB die 10b über die 5a gestellt, weil die erste Ziffer
    kleiner ist. Aber es wäre besser wenn das Programm nach ganzen Jahrgängen sortiert. Gibt es einen Befehl, der nach diesen Kriterien sortiert? Oder muss man jede Klasse einzeln überprüfen, und dann in der Liste hoch, bzw. runter schieben?

    Hier ist noch der Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;Dateipfad
    $file = @ScriptDir & "\data\class.ini"

    [/autoit] [autoit][/autoit] [autoit]

    #region ##### START GuiCreate section #####
    $hGui = GUICreate("Klassen editieren", 450, 300)

    [/autoit] [autoit][/autoit] [autoit]

    ;Erstellt Liste
    $LblKlasse = GUICtrlCreateLabel("Aktuelle Klassen: ", 8, 8)
    $Liste = GUICtrlCreateListView("Klasse|Schülerzahl", 8, 30, 250, 250)
    _GUICtrlListView_SetColumnWidth($Liste, 0, 100)
    _GUICtrlListView_SetColumnWidth($Liste, 1, 146)

    [/autoit] [autoit][/autoit] [autoit]

    ;Buttons
    $BtnBestaetigen = GUICtrlCreateButton("Bestätigen", 315, 265, 130, 30)
    $BtnSortieren = GUICtrlCreateButton("Sortieren", 145, 3, 100, 25)

    [/autoit] [autoit][/autoit] [autoit]

    ;Gruppe "Neue Klasse"
    $GruppeNeueKlasse = GUICtrlCreateGroup("Neue Klasse", 290, 8, 150, 93)
    $LblNeueKlasse = GUICtrlCreateLabel("Klasse: ", 300, 32)
    $InputNeueKlasse = GUICtrlCreateInput("", 350, 28)
    $BtnNeueKlasse = GUICtrlCreateButton("Erstellen", 300, 65, 130, 30)

    [/autoit] [autoit][/autoit] [autoit]

    ;Gruppe "Klasse löschen"
    $GruppeKlasseLoeschen = GUICtrlCreateGroup("Klasse löschen", 290, 110, 150, 93)
    $LblKlasseLoeschen = GUICtrlCreateLabel("Markieren Sie eine Klasse und" &@CRLF& "klicken Sie auf den Button" &@CRLF& "um diese zu löschen.", 296, 125)
    $BtnKlasseLoeschen = GUICtrlCreateButton("Löschen", 300, 167, 130, 30)

    [/autoit] [autoit][/autoit] [autoit]

    ;Füllt die Liste mit Klassen die schon existieren
    if FileExists($file) Then
    Local $array = IniReadSection($file, "Klassen")
    if not @error Then
    for $i = 1 To $array[0][0]
    $sTmp = IniRead($file, "Klassen", $array[$i][0], "mungo")
    $text = $array[$i][0] & "|" & $sTmp
    GUICtrlCreateListViewItem($text, $Liste)
    next
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    #endregion ##### END GuiCreate section #####
    ;END GuiCreate section

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Hauptschleife
    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    case $GUI_EVENT_CLOSE
    _KlasseSortieren()
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnNeueKlasse
    _KlasseErstellen($InputNeueKlasse)
    GUICtrlSetData($InputNeueKlasse, "")

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnKlasseLoeschen
    _KlasseLoeschen()

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnSortieren
    _KlasseSortieren()

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnBestaetigen
    _KlasseSortieren()
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _KlasseErstellen($input)
    ;Schreibt die Klasse in eine Ini-Datei
    $input = GUICtrlRead($input)
    IniWrite($file, "Klassen", $input, 0)
    $text = $input & "|" & IniRead($file, "Klassen", $input, "")

    [/autoit] [autoit][/autoit] [autoit]

    ;Fügt die Klasse zur Liste hinzu
    GUICtrlCreateListViewItem($text, $Liste)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==> _KlasseErstellen($InputNeueKlasse)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _KlasseLoeschen()
    ;Löscht die Klasse aus der Ini-Datei
    $sTmp = _GUICtrlListView_GetItemTextString($Liste)
    $key = StringSplit($sTmp,"|")
    IniDelete($file, "Klassen", $key[1])

    [/autoit] [autoit][/autoit] [autoit]

    ;Löscht die Klasse aus der Liste
    GUICtrlDelete(GUICtrlRead($Liste))

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==> _KlasseLoeschen()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _KlasseSortieren()
    ;Sortieren der Liste
    Local $vDescending[_GUICtrlListView_GetColumnCount($Liste)]
    _GUICtrlListView_SimpleSort($Liste, $vDescending, 0)

    [/autoit] [autoit][/autoit] [autoit]

    ;Alte Ini-Datei löschen
    IniDelete($file, "Klassen")

    [/autoit] [autoit][/autoit] [autoit]

    ;Neue Ini-Datei erstellen (aus Daten der ListView)
    Local $iCount = _GUICtrlListView_GetItemCount($Liste)
    Local $iColumn = _GUICtrlListView_GetColumnCount($Liste)
    Local $aListData[$iCount+1][$iColumn]
    $aListData[0][0] = $iCount
    for $i = 1 To $iCount
    $aTmp = _GUICtrlListView_GetItemTextArray($Liste, $i - 1)
    IniWrite($file, "Klassen", $aTmp[1], $aTmp[2])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==> _KlasseSortieren()

    [/autoit]

    Mfg

    Einmal editiert, zuletzt von Kasey (7. Juli 2012 um 18:03)

  • Danke für die Antwort :)
    Aber irgendwie steh ich grad auf dem Schlauch. Ich hab mir jetzt eine Funktion gebastelt, die zumindest die ersten beden Einträge der Liste sortieren sollte, aber selbst das funktioniert nicht. Ich glaub ich hab die Funktion irgendwie falsch aufgerufen, deshalb passiert nichts.
    Es wäre schön, wenn mir nochmal jemand helfen könnte.

    Hier nochmal der Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GUIListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;Dateipfad
    $file = @ScriptDir & "\data\class.ini"

    [/autoit] [autoit][/autoit] [autoit]

    #region ##### START GuiCreate section #####
    $hGui = GUICreate("Klassen editieren", 450, 300)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Erstellt Liste
    $LblKlasse = GUICtrlCreateLabel("Aktuelle Klassen: ", 8, 8)
    $Liste = GUICtrlCreateListView("Klasse|Schülerzahl", 8, 30, 250, 250)
    _GUICtrlListView_SetColumnWidth($Liste, 0, 100)
    _GUICtrlListView_SetColumnWidth($Liste, 1, 146)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Buttons
    $BtnBestaetigen = GUICtrlCreateButton("Bestätigen", 315, 265, 130, 30)
    $BtnSortieren = GUICtrlCreateButton("Sortieren", 145, 3, 100, 25)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Gruppe "Neue Klasse"
    $GruppeNeueKlasse = GUICtrlCreateGroup("Neue Klasse", 290, 8, 150, 93)
    $LblNeueKlasse = GUICtrlCreateLabel("Klasse: ", 300, 32)
    $InputNeueKlasse = GUICtrlCreateInput("", 350, 28)
    $BtnNeueKlasse = GUICtrlCreateButton("Erstellen", 300, 65, 130, 30)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Gruppe "Klasse löschen"
    $GruppeKlasseLoeschen = GUICtrlCreateGroup("Klasse löschen", 290, 110, 150, 93)
    $LblKlasseLoeschen = GUICtrlCreateLabel("Markieren Sie eine Klasse und" &@CRLF& "klicken Sie auf den Button" &@CRLF& "um diese zu löschen.", 296, 125)
    $BtnKlasseLoeschen = GUICtrlCreateButton("Löschen", 300, 167, 130, 30)

    [/autoit] [autoit][/autoit] [autoit]

    ;Füllt die Liste mit Klassen die schon existieren
    if FileExists($file) Then
    Local $array = IniReadSection($file, "Klassen")
    if not @error Then
    for $i = 1 To $array[0][0]
    $sTmp = IniRead($file, "Klassen", $array[$i][0], "mungo")
    $text = $array[$i][0] & "|" & $sTmp
    GUICtrlCreateListViewItem($text, $Liste)
    next
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICtrlRegisterListViewSort($BtnSortieren, "_LVSort")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    #endregion ##### END GuiCreate section #####
    ;END GuiCreate section

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Hauptschleife
    while 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    case $GUI_EVENT_CLOSE
    _KlasseSortieren()
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnNeueKlasse
    _KlasseErstellen($InputNeueKlasse)
    GUICtrlSetData($InputNeueKlasse, "")

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnKlasseLoeschen
    _KlasseLoeschen()

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnSortieren
    _LVSort($Liste, 0)
    _KlasseSortieren()

    [/autoit] [autoit][/autoit] [autoit]

    case $BtnBestaetigen
    _KlasseSortieren()
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _KlasseErstellen($input)
    ;Schreibt die Klasse in eine Ini-Datei
    $input = GUICtrlRead($input)
    IniWrite($file, "Klassen", $input, 0)
    $text = $input & "|" & IniRead($file, "Klassen", $input, "")

    [/autoit] [autoit][/autoit] [autoit]

    ;Fügt die Klasse zur Liste hinzu
    GUICtrlCreateListViewItem($text, $Liste)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==> _KlasseErstellen($InputNeueKlasse)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _KlasseLoeschen()
    ;Löscht die Klasse aus der Ini-Datei
    $sTmp = _GUICtrlListView_GetItemTextString($Liste)
    $key = StringSplit($sTmp,"|")
    IniDelete($file, "Klassen", $key[1])

    [/autoit] [autoit][/autoit] [autoit]

    ;Löscht die Klasse aus der Liste
    GUICtrlDelete(GUICtrlRead($Liste))

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==> _KlasseLoeschen()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _KlasseSortieren()
    ;Sortieren der Liste

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Alte Ini-Datei löschen
    IniDelete($file, "Klassen")

    [/autoit] [autoit][/autoit] [autoit]

    ;Neue Ini-Datei erstellen (aus Daten der ListView)
    Local $iCount = _GUICtrlListView_GetItemCount($Liste)
    Local $iColumn = _GUICtrlListView_GetColumnCount($Liste)
    Local $aListData[$iCount+1][$iColumn]
    $aListData[0][0] = $iCount
    for $i = 1 To $iCount
    $aTmp = _GUICtrlListView_GetItemTextArray($Liste, $i - 1)
    IniWrite($file, "Klassen", $aTmp[1], $aTmp[2])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==> _KlasseSortieren()

    [/autoit] [autoit][/autoit] [autoit]

    func _LVSort($ListViewID, $Column)
    $sTmp = _GUICtrlListView_GetItemText($ListViewID, 0)
    $Split = StringSplit($sTmp, "")
    $zahl1 = ""
    for $i = 1 To UBound($Split) - 1
    if (Asc($Split[$i]) < 58) and (Asc($Split[$i]) > 47) Then
    $zahl1 &= $Split[$i]
    Else
    $buchst1 = $Split[$i]
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $sTmp = _GUICtrlListView_GetItemText($ListViewID, 1)
    $Split = StringSplit($sTmp, "")
    $zahl2 = ""
    for $i = 1 To UBound($Split) - 1
    if (Asc($Split[$i]) < 58) and (Asc($Split[$i]) > 47) Then
    $zahl2 &= $Split[$i]
    Else
    $buchst2 = $Split[$i]
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $result = 0

    [/autoit] [autoit][/autoit] [autoit]

    if $zahl1 < $zahl2 Then
    $result = 1
    ElseIf $zahl2 < $zahl1 Then
    $result = -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $result

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==> _LVSort()

    [/autoit]

    Mfg

  • schau dir die Hilfe zu

    [autoit]

    _GUICtrlListView_RegisterSortCallBack

    [/autoit]

    an. Da du damit über den Parameter $fNumbers auch nach Zahlen sortieren kannst sollte es auch ohne eigene Sortierroutine klappen,

    mfg autoBert

    2 Mal editiert, zuletzt von autoBert (5. Juli 2012 um 23:01)

    • Offizieller Beitrag

    @Kassev, du benutzt GUICtrlRegisterListViewSort falsch.

    [autoit]


    GUICtrlRegisterListViewSort($BtnSortieren, "_LVSort")

    [/autoit]


    Du mußt dein Listview als CtrlId benutzen und nicht das CtrlId des Buttons. ;)

    autoBert, ich verstehe nicht ganz worauf du hinaus willst. Bei was willst du $fNumbers benutzen? Beim CallBack Aufruf.
    Btw, editiere mal bitte deinen Beitrag, da waren die Finger wohl etwas zu langsam oder en Knoten drin. ;)

  • autoBert, ich verstehe nicht ganz worauf du hinaus willst. Bei was willst du $fNumbers benutzen? Beim CallBack Aufruf.


    Dieser Parameter ist sogar Standard.

    @Kasey: ich habe mal in das Hilfebeispiel Klassennamen in die erste Spalte eingegeben und es funktioniert wie vermutet:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hListView

    [/autoit] [autoit][/autoit] [autoit]

    _Example1()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Example1()
    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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("ListView Register Sort Callback", 300, 200)

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    ; Load 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($hListView, $hImage, 1)

    [/autoit] [autoit][/autoit] [autoit]

    _AddRow($hListView, "7A|666|10.05.2004", $aIcons)
    _AddRow($hListView, "3D|444|11.05.2005", $aIcons, 1)
    _AddRow($hListView, "3C|5525|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "6C|5535|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "6b|5255|12.05.2004", $aIcons, 2)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_RegisterSortCallBack($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $hListView
    ; Kick off the sort callback
    _GUICtrlListView_SortItems($hListView, GUICtrlGetState($hListView))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_UnRegisterSortCallBack($hListView)
    GUIDelete()
    EndFunc ;==>_Example1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    mfg autoBert

    • Offizieller Beitrag

    Hast du schon mal ausprobiert ob $fNumbers bei einem String richtig funktioniert, wenn er sowohl Zahlen als auch Buchstaben enthällt?

    EDIT: Hat sich erledigt, hast du ja direkt drunter im Beispiel :whistling:

  • Danke für die zahlreichen Antworten. Aber ich bin irgendwie zu blöd um mir daraus die Lösung für mein Problem herzuleiten. Ich habe mir jetzt schon zahllose Sortierfunktionen angesehen. Aber keine arbeitet so, wie ich es gerne hätte. Oder ich bin zu doof um sie richtig einzusetzen.
    Ich habe es mittlerweile auch aufgegeben die Sortierfunktion auf einen Button zu legen, da es per Klick auf die Spalten doch einfacher geht.

    autoBert:
    Die Funktion läuft mit deinen Beispiel super. Aber das Problem, welches mich schon die ganze Zeit plagt, sind die zweistelligen Jahrgangsstufen (zB 10b, 11a). Denn wenn man diese in deine Funktion noch einfügt, werden diese dann falsch einsortiert.
    Siehe an diesem Beispiel:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hListView

    [/autoit] [autoit][/autoit] [autoit]

    _Example1()

    [/autoit] [autoit][/autoit] [autoit]

    Func _Example1()
    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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("ListView Register Sort Callback", 300, 200)

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    ; Load 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($hListView, $hImage, 1)

    [/autoit] [autoit][/autoit] [autoit]

    _AddRow($hListView, "7A|666|10.05.2004", $aIcons)
    _AddRow($hListView, "3D|444|11.05.2005", $aIcons, 1)
    _AddRow($hListView, "3C|5525|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "6C|5535|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "6b|5255|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "10b|5255|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "10a|5255|12.05.2004", $aIcons, 2)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_RegisterSortCallBack($hListView)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $hListView
    ; Kick off the sort callback
    _GUICtrlListView_SortItems($hListView, GUICtrlGetState($hListView))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_UnRegisterSortCallBack($hListView)
    GUIDelete()
    EndFunc ;==>_Example1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    Auch mit dem Beispiel aus der Funktion

    [autoit]

    _GuiCtrlListView_RegisterSortCallBack

    [/autoit]


    funktioniert es nicht, wie ich es möchte.

    Siehe Hier:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hListView, $hListView2

    [/autoit] [autoit][/autoit] [autoit]

    _Example2()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Example2()
    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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("ListView: Sortieren (Behandelt Zahlen als Strings)", 450, 200, 100)

    [/autoit] [autoit][/autoit] [autoit]

    $hListView = GUICtrlCreateListView("Spalte 1|Spalte 2|Spalte 3", 10, 10, 430, 180, -1, $iExWindowStyle)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, $iExListViewStyle)

    [/autoit] [autoit][/autoit] [autoit]

    ; Lädt die Bilder
    $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($hListView, $hImage, 1)

    [/autoit] [autoit][/autoit] [autoit]

    _AddRow($hListView, "10b|000666|10.05.2004", $aIcons)
    _AddRow($hListView, "5a|444|11.05.2005", $aIcons, 1)
    _AddRow($hListView, "5b|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "5c|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "7a|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "7b|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView, "7c|555|12.05.2004", $aIcons, 2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("ListView: Sortieren (Behandelt Zahlen als Ziffern)", 400, 200, 560)

    [/autoit] [autoit][/autoit] [autoit]

    $hListView2 = GUICtrlCreateListView("Spalte 1|Spalte 2|Spalte 3", 10, 10, 380, 180, -1, $iExWindowStyle)
    _GUICtrlListView_SetExtendedListViewStyle($hListView2, $iExListViewStyle)
    _GUICtrlListView_SetImageList($hListView2, $hImage, 1)

    [/autoit] [autoit][/autoit] [autoit]

    _AddRow($hListView2, "10b|000666|10.05.2004", $aIcons)
    _AddRow($hListView2, "5a|444|11.05.2005", $aIcons, 1)
    _AddRow($hListView2, "5b|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView2, "5c|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView2, "7a|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView2, "7b|555|12.05.2004", $aIcons, 2)
    _AddRow($hListView2, "7c|555|12.05.2004", $aIcons, 2)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_RegisterSortCallBack($hListView, False)
    _GUICtrlListView_RegisterSortCallBack($hListView2)
    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_UnRegisterSortCallBack($hListView)
    _GUICtrlListView_UnRegisterSortCallBack($hListView2)
    GUIRegisterMsg($WM_NOTIFY, "")
    EndFunc ;==>_Example2

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $hWndListView2

    [/autoit] [autoit][/autoit] [autoit]

    $hWndListView = $hListView
    $hWndListView2 = $hListView2
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    If Not IsHWnd($hListView2) Then $hWndListView2 = GUICtrlGetHandle($hListView2)

    [/autoit] [autoit][/autoit] [autoit]

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iCode = DllStructGetData($tNMHDR, "Code")

    [/autoit] [autoit][/autoit] [autoit]

    Switch $hWndFrom
    Case $hWndListView, $hWndListView2
    Switch $iCode
    Case $LVN_COLUMNCLICK ; Eine Spalte wurde angeklickt
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)

    [/autoit] [autoit][/autoit] [autoit]

    ; Anstoßen der Callback-Sortierfunktion
    _GUICtrlListView_SortItems($hWndFrom, DllStructGetData($tInfo, "SubItem"))
    ; Kein Rückgabewert
    EndSwitch
    EndSwitch
    Return $__LISTVIEWCONSTANT_GUI_RUNDEFMSG
    EndFunc ;==>_WM_NOTIFY

    [/autoit]

    Mit dieser Funktion.. ähm.. "sortiert" das Programm die Einträge komplett durcheinander!?

    Ich hätte gerne, dass die Einträge wenn möglich so sortiert werden:

    Spoiler anzeigen

    5a
    5b
    5c
    6a
    6b
    6c
    7a
    7b
    7c
    8a
    8b
    8c
    9a
    9b
    9c
    10a
    10b
    10c
    11a
    11b
    ...

    Vielen Dank für eure Hilfe

    Mfg Kasey

  • Hier mal eine mögliche Lösung.
    Ich persönlich arbeite sehr gerne mit "GUICtrlRegisterListViewSort", da man so die Sortierfunktion leicht selbst anpassen kann.

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <HeaderConstants.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Guilistview.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <SendMessage.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; nuts (http://www.autoit.de)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $nSortDir = 1
    #Region ### START Koda GUI section ### Form=
    Global $Form1 = GUICreate("Form1", 633, 544, 193, 125)
    Global $ListView1 = GUICtrlCreateListView("0|1|2|3|5", 48, 16, 521, 385)
    GUICtrlRegisterListViewSort(-1, "_LVSort")
    Global $hLVHandle = GUICtrlGetHandle($ListView1)
    _GUICtrlListView_SetColumn($hLVHandle, 0, "Text", 75, 1)
    _GUICtrlListView_SetColumn($hLVHandle, 1, "Nummer", 75, 1)
    _GUICtrlListView_SetColumn($hLVHandle, 2, "Datum1", 125, 1)
    _GUICtrlListView_SetColumn($hLVHandle, 3, "Datum2", 125, 1)
    _GUICtrlListView_SetColumn($hLVHandle, 4, "Klassen", 100, 1)
    Global $Button1 = GUICtrlCreateButton("Test", 216, 448, 177, 49, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Global $a_klassen[4]=["a", "b", "c", "d"]
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 9
    $temp = Random(1, 31, 1)
    If $temp < 10 Then $temp = "0" & $temp

    [/autoit] [autoit][/autoit] [autoit]

    $randomarray=$a_klassen[Random(1,3,1)]
    $randomklassen=Random(1,10,1)
    $klassen=$randomklassen&$randomarray
    GUICtrlCreateListViewItem("ABC|" & Random(1, 10050, 1) & "|2010\02\" & $temp & "|" & $temp & ".02.2010|" &$klassen , $ListView1)
    $randomarray=$a_klassen[Random(1,3,1)]
    $randomklassen=Random(1,10,1)
    $klassen=$randomklassen&$randomarray
    GUICtrlCreateListViewItem("DDC|" & Random(1, 10050, 1) & "|2011\03\" & $temp & "|" & $temp & ".03.2011|"&$klassen, $ListView1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Global $hSORTCALLBACK = DllCallbackRegister("_LV_SortCallback", "Handle", "LPARAM;LPARAM;LPARAM")
    Global $pSORTCALLBACK = DllCallbackGetPtr($hSORTCALLBACK)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    DllCallbackFree($hSORTCALLBACK)
    Exit
    Case $Button1
    ;sortiere nach col 2
    _LV_SortColumn($ListView1, $pSORTCALLBACK, 2)
    $nSortDir = $nSortDir * - 1
    Case $ListView1
    ; DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hLVHandle, "int", 0, "int", 1)
    $nSortDir = $nSortDir * - 1
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _LV_SortColumn($idLV, $pCallbackProc, $iCol)
    ; Der Spaltenindex wird 1-basiert erwartet !!!
    Local $Result = GUICtrlSendMsg($idLV, $LVM_SORTITEMS, $iCol - 1, $pCallbackProc)
    Return $Result
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _LV_SortCallback($Item1, $Item2, $Col)
    Return _LVSort($ListView1, $Item1, $Item2, $Col)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Sort_byKlassen($item1, $Item2)

    [/autoit] [autoit][/autoit] [autoit]

    local $ret=0
    local $asplit_item1=StringRegExp($item1, '(\d*)(\D*)',1) ;zahl und buchstabe trennen
    local $asplit_item2=StringRegExp($item2, '(\d*)(\D*)',1) ;zahl und buchstabe trennen

    [/autoit] [autoit][/autoit] [autoit]

    ; _ArrayDisplay($asplit_item1) ;debug
    ; die eigentliche sortierfunktion
    ; zuerst nach zahlen und falls nötig nach buchstaben
    ;
    if Number($asplit_item1[0]) < Number($asplit_item2[0]) then
    $ret = -1
    elseif Number($asplit_item1[0]) > Number($asplit_item2[0]) then
    $ret = 1
    else
    if $asplit_item1[1] < $asplit_item2[1] Then
    $ret = -1
    elseif $asplit_item1[1] > $asplit_item2[1] then
    $ret=1
    endif

    [/autoit] [autoit][/autoit] [autoit]

    endif

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    return $ret
    endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $item1 < $item2 Then
    $ret = -1
    ElseIf $item1 > $item2 Then
    $ret = 1

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $ret
    EndFunc ;==>_Sort_byString

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;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

    [/autoit] [autoit][/autoit] [autoit]

    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)
    Local $val1, $val2, $nResult

    [/autoit] [autoit][/autoit] [autoit]

    $val1 = GetSubItemText($hWnd, $nItem1, $nColumn)
    $val2 = GetSubItemText($hWnd, $nItem2, $nColumn)

    [/autoit] [autoit][/autoit] [autoit]

    ;ConsoleWrite($val1 & " | "& $val2 & " | $val1 < $val2"&@CRLF) ;debug

    [/autoit] [autoit][/autoit] [autoit]

    $nResult = 0

    [/autoit] [autoit][/autoit] [autoit]

    Switch $nColumn

    [/autoit] [autoit][/autoit] [autoit]

    case 4
    $nResult = _Sort_byKlassen($val1, $val2)

    [/autoit] [autoit][/autoit] [autoit]

    Case 3
    $nResult = _Sort_byDate($val1, $val2)
    Case 2

    [/autoit] [autoit][/autoit] [autoit]

    $nResult = _Sort_byDate($val1, $val2, "\", 1)
    Case 1
    $nResult = _Sort_byNumber($val1, $val2)
    Case 0
    $nResult = _Sort_byString($val1, $val2)

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    $nResult = $nResult * $nSortDir
    Return $nResult

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($stLvfi, 1, $LVFI_PARAM)
    DllStructSetData($stLvfi, 3, $nItemID)

    [/autoit] [autoit][/autoit] [autoit]

    $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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Return $sItemText
    EndFunc ;==>GetSubItemText

    [/autoit]