Seite 1 von 1

Gewählten Eintrag bei Multiselect-ListIcon ermitteln? *OK*

Verfasst: 19.11.2008 22:35
von Regenduft
n'Abend,

Trotz des Risikos etliche Augenroller zu erhalten:

Wie kann ich eigentlich ermitteln, welcher Eintrag bei einem ListIcon-Gadget aktuell ausgewählt wurde (also die Flanke sozusagen), wenn das MultiSelect-Flag gesetzt ist? :?

Bei folgendem Beispielcode habe ich das Problem, dass (wie in der Doku beschrieben) die Nummer des ersten Items rückgegeben wird. Ich hätte aber gerne die Nummer des gerade ausgewählten Eintrags...
(falls ich mich unverständlich ausgedrückt habe: Strg halten, wild rumklicken und Debugger-Ausgabe beobachten :wink:)

Code: Alles auswählen

If OpenWindow(0,50,50,200,200,"Multiselect-ListIcon",#PB_Window_SystemMenu)
  ListIconGadget(0,0,0,200,200,"Einträge",200,#PB_ListIcon_MultiSelect)
  For i = 0 To 10
    AddGadgetItem(0, -1, "Nummer "+Str(i))
  Next i
  Repeat
    Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break

    ; === KERNPROBLEM ===
    Case #PB_Event_Gadget
      If EventType() = #PB_EventType_Change
        Debug GetGadgetState(0)
      EndIf
    ; === KERNPROBLEM ===

    EndSelect
  ForEver
EndIf
End
Was könnte ich statt GetGadgetState(0) verwenden?
Übersehe ich mal wieder etwas absolut offensichtliches?
Antwort bitte wieder min. in Fontsize 24 und rot! :wink:

Verfasst: 19.11.2008 23:45
von Fluid Byte

Code: Alles auswählen

OpenWindow(0,0,0,320,300,"void",#PB_Window_SystemMenu | 1)
ListIconGadget(0,0,0,320,300,"Name",200,#PB_ListIcon_MultiSelect)
  
For i=1 To 30 : AddGadgetItem(0,-1,"List-View Item #" + Str(i)) : Next
  
Repeat
	EventID = WaitWindowEvent()
	
	If EventID = #PB_Event_Gadget And EventGadget() = 0
		Debug SendMessage_(GadgetID(0),#LVM_GETSELECTIONMARK,0,0)
	EndIf
Until EventID = #PB_Event_CloseWindow

Verfasst: 20.11.2008 15:16
von Regenduft
Thx Fuid Byte! Auf Dich ist Verlass! :allright:

Mich wundert's aber, dass es da nur 'ne API-Lösung gibt. :?

Verfasst: 20.11.2008 15:28
von Fluid Byte
Mich wundert's aber, dass es da nur 'ne API-Lösung gibt.
Mich ehrlich gesagt auch aber GetGadgetState() weigert sich und eine andere Methode ist mir nicht bekannt. Vielleicht mal auf die "Wunschliste" setzten falls es noch nicht geschehen sein sollte.

Verfasst: 20.11.2008 18:05
von Andesdaf
Fluid Byte hat geschrieben:Mich ehrlich gesagt auch aber GetGadgetState() weigert sich und eine andere Methode ist mir nicht bekannt. Vielleicht mal auf die "Wunschliste" setzten falls es noch nicht geschehen sein sollte.

Wieso weigert sich GetGadgetState? Bei mir geht das einwandfrei.

Code: Alles auswählen

Debug GetGadgetState(0)
liefert das selbe Ergebnis wie die Funktion der API.

Verfasst: 20.11.2008 18:18
von Fluid Byte
Lass das Beispiel aus seinem ersten Post mal laufen und wähle mit gedrückter Control-Taste Item 0, 2 und 4. Wenn da was anderes als Null steht wäre ich stark überrascht ...

Verfasst: 20.11.2008 18:23
von Andesdaf
Hach Dummheit :oops: ... Ja, du hattest Recht, ich hab vergessen, den
Multiselect auszuführen und dann mal wieder überschnell geantwortet :roll:
Jetzt zeigt er natürlich nur null an. Is ja klar...

Verfasst: 22.11.2008 01:37
von bec

Code: Alles auswählen

If OpenWindow(0,50,50,200,200,"Multiselect-ListIcon",#PB_Window_SystemMenu)
  CreateGadgetList(WindowID(0))
  ListIconGadget(0,0,0,200,200,"Einträge",200,#PB_ListIcon_MultiSelect)
  For i = 0 To 10
    AddGadgetItem(0, -1, "Nummer "+Str(i))
  Next i
  Repeat
    Select WaitWindowEvent()
    Case #PB_Event_CloseWindow 
      Break
    Case #PB_Event_Gadget
      Select EventGadget()
      Case 0 
        Select EventType()
        Case #PB_EventType_LeftClick
          For i = 0 To CountGadgetItems(0)
            If GetGadgetItemState(0, i) = #PB_ListIcon_Selected
               Debug i
            EndIf   
          Next
        EndSelect
      EndSelect        
    EndSelect
  ForEver
EndIf
End
Wenn man es so macht bekommt man die Liste der gerade ausgewählten Einträge.
Wenn man die mit einer Liste des vorherigen Klicks vergleicht bekommt man den aktuell gewählten Eintrag.
Vielleicht nützlich für Nicht-Windows-Programmierer. :wink:

bec

Verfasst: 22.11.2008 02:57
von Fluid Byte
Es gibt alle Einträge zurückt die ausgewählt sind und ist somit nicht brauchbar wenn man direkt reagieren will. Es funktioniert außerdem nur in eine Richtung. So oder so kommt man um API nicht rum.