ListView Problem

  • Hey zusammen

    Ich habe irgendwie einen komigen Fehler, da er eigentlich dies hier in der richtigen Reihenfolge machen müsste.
    Sprich: test3,test2,test1

    Mein Skript sortiert es aber falsch... :

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    guicreate("test",100,100)
    $tray=GUICtrlCreateList("",0,0,100,60)
    GUISetState()

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

    dim $array[3]=["test1","test3","test2"]
    $array=_ArraySortByString($array,"test3")
    GUICtrlSetData($tray,"")
    For $i=0 To UBound($array)-1
    ConsoleWrite($array[$i]&"|")
    GUICtrlSetData($tray,$array[$i]&"")
    Next

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

    Sleep(5000)

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

    Func _ArraySortByString($array,$func)
    Dim $return[1]=[""]
    _ArraySort($array)
    For $i=0 To UBound($array)-1
    $array=_ArrayShiftLeft($array)
    If StringInStr($func,$array[0]) Then $return=$array
    Next
    Return $return
    EndFunc

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

    Func _ArrayShiftLeft($array)
    $z=UBound($array)
    Dim $return[$z]
    For $i=0 To $z-1
    If $i-1<0 Then
    $u=$z-1
    Else
    $u=$i-1
    EndIf
    $return[$u]=$array[$i]
    Next
    Return $return
    EndFunc

    [/autoit]

    Thx4Help

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von Antispeed (6. Juli 2010 um 12:21)

  • Wenn du keine Stile setzen willst dann halt 0. Ansonsten hinschreiben und wenn du mehrer haben willst BitOR.

  • Hier ein Vorschlag für die _ArrayShiftLeft

    [autoit]


    Func _ArrayShiftLeft($array)
    $z=UBound($array)
    Dim $return[$z]
    For $i=0 to $z-1
    $return[mod($i+$z-1, $z)]=$array[$i]
    Next
    Return $return
    EndFunc

    [/autoit]

    Außerdem stimmt hier, glaub ich, etwas an der Logig nicht. Du machst Arraysort,

    [autoit]


    Func _ArraySortByString($array,$func)
    Dim $return[1]=[""]
    _ArraySort($array)
    _ArrayDisplay($array)
    For $i=0 To UBound($array)-1
    $array=_ArrayShiftLeft($array)
    If StringInStr($func,$array[0]) Then $return=$array
    Next
    Return $return
    EndFunc

    [/autoit]


    was dazu führt, dass die Elemente in der Reihenfolge test1, test2, test3 vorliegen. Durch einfaches Rotieren nach Links, bekommst du niemals eine Umgekehrte Reihenfolge test3, test2, test1. Du brichst die Rotation ab, wenn im array als erstes element test3 steht, aber die Reihenfolge in diesem Moment ist test3, test1, test2 - niemals test3, test2, test1.
    Nun, wenn du $tray=GUICtrlCreateList("",0,0,100,60,0) definierst, erfolgt im ListView keine Sortierung und somit die Reihenfolge test3, test1, test2.

    Falls du das Array rein nur umkehren möchtest, dann benutze die Funktion _ArrayReverse()