ListIconGadget - Letztes ausgewähltes Item

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 198
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 8GB Ram, Win7 Ultimate, PB5.11
Wohnort: Köln

ListIconGadget - Letztes ausgewähltes Item

Beitrag 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:
Axolotl
Beiträge: 57
Registriert: 31.12.2008 16:34

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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 
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 10 Home
Benutzeravatar
Ghosty1967
Beiträge: 198
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 8GB Ram, Win7 Ultimate, PB5.11
Wohnort: Köln

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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?!
Benutzeravatar
hjbremer
Beiträge: 776
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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
Purebasic 5.41 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Bisonte
Beiträge: 2387
Registriert: 01.04.2007 20:18

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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 ;)
PureBasic 5.72 LTS (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 64GB RAM | iChill GeForce RTX 2080 Super | HAF XF Evo​​
Benutzeravatar
Ghosty1967
Beiträge: 198
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 8GB Ram, Win7 Ultimate, PB5.11
Wohnort: Köln

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag von Ghosty1967 »

Sehe ich auch so, deswegen bleibe ich einfach bei meiner Version, fallsl nicht noch einer eine geniale Idee hat... ;)
Benutzeravatar
hjbremer
Beiträge: 776
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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
Purebasic 5.41 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Ghosty1967
Beiträge: 198
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 8GB Ram, Win7 Ultimate, PB5.11
Wohnort: Köln

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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 ;)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ListIconGadget - Letztes ausgewähltes Item

Beitrag 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 :)
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten