Seite 1 von 2

ListIconGadget - Letztes ausgewähltes Item

Verfasst: 18.06.2021 08:47
von Ghosty1967
Hallo zusammen...
Ich muss in einem Programm folgende Angaben aus dem ListIconGadget haben
1. Die Position des ersten selektierten Eintrags, den bekomme ich mit dem GetGadgetItemState(Gadget) Befehl
2. Die Anzahl aller selektierten Einträge hole ich mir mit dem API Befehl SendMessage_(GadgetID(id), #LVM_GETSELECTEDCOUNT, 0, 0)
3. Die Position des letzten selektierten Eintrags...
Hier könnte ich ja das ListIconGadget von unten nach oben durchgehen und beim ersten selektierten Eintrag aus der Schleife springen, daß
erscheint mir aber doch ziemlich unkomfortabel und falls machbar würde ich auch hier einen API-Befehl bevorzugen.

Gibt es einen API-Befehl, der mir die Nummer des letztem selektierten Eintrags eines ListIconGadget zurückgibt?
Danke schon mal für den Schupser... :mrgreen:

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 18.06.2021 13:52
von Axolotl
Moin Ghosty1967,

in der MSDN habe ich auf die Schnelle mit #LVM_GETSELECTIONMARK die Möglichkeit den ersten selektierten Eintrag zu finden gefunden.
Apropo MSDN: Ich suche immer mit MSDN <suchwort> im www.
Ansonsten sind diese beiden Links hilfreich:
https://docs.microsoft.com/en-us/previo ... dfrom=MSDN
https://docs.microsoft.com/en-us/previo ... dfrom=MSDN

Da das wahrscheinlich nicht wirklich hilft, hier wenigstens die von Dir angesprochene Variante in PB-code (ungetestet). :oops: :oops:

Code: Alles auswählen

Procedure.i GetGadgetLastSelectedItemIndex(GadID)  ;' returns Index of last selected Item with the ListIconGadget() 
  Protected result, nn 

  result = -1  ;' no selection 
  For nn = CountGadgetItems(GadID) - 1 To 0 Step -1 
    If GetGadgetItemState(GadID, nn) & #PB_ListIcon_Selected
      result = nn  
      Break ;' save little time :-) 
    EndIf 
  Next nn                                              :Debug #PB_Compiler_Procedure+"() -- result = "+result 
  ProcedureReturn result  
EndProcedure 

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 20.06.2021 12:26
von Ghosty1967
Hallo Axolotl..
Danke dir für deine Antwort. Ich glaube, ob ich #LVM_GETSELECTIONMARK nutze oder das mit GetGadgetState() mache ist funktional "relativ" egal. Was die Suche in MSDN angeht, mache ich eigentlich immer genauso, aber es wunderte mich, dass es anscheinend keinen entsprechenden Eintrag in der MSDN zum letzten ausgewählten index in einem Listicon gibt...
Meine Lösung ist auch hier ähnlich deiner

Code: Alles auswählen

Procedure GetLastIndex(Gadget)
  Protected idx
  For idx = CountGadgetItems(Gadget) - 1 To 0 Step - 1
    If GetGadgetItemState(Gadget, idx) & #PB_ListIcon_Selected
      ProcedureReturn idx
    EndIf
  Next idx
  ProcedureReturn -1
EndProcedure
Alles sehr ähnlich - aber kann es wirklich sein, dass in der API daran nicht gedacht wurde?!

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 20.06.2021 22:57
von hjbremer
Mickelsoft for ever

Code: Alles auswählen


Procedure.i LvGetLastSelected(id)
   
   Protected anz = SendMessage_(id, #LVM_GETSELECTEDCOUNT, 0, 0) ;Anzahl selektiert
   Protected j, n = -1
   
   If anz 
      For j = 1 To anz
         n = SendMessage_(id, #LVM_GETNEXTITEM, n, #LVNI_SELECTED)   :  Debug "selected " + n
      Next 
   EndIf
   
   ProcedureReturn n        
EndProcedure

;oder in ein Array

Procedure.i LvGetSelected(id, Array liste(1))
   
   Protected anz = SendMessage_(id, #LVM_GETSELECTEDCOUNT, 0, 0) ;Anzahl selektiert
   Protected j, n = -1
   
   Dim liste(anz)  ;hier kommen die Zeilennummern hinein
   liste(0) = anz
   
   If anz 
      For j = 1 To anz
         n = SendMessage_(id, #LVM_GETNEXTITEM, n, #LVNI_SELECTED)              
         liste(j) = n
      Next 
   EndIf
   
   ProcedureReturn anz        
EndProcedure


OpenWindow(0, 0, 0, 640, 450, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


ListIconGadget(0,  10,  25, 380, 390, "Column 1", 100, #PB_ListIcon_MultiSelect|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)

ButtonGadget(1, 10,  420, 80, 25, "last")
ButtonGadget(2, 110,  420, 80, 25, "Array")

For j = 2 To 4          ;weitere Spalten
   AddGadgetColumn(0, j, "Column " + Str(j), 80)
Next

For j = 0 To 24 
   t$ = ~"Literale\nZeile\n"+Str(j) 
   AddGadgetItem(0, j, t$)
Next



Repeat
   Event = WaitWindowEvent()
   
   Select Event
         
      Case #PB_Event_Gadget
         Select EventGadget()
            Case 1 : row = LvGetLastSelected(GadgetID(0))
               Debug "last selected " + row
               
            Case 2
               Dim rownr(0)
               anz = LvGetSelected(GadgetID(0), rownr())
               
               For j = 1 To anz 
                  Debug rownr(j)
               Next
               
         EndSelect
         
         
   EndSelect
Until Event = #PB_Event_CloseWindow

es werden nur die selektierten Einträge abgefragt

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 21.06.2021 09:59
von Bisonte
Tja.... und da soll einer sagen PB wäre aufwendig ;) ...
Die API Version ist für das geübte Auge genau das gleiche (Abfolge und Aufrufe) wie die Version von Ghosty ;)

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 21.06.2021 12:18
von Ghosty1967
Sehe ich auch so, deswegen bleibe ich einfach bei meiner Version, fallsl nicht noch einer eine geniale Idee hat... ;)

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 21.06.2021 18:40
von hjbremer
Bisonte hat geschrieben: 21.06.2021 09:59 Tja.... und da soll einer sagen PB wäre aufwendig ;) ...
Die API Version ist für das geübte Auge genau das gleiche (Abfolge und Aufrufe) wie die Version von Ghosty ;)
Es ist nicht gleich.

In der PB Version werden im Extremfall alle Listeneinträge in der Schleife durchsucht. ( CountGadgetItems(Gadget) )

In der Api Version nur die selektierten Einträge ( LVM_GETSELECTEDCOUNT )

Die For Next Schleife ist also in der Regel erheblich kleiner

Ob dies auffällt, ist aber natürlich abhängig von der Anzahl der Items

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 22.06.2021 18:45
von GPI
Ich wollte mal in den Raum werfen, das die Fragestellung vermutlich eine falsche Annahme zugrunde legt: Haltet mal die STRG-Taste und klickt in die Liste: die Ausgewählten Einträge müssen nicht in Reihe sein!
Das zuletzt markierte Item muss dementsprechend auch nicht an Anfang oder Ende sein, es kann mittendrin sein.

ungetestet: Laut https://stackoverflow.com/questions/290 ... m-listview
könnte sowas funktionieren (ungetestet): (edit: in prinzip das gleiche, was hjbremer macht)

Code: Alles auswählen

itemInt = -1
repeat
  itemInt = SendMessage_(GadgetId(<gadget>), #LVM_GETNEXTITEM, itemInt , #LVNI_SELECTED)
  if itemint = - 1 : break : endif
; was machen 
forever
Wenn man nur in PB bleiben will, muss man immer alle scannen.

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 24.06.2021 17:22
von Ghosty1967
GPI hat geschrieben: 22.06.2021 18:45 Ich wollte mal in den Raum werfen, das die Fragestellung vermutlich eine falsche Annahme zugrunde legt: Haltet mal die STRG-Taste und klickt in die Liste: die Ausgewählten Einträge müssen nicht in Reihe sein!
Das zuletzt markierte Item muss dementsprechend auch nicht an Anfang oder Ende sein, es kann mittendrin sein.
In meinem Fall geht es wirklich nur darum, den Index des letzten ausgewählten Items in der Liste zu ermitteln und nicht nach der Reihenfolge der Auswahl ;)

Re: ListIconGadget - Letztes ausgewähltes Item

Verfasst: 24.06.2021 22:35
von GPI
Du verstehst mich gerade falsch: Ich kann ohne Probleme den 1, den 3 und den 5ten Eintrag auswählen. Ich hab dann 3 ausgewählt. Wenn deine Routine aber alle Einträge zwischen 1 und 5 nimmt, sinds halt 5 Einträge.
Und GetGadgetState gibt dir den letzten selektierten aus (wenn ich mich nicht ganz täusche), wenn ich also 1,5,3 in der Reihenfolge mit Strg auswähle, dann bekommst du 3 zurück. Wenn du jetzt den letzten holst (5) und das als auswahl hernimmst, hast du 3,4,5 die du weiterverarbeitest.
Freu dich auf lustige Bugreports deiner Benutzer :)