Seite 1 von 1

Listicongadget: Multiselect

Verfasst: 22.02.2005 23:44
von Calloway
Warum funktioniert dieser Code nicht?
Wenn ich Multiselect entferne, funktioniert er. Bei Multiselect kann ich nicht mehr einzelne Elemente per Buttondruck aktivieren...

Code: Alles auswählen

  If OpenWindow(0, 216, 0, 600, 273,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
    If CreateGadgetList(WindowID())
      ListIconGadget(0, 30, 20, 460, 230, "Column1", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_MultiSelect) ;#PB_ListIcon_MultiSelect
      For i=1 To 100:AddGadgetItem(0,-1,"Element #"+Str(i)):Next i
      ButtonGadget(1, 500, 100, 80, 30, "down")
      ButtonGadget(2, 500, 60, 80, 30, "up")
    EndIf
  EndIf
  
  Repeat
    
    EventID.l = WaitWindowEvent()
    EvType.l=EventType()
    
    Select EventID
      
      Case #PB_EventGadget
        Select EventGadgetID()
          Case 1:SetGadgetState(0,GetGadgetState(0)+1)
          Case 2:SetGadgetState(0,GetGadgetState(0)-1)
        EndSelect
      Case #PB_EventCloseWindow
        End
    EndSelect
    
  Until EvType=#PB_EventCloseWindow    

Verfasst: 23.02.2005 00:23
von Team100
Ja das ist klar warum es nicht läuft:

Beim der Abfrage mit GetGadgetState() bekommt man als Rückgabewert
die <erste> markierte Zeile. Das paßt zwar für den UP Button, aber
nicht so ganz für den DOWN Button. Der markiert die nächste Zeile und
das immer wieder :|

Auf die Schnelle fällt mir die Abfrage mit GetGadgetItemState ein:
In einer Schleife prüft man zuerst auf Markierung, setzt ein Flag
und prüft dann auf fehlende Markierung. Dann ist man an der richtigen
Stelle.....

Hier der Code

Code: Alles auswählen

#maxzahl = 100
  
  If OpenWindow(0, 216, 0, 600, 273,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )") 
    If CreateGadgetList(WindowID()) 
      ListIconGadget(0, 30, 20, 460, 230, "Column1", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_MultiSelect) ;#PB_ListIcon_MultiSelect 
      For i=1 To #maxzahl:AddGadgetItem(0,-1,"Element #"+Str(i)):Next i 
      ButtonGadget(1, 500, 100, 80, 30, "down") 
      ButtonGadget(2, 500, 60, 80, 30, "up") 
    EndIf 
  EndIf 
  
  Repeat 
    
    EventID.l = WaitWindowEvent() 
    EvType.l=EventType() 
    
    Select EventID 
      
      Case #PB_EventGadget 
        Select EventGadgetID() 
          Case 1
           selectflag = 0
           For i = 0 To #maxzahl - 1
             If GetGadgetItemState(0, i) <> #PB_ListIcon_Selected And selectflag = 1
                SetGadgetState(0,i)
                Break
             ElseIf GetGadgetItemState(0, i) = #PB_ListIcon_Selected  
                selectflag = 1
             EndIf
           Next i
          Case 2:SetGadgetState(0,GetGadgetState(0)-1) 
        EndSelect 
      Case #PB_EventCloseWindow 
        End 
    EndSelect 
    
  Until EvType=#PB_EventCloseWindow   

Eventuell gehts auch einfacher. Aber es ist ziemlich spät. :coderselixir:

Cu von Team100

Verfasst: 23.02.2005 00:33
von Calloway
Vielen Dank für den Code.
Wie macht man es jetzt am einfachsten, wenn man mehrere Einträge angewählt hat und den Up/Down-Button drückt, dass dann nicht noch mehr Einträge angewählt werden, sondern wieder nur ein einziger? Muss ich dann im Prinzip vorher alle Einträge abwählen?
Ansonsten muss ich doch mit Checkboxes arbeiten. :freak:

Verfasst: 23.02.2005 01:02
von Team100
.... einfach mit der Maus irgendwo ins Listicon klicken und weg ist
die Auswahl ..... Man kann natürlich auch einen Clear-Button machen
und mit einer For-Next Schleife alle Einträge rücksetzen.

Cu von Team100