Wie sortiere ich mein ListView

  • Hallo AutoIt3-Experten!

    Ich habe ein GUI mit 3 verschiedenen ListView. Ich würde gerne die Items sortieren, falls auf eine Spalte gedrückt wird, weiß aber nicht wie, hab vergeblich mit den ganzen Sort-Funktionen herumprobiert aber keine konnte ich richtig verwenden.

    Ich muss die ListView wissen, die gedrückt würde und die Spalte. Mit welchem kleinen Script kann ich in einem GUI-System ohne $msg meine Sortierung erfolgreich abschließen?


    [autoit]

    Func SortList() _GUICtrlListView_SimpleSort($ListID,$B_DESCENDING1,$col) EndFunc

    [/autoit]

    2. WIe kann ich nach mehreren SPalten sortieren quasi Hauptsortierung nach der 1., bei gleichen Werten nach der 2. usw...

    3. Wie kann ich hier im Forum den Autoit-Code mit Leerzeilen hinzufügen, bei 'Absenden' fügt der das immer in eine Zeile zusammen.

    3 Mal editiert, zuletzt von Manuel1948 (31. März 2011 um 23:46)

    • Offizieller Beitrag

    Zu 1: Wo ist dein Code? Wir haben keine Ahnung wie du die Funktion aufrufst oder ob Variablen richtig definiert sind.
    Das ist ein Ratespiel und ein Verweis auf die Hilfe bringt dir nichts.
    Zu 2: Geht Standardmäßig gar nicht, dazu müßtest du eine eigene Sortierfunktion schreiben.
    Zu 3: Nimm einen andern Browser, das liegt daran.

  • [autoit]

    $Alles = GUICtrlCreateTabItem("Alles")
    $ListView1 = GUICtrlCreateListView("Supplierlehrer|Datum|Stunde|Klasse|Supplierfach|Raum|Lehrer|Art", 0, 16, 660, 235)
    GUICtrlRegisterListViewSort(-1,"SortList")
    $Suppliertes = GUICtrlCreateTabItem("Suppliertes")
    $ListView2 = GUICtrlCreateListView("Supplierlehrer|Datum|Stunde|Klasse|Supplierfach|Raum|Lehrer|Art", 0, 16, 660, 235)
    GUICtrlRegisterListViewSort(-1,"SortList")
    $Entfallenes = GUICtrlCreateTabItem("Entfallenes")
    $ListView3 = GUICtrlCreateListView("Supplierlehrer|Datum|Stunde|Klasse|Supplierfach|Raum|Lehrer|Art", 0, 16, 660, 235)
    GUICtrlRegisterListViewSort(-1,"SortList")

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

    Global $B_DESCENDING1[_GUICtrlListView_GetColumnCount($ListView1)]
    Global $B_DESCENDING2[_GUICtrlListView_GetColumnCount($ListView2)]
    Global $B_DESCENDING3[_GUICtrlListView_GetColumnCount($ListView3)]

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

    Func SortList($ListID,$param1,$param2,$col)
    Switch($ListID)
    Case $ListView1
    _GUICtrlListView_SimpleSort($ListView1,$B_DESCENDING1,$col)
    Case $ListView2
    _GUICtrlListView_SimpleSort($ListView2,$B_DESCENDING2,$col)
    Case $ListView3
    _GUICtrlListView_SimpleSort($ListView3,$B_DESCENDING3,$col)
    EndSwitch
    EndFunc

    [/autoit]

    Sobald ich jetzt nun eine Spalte anklicke, sortiert er die ganze Zeit die Spalte absteigend,aufsteigend,absteigen,... und das brauch gut 50% CPU Auslastung.
    Es könnte sein das die Funktion GUICtrlRegisterListViewSort dazu da ist jedesmal eine spezielle FUnktion aufzurufen, wenn die Sortierung geändert wird, aber wier frag ich dann nur auf Spaltenklick ab?

    • Offizieller Beitrag

    Warum dein Listview an einer Tour sortiert wird, kann ich dir auch nicht sagen, weil ich nicht weiß wie du die Sortierung auslöst.
    Aus dem Codefetzen ist das nicht ersichtlich und ist weiterhin ein Rätselraten....

  • Mensch jetzt lügst du aber...
    Ein Klick löst die Sortierung aus mittels dieser FUnktion
    GUICtrlRegisterListViewSort(-1,"SortList")

    Ich weiß ja nicht wie ich die Sortierfunktion aufrufen soll, das ist ja meine eigentliche Frage...

    • Offizieller Beitrag

    Denkst du ich habe die Zeit und die Lust mir um deinen Codefetzen herum eine GUI zu bauen nur um dir zu helfen?
    Wenn du nicht den ganzen Code posten willst, dann hilf dir selbst. Ich bin jetzt raus, muß mich doch net als Lügner betiteln lassen.

  • Nein du sollst kein GUI bauen, schon seit 5 Post verusche ich mitzuteilen das mir lediglich eine Funktion fehlt, dacht hier wird mir so geholfen wie immer, aber anscheinend stimmt i-was heute nicht.

  • Für was willst du ein GUI bauen, um mir eine einzelen Funktion zu verraten?

    • Offizieller Beitrag
    Zitat

    Nein du sollst kein GUI bauen, schon seit 5 Post verusche ich mitzuteilen das mir lediglich eine Funktion fehlt, dacht hier wird mir so geholfen wie immer, aber anscheinend stimmt i-was heute nicht.


    Du kapierst nix, um das dumme Verhalten deines Script zu erklären, müßte man es schon laufen lassen. Ergo, es braucht eine GUI aussenrum.
    Es gibt ja scheinbar Leute die denken wir haben alle zu viel in die Glaskugel geschaut und können alles anhand von Codeschnipseln weissagen.

    Aber des hat sich ja erledigt, da du alle deine Posts gelöscht hast . Für mich heißt das mal wieder Zeit verschwendet und ein
    Kandidat mehr für meine Ignoreliste.

    Für das löschen deiner Posts nur aus bockigkeit, sollte man dir in den Hintern treten. Was ist denn das für eine Art?
    Ich helfe ja eigentlich jedem, aber bei so einem beschissenen Verhalten überleg ich mir in Zukunft 2 mal ob ich überhaupt helfe.

  • Hier mal ein Beispiel:

    Spoiler anzeigen
    [autoit]


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

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

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

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

    Global $Button1 = GUICtrlCreateButton("Test", 216, 448, 177, 49, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    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)

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

    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

    [/autoit] [autoit][/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)

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

    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 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]

    Was mich in dem Zusammenhang interessieren würde:
    Wie kann ich die Sortierfunktion außer durch einen Mausklick auslösen?

    • Offizieller Beitrag

    Ich finde es mal wieder berauschend, welche Faulheit einige User an den Tag legen. :thumbdown:
    Sollen wir dir vielleicht noch ein Nußtörtchen backen?!
    10 Sekunden Aufwand bringen dir detaillierte und vollständige Skriptlösungen, ohne dass du User des Forums beleidigen musst!!

  • Danke aber ich arbeite mit GUISetOnEvent=1 und habe dafür schon eine Lösung gefunden.

    Ich habe die Beiträge wiederhergestellt.

    @Manuel1948: Was soll diese Löschaktion? Dadurch gehen sämtliche Bezüge verloren.

    Ganz einfach, da ich keine "hilfe" mehr wollte/brauchte wollte ich den Beitrag komplett löschen, aber da dies nicht ging, habe ich halt alle Post gelöscht.


    Du kapierst nix, um das dumme Verhalten deines Script zu erklären, müßte man es schon laufen lassen. Ergo, es braucht eine GUI aussenrum.
    Es gibt ja scheinbar Leute die denken wir haben alle zu viel in die Glaskugel geschaut und können alles anhand von Codeschnipseln weissagen.

    Aber des hat sich ja erledigt, da du alle deine Posts gelöscht hast . Für mich heißt das mal wieder Zeit verschwendet und ein
    Kandidat mehr für meine Ignoreliste.

    Für das löschen deiner Posts nur aus bockigkeit, sollte man dir in den Hintern treten. Was ist denn das für eine Art?
    Ich helfe ja eigentlich jedem, aber bei so einem beschissenen Verhalten überleg ich mir in Zukunft 2 mal ob ich überhaupt helfe.

    Ich will ja nicht das verhalten meines Scirpt erklört bekommen, was ich dir auch schon 3 mal in den Posts bersucht habe mitzuteilen, aber vergebens. Ich wollte lediglich eine FUnktion wissen, mit der man das Sortieren schafft. Wenn du meinst du hast deine Zeit verschwendet, stimm ich dir zu, denn du hast ja auch nur mit mir geschimpft, dies und das. Von mir aus hilf mir halt nicht mehr, wenn du denkst es hat keinen Sinn.

    Ich finde es mal wieder berauschend, welche Faulheit einige User an den Tag legen. :thumbdown:
    Sollen wir dir vielleicht noch ein Nußtörtchen backen?!
    10 Sekunden Aufwand bringen dir detaillierte und vollständige Skriptlösungen, ohne dass du User des Forums beleidigen musst!!

    Das so eine Meldung i-wann kommen würde, war mir auch bewusst, denn das ist ja meistens gleich das Erste was man zu hören bekommt. Und du weißt überhaupt nicht wie lange ich vor meinem Thread hier in Google gesucht habe und viele Beispiele gefunden habe, jedoch ohne Erklärung bzw. Kompatiblität zu meinem Script (GUISetOnEvent=1). Und zweitens habe ich hier keinen beleidigt, denn "Lügner" war nicht als Beledigung gedacht, aber manche Leute fasen einfach alles als Beleidigung auf, deswegen wollt ich mich dafür entschuldigen.

    Von mir aus könnt ihr diesen Thread löschen, da ich eh selbst schon meine Lösung nach stundenlangem Ausprobieren gefunden habe und eine Diskussion dieser Art glaube ich keinem User hilft.

    • Offizieller Beitrag
    Zitat von Manuel1948

    Sobald ich jetzt nun eine Spalte anklicke, sortiert er die ganze Zeit die Spalte absteigend,aufsteigend,absteigen,... und das brauch gut 50% CPU Auslastung.


    Solche Fehlerbeschreibungen bekommt man und das Verhalten ist unerklärlich, da dein Codefetzen eigentlich keine Schleife oder dergleichen enthält.

    Zitat von Raupi

    Warum dein Listview an einer Tour sortiert wird, kann ich dir auch nicht sagen, weil ich nicht weiß wie du die Sortierung auslöst.
    Aus dem Codefetzen ist das nicht ersichtlich und ist weiterhin ein Rätselraten....

    Wenn ich darauf gleich angemacht werde, nur weil du nicht lesen kannst, ist es dein Problem.
    Dabei beziehe ich mich jetzt nicht auf diesen Thread sondern dein gemaule in der SB.

    Wollte eigentlich wissen warum das Scipt endlos sortiert, was aus dem Codefetzen nicht ersichtlich ist.
    Mit einem Lauffähigen Beispielcode wär es wahrscheinlich 10 Minuten Arbeit gewesen dein Problem zu lösen
    Scheinbar haben hier halbwissende immer Angst, das ihr Code verwendet wird, weil sie sich weigern ihn zu posten.
    Mir ist es doch scheißnochmal egal was im Script steht, weil mein Wissen bestimmt über dein Programmierkönnen hinausgeht.
    Dein vollständiges Script würde aber den Leuten helfen, die versuchen dir zu helfen.
    Warum eine Thema mit 3 Posts erledigen wenn man 5 Leute mehrer Tage beschäftigen kann?
    Z.Z. habe ich sowieso den Eindruck, das sich zu viele Leute auf ihren 5 Buchstaben ausruhen, nur weil hier im Forum die anderen für sie die Arbeit erledigen.