Listenfeld mittels klick Überschrift sortieren

  • Schau dir das Beispiel an. Da wird genau das gezeigt was du willst.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • _WM_NOTIFY wird durch folgende Zeile regestriert:

    AutoIt
    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")


    Sobald sie regestriert ist wartet sie auf Events und löst dann die Funktion _WM_NOTIFY aus.
    Folgende Zeilen prüfen dann ob es das richtige Control ($hWndFrom = $g_idListView) und das Richtige Event ist
    ($iCode = $LVN_COLUMNCLICK) und lösen dann die Sortierfunktion(_GUICtrlListView_SimpleSort) aus:


    Hier wird auf das "$LVN_COLUMNCLICK" Event vom Control "$g_idListView" gewartet, was dem Klicken auf die Spaltenüberschrift entspricht.
    Beim Googlen nach "WM_NOTIFY" wirst du auch folgendes finden was vielleicht zum Verständniss beiträgt:
    https://msdn.microsoft.com/en-us/library/…3(v=vs.85).aspx

  • Man könnte auch die Funktion etwas umschreiben...

    Sollte eigentlich dafür sorgen dass alle von dir erstellten "SysListView32" beim klicken auf den Title die Werte sortieren.

    Kannst ja mal ausprobieren ob es klappt, habe nicht die Zeit um es groß zu testen.
    Und viel einfacher als C&P geht es nun wirklich nicht mehr.

    mfg
    Zeitriss

  • Funkt leider nicht.

    Line 35

    Switch $iCode
    Switch ^ ERROR

    Error: Variable used without being declared

    • Offizieller Beitrag

    Die einfachste Variante ist wohl, die UDF-Funktion "_GUICtrlListView_RegisterSortCallBack" zu benutzen:

    Aufpassen muss man nur, wenn die zu sortierenden Daten nicht von links nach rechts sortiert werden sollen (wie z.B. beim Datum).
    In dem Fall muss man eine eigene Sortier-Funktion einbauen.

  • Ahh, mit der Variante von Oskar seh ich auch die Pfeilchen nun.

    Super, danke!

    Wie kann ich jetzt noch beim öffnen automatisch nach der ersten Spalte sortieren?

    2 Mal editiert, zuletzt von DerSchatten (17. Juni 2016 um 15:58)

  • Die Pfeile gibt es bei _GUICtrlListView_SimpleSort nicht benütze statdessen _GUICtrlListView_SortItems wie Oscar es
    gemacht hat.

    Edit:

    Wie kann ich jetzt noch beim öffnen automatisch nach der ersten Spalte sortieren?

    mit folgender Codezeile:

    AutoIt
    _GUICtrlListView_SortItems($idListView,0)

    Achte allerding darauf, dass diese Zeile nach _GUICtrlListView_RegisterSortCallBack kommt.

    2 Mal editiert, zuletzt von Zeitriss (28. Juni 2016 um 18:58) aus folgendem Grund: Formulierung ergab nach Editierung des Vorgängers keinen Sinn mehr.

    • Offizieller Beitrag

    Und für den Fall, dass in dem Listview irgendwo eine Datums-Spalte vorkommt, habe ich mal schnell eine Funktion zum umsortieren geschrieben:

  • mit folgender Codezeile:

    AutoIt
    _GUICtrlListView_SortItems($idListView,0)

    Achte allerding darauf, dass diese Zeile nach _GUICtrlListView_RegisterSortCallBack kommt.

    Das funktioniert leider nur halb so toll. Wenn ich das Script starte wird zwar die Spalte sortiert. Klicke ich dann auf die Spaltenüberschrift wird zuerst nochmal aufsteigend sortiert (Der Pfeil bleibt in der gleichen Richtung) und wird erst nach dem zweiten Klick drauf absteigend sortiert.

    Pfuscht da vielleicht diese Zeile hier rein:

    _GUICtrlListView_SortItems($idListView, GUICtrlGetState($idListView))

  • Hi,

    Klicke ich dann auf die Spaltenüberschrift wird zuerst nochmal aufsteigend sortiert (Der Pfeil bleibt in der gleichen Richtung) und wird erst nach dem zweiten Klick drauf absteigend sortiert.

    Kann das Problem nicht nachvolziehen.
    Ein Beispielscript, weleches das Problem zeigt wäre hilfreich.

    Pfuscht da vielleicht diese Zeile hier rein:

    _GUICtrlListView_SortItems($idListView, GUICtrlGetState($idListView))

    Kommt darauf an wo sich die Zeile befindet.

    Edit:
    Benützt du _GUICtrlListView_SimpleSort() oder _GUICtrlListView_SortItems() für das Sortieren am Anfang?
    Wenn ersteres der Fall ist reicht es, wenn du auf _GUICtrlListView_SortItems() welchselst.

    mfg

    Zeitriss

    Einmal editiert, zuletzt von Zeitriss (28. Juni 2016 um 19:05)

  • Das Sortieren durch dein Programm zeigt nur nicht, dass der User sortiert hat.

    Doch _GUICtrlListView_SortItems hat den selben effekt, wie ein Mausklick auf die Überschrift.
    Vorausgesetzt er hat die Methode von Oscar ohne die Datums-umsortierung übernommen, ansonsten müsste er natürlich auch das berücksichtigen.

    mfg


    Zeitriss

  • Sieht so aus das ganze:

    Datum sortiere ich keines. Sind alles Textfelder.

  • Hi,

    Kann immer noch nicht den beschriebenen Fehler entdecken, habe die Sortierfunktion Testweise hier eingefügt:

    AutoIt
    _GUICtrlListView_RegisterSortCallBack($idListView)
    
    
    GUISetState(@SW_SHOW)
    
    
    If FileExists($sDBFile) Then Load()
    _GUICtrlListView_SortItems($idListView, 0)

    Funktioniert alles prima.
    Hast du vielleicht vor der Load() Funktion Sortiert?

    mfg

    Zeitriss

    • Offizieller Beitrag

    Mal ein kleines Zitat aus der Hilfe:

    Zitat von AutoIt-Hilfe


    For each call to _GUICtrlListView_RegisterSortCallBack() there must be a call to _GUICtrlListView_UnRegisterSortCallBack() when done (before exit).

    It is up to the user to call _GUICtrlListView_UnRegisterSortCallBack() for each _GUICtrlListView_RegisterSortCallBack() call made.

  • Ich hab die Sortierung jetzt unten in die LOAD-Funktion gepackt.
    jetzt funktionierts.


    UnRegisterSortCallBack hat auch noch gefehlt. danke für den Hinweis.