[offen] wNim wListCtrl sortieren - wie?

  • Ich möchte ein wListCtrl nach Inhalt (nicht Index) sortieren.

    Dazu finde ich:

    proc sortItems(self: wListCtrl; callback: wListCtrl_Compare; data: int = 0)

    und die Beschreibung der Callback-Funktion:

    wListCtrl_Compare = proc (item1: int; item2: int; data: int): int

    Aber wie soll ich Werte mit dieser Vorgabe vergleichen? Die Callback-Funktion verlangt Integer als Parameter und das Ergebnis ist auch Integer. Ich habe aber Textdaten in der Liste, die ich vergleichen möchte.

    In Lua würde ich das z.B. so lösen in einem table: table.sort(myTable, function(a, b) return myTable[a] > myTable[b] end) . Das Ergebnis von einem Compare ist in jedem Fall Bool - nie Integer. In Lua wäre das egal, da wie in AutoIt auch nummerische Werte als bool interpretiert werden. Aber Nim ist da absolut typgetreu.

    EDIT:

    Ich habe momentan die Anzeige so umgestaltet, dass die zu sortierende Spalte immer die erste ist. Somit reicht erst mal der Style wLcSortAscending. Aber interessieren würde mich schon, wie es geht.

  • Aber wie soll ich Werte mit dieser Vorgabe vergleichen? Die Callback-Funktion verlangt Integer als Parameter und das Ergebnis ist auch Integer. Ich habe aber Textdaten in der Liste, die ich vergleichen möchte.

    Bei den Integerwerten für die Callback-Routine werden die Indexe der zu sortierenden LV-Einträge übergeben. Damit kannst Du dann den Itemtext auslesen und das Ergebnis des Vergleichs als Returnwert übergeben.

    Hier mal ein Beispiel:

  • Hast du eine Einstellung entdeckt, dass man die Up/Down-Pfeile evtl. rechts vom Text im Header anordnen könnte?

    Hmm...das hat nichts mit den Sortier-Pfeilen zu tun. Das Problem liegt am Platz für den Checked-Haken.

    Der wird hier immer freigehalten, auch wenn der Modus gar nicht aktiv ist (idPlaylist.enableCheckBoxes(true) ist gar nicht vorhanden). Somit müsste die erste Spalte eigentlich ganz am Rand stehen, was aber nicht der Fall ist.

    Edit: Ein möglicher Workaround wäre, eine zusätzliche erste Spalte (mit Größe 0) einzufügen. So wird der Platz für den Checked-Haken auf Null gesetzt:

  • Das Problem liegt am Platz für den Checked-Haken.

    Der wird hier immer freigehalten

    Aber erst beim Zuweisen der Imagelist und absolut unabhängig vom Style.

    Der Workaround wäre eine Möglichkeit, aber ich bin nicht glücklich damit.

    Da die Sortierpfeile sowieso vor dem Spaltentext stehen (finde ich wirklich grausam), werde ich mal versuchen das ohne ImageList zu lösen und stattdessen den Spaltenheader bearbeiten: "Text & Pfeilsymbol". Zumal dann auch gleich offensichtlich ist, für welche Spalten ich keine Sortierung zulasse.

    Ich habe mehrere ListCtrl in der Ansicht und muss daher sowieso ein separates Management für die Sortierung implementieren. Die Anpassung der Spaltenheader werde ich dort mit einbinden.


    EDIT:

    Ja, mit angehängten Pfeilen gefällt es mit besser.

    Ich habe folgende Pfeile genutzt:

    Nim
    import strutils
    
    
    let
      arrUp = "  " & parseHexStr("E28691")    # Pfeil auf: ↑ 
      arrDown = "  " & parseHexStr("E28693")  # Pfeil ab:  ↓

    Ich habe die Pfeile sicherheitshalber über die Funktion parseHexStr erstellt. Bei Zeichen im Text bin ich immer skeptisch, ob das richtig dargestellt wird.

    So sieht es aus

  • Ich habe mir das mit dem sortieren beim Listview mal in C++ angesehen.

    Man braucht gar nicht das Colum-Image ändern. Stattdessen handelt es sich um den Header des Listviews.

    Das Handle zum Header kann man ermitteln und dann die Sortierpfeile entsprechend anpassen (HDF_SORTUP und HDF_SORTDOWN).

    Hier mal als Beispielcode:

    Screenshot:

  • das nenn ich mal geschmeidig.

    Naja, noch nicht ganz! Die globalen Variablen stören noch.

    Ich habe das Ganze noch etwas umgebaut, sodass nur statische Variablen benötigt werden: