[Nim] Fragen zu einem Listview

    • Offizieller Beitrag

    Ich habe ein Listview (List), bei dem ich gern eine Zeile markieren will (mache ich mit "state=wListStateDropHighlighted").

    Soweit so gut! Das funktioniert.

    Jetzt will ich aber verhindern, dass der Benutzer eine andere Zeile markieren/anklicken kann. Wie geht das?

    Ich will aber nicht das ganze Listview deaktivieren (mit disable), weil man dann nicht mehr scrollen kann.


    Hier mal ein Beispiel:

    • Offizieller Beitrag

    Meine Überlegung wäre:


    - MouseEvent auf ListCtrl überwachen: listHighScore.wEvent_LeftDown do ():

    - auf welchem Item erfolgte der Klick

    - Selection für dieses Item aufheben


    Nur habe ich vergeblich nach einer Funktion "GetSelectedItem" oder ähnlich gesucht. Muss man wohl über alle Item iterieren und den Status abfragen.

    • Offizieller Beitrag

    Ich habe jetzt dieses Event: wEvent_ListItemSelected ausgewertet.

    Die Prozedur getSelectedItem habe ich mir selbst geschrieben und dann einfach das Selected und Focused rückgangig gemacht.

    Damit habe ich die gewünschte Funktionalität erreicht. Danke, für die Richtung!


    • Offizieller Beitrag

    Oscar

    Manchmal kann man einfach nur den Kopf schütteln, weil es so einfach ist.

    Ich hatte den richtigen Ansatz schon, aber an eines nicht gedacht: Wenn ich einen eigenen Event-Handler für Mouseclick-On-ListCtrl erstelle, überschreibt dieser ja automatisch das normale Verhalten, wenn ich das Event am Ende nicht an das System zurückgebe.

    Du willst, dass nichts passiert außer scrollen, also:

    Code
    listHighScore.wEvent_LeftDown do ():
      discard
    • Offizieller Beitrag

    Was man im Zusammenhang mit ListCtrl immer braucht: Welches Item wurde gerade geklickt (HitTest):

    Code
    listHighScore.wEvent_LeftDown do ():
      let mouseClient = frame.screenToClient(wGetMousePosition())
      # echo "MousePos ", mouseClient
      echo " Item ", listHighScore.hitTest(pos=mouseClient)
  • Freut mich wirklich ungemein, dass ihr/du/er/sie/es es nun endlich geschafft haben... denn eine schlaflose Nacht reicht mir...8o


    So geht es übrigens auch:

    • Offizieller Beitrag

    Die Prozedur getSelectedItem habe ich mir selbst geschrieben

    Damit erhältst du nur das erste markierte Item. Wenn du Mehrfachauswahl erlaubst, musst du alle abfragen:

    Code
    proc getSelectedItem(wList: wListCtrl): seq =
      var ssel = newSeq[int]()
      if wList.itemCount() > 0:
        for i, sItem in wList.pairs():
          if (wList.getItemState(i, 0) and wListStateSelected) == wListStateSelected:
            ssel.add(i)
      result = ssel
    • Offizieller Beitrag

    So geht es übrigens auch:

    Ah, "event.index"! Gut zu wissen.

    Das kann ich bestimmt auch noch mal gebrauchen. Danke!



    Wenn du Mehrfachauswahl erlaubst, musst du alle abfragen:

    Ja, das war mir schon klar.

    Hier reichte aber die einfache Variante, da nur SingleSelect.

    Aber als Beispiel für die Benutzung von Sequenzen auch gut geeignet. :):thumbup:

  • Oscar

    Hat den Titel des Themas von „Fragen zu einem Listview“ zu „[Nim] Fragen zu einem Listview“ geändert.
  • Gun-Food

    Hat das Label Nim hinzugefügt.