Seite 1 von 1

ListIconGadget mit CheckBox

Verfasst: 26.03.2008 19:11
von ThoPie
Hallo,
ich verwende ein ListIconGadget mit CheckBoxes. Gibt es eine Möglichkeit ein Ereignis auszulösen, wenn irgendeine Veränderung an den CheckBoxes vorgenommen wurde?
Vielen Dank.

Re: ListIconGadget mit CheckBox

Verfasst: 26.03.2008 19:46
von Kiffi
ThoPie hat geschrieben:Gibt es eine Möglichkeit ein Ereignis auszulösen, wenn irgendeine Veränderung an den CheckBoxes vorgenommen wurde?
das einfachste wäre es, wenn Du WaitWindowEvent() auf #PB_Event_Gadget
und EventGadget() auf Dein ListIconGadget testen würdest.

Grüße ... Kiffi

Verfasst: 26.03.2008 19:55
von Regenduft
Wenn ich Dich rightig verstehe willst Du, dass ein Stück Code einmalig ausgeführt werden soll, in dem Moment, wenn ein Haken gesetzt oder entfernt wird?

Dann schlage ich Dir vor, einen "Flanken-Merker" zu verwenden!

Beim Haken setzen:

Code: Alles auswählen

GetGadgetItemState(#ListIconGadget, Position) And Not Flanke(Position)
  Flanke(Position) = 1
  
  *Dein Code*
  
EndIf
Beim Haken entfernen:

Code: Alles auswählen

If Not GetGadgetItemState(#ListIconGadget, Position) And Flanke(Position)
  Flanke(Position) = 0
 
  *Dein Code*
  
EndIf
Statt ein Array als Flankenmerker, kannst Du auch eine LinkedList verwenden.

Verfasst: 26.03.2008 19:55
von ThoPie
Das mache ich schon. Allerdings werden auch alle anderen registriert (Klick ins Gadget etc.). Ich möchte aber seperat abfragen ob eine Checkbox angeklickt wurde.

Verfasst: 26.03.2008 22:00
von Fluid Byte
Das eigentliche Problem ist das sich der Status des Gadgets nicht verändert wenn man auf eine Checkbox klickt. Also wenn man z. B. das erste Mal den Code ausführt und mit GetGadgetState() das momentan ausgewählte item ermitteln will kommt immer -1 zurück weil noch kein Item angeklickt wurde. Nur wenn man direkt auf den Text des Items klickt erfolgt eine Statusänderung. Das lässt sich aber mit API lösen falls das eine Option für dich ist.

Verfasst: 27.03.2008 00:29
von hjbremer
Hier ein Beispiel aus dem englischen Forum, welches als Beispiel dir eventuell hilft

OriginalCode mit eingefügtem SetGadgetState Befehl um Zeile zu markieren

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=14457&highlight=
; Author: Sparkie (updated for PB 4.00 by Andre)
; Date: 20. March 2005
; OS: Windows
; Demo: Yes


; ListIcon - realtime detection of the state of a checkbox when an item 
; becomes checked or unchecked.

#LVN_ITEMCHANGED = #LVN_FIRST-1 
#MyWindow = 0 
#MyGadget = 1 

Procedure myWindowCallback(hWnd, msg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_NOTIFY 
      *pnmhdr.NMHDR = lParam 
      Select *pnmhdr\code 
        Case #LVN_ITEMCHANGED 
          *lvChange.NMLISTVIEW = lParam 
          Debug *lvChange\uNewState >>12 &$FFFF 
          ;--> Read the State image mask value ( 1 = un-checked   2 = checked 
          Select *lvChange\uNewState >>12 &$FFFF 
            Case 1 
              SetGadgetState(#MyGadget,-1)              ;<------ z.B. Markierung aus !!!
              StatusBarText(0, 0, "Item " + Str(*lvChange\iItem) + " has been un-checked") 
            Case 2
              SetGadgetState(#MyGadget,*lvChange\iItem) ;<------ z.B. Markierung ein !!!
              StatusBarText(0, 0, "Item " + Str(*lvChange\iItem) + " has been checked") 
          EndSelect 
      EndSelect 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

If OpenWindow(#MyWindow, 100, 100, 350, 140, "ListIcon Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MyWindow)) 
  CreateStatusBar(0, WindowID(#MyWindow)) 
  ListIconGadget(#MyGadget, 5, 5, 340, 110, "Name", 100, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection) 
  AddGadgetColumn(#MyGadget, 1, "Address", 250) 
  AddGadgetItem(#MyGadget, -1, "Harry Rannit" + Chr(10) + "12 Parliament Way, Battle Street, By the Bay") 
  AddGadgetItem(#MyGadget, -1, "Ginger Brokeit" + Chr(10) + "130 PureBasic Road, BigTown, CodeCity") 
  SetWindowCallback(@myWindowCallback()) 
  Repeat 
    event = WaitWindowEvent() 
  Until event = #PB_Event_CloseWindow 
EndIf 

Verfasst: 27.03.2008 02:51
von Häns
Darf es denn auch ohne API gehen?

Code: Alles auswählen

#MyWindow = 0
#MyGadget = 1


If OpenWindow(#MyWindow, 100, 100, 350, 140, "ListIcon Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#MyWindow))
  CreateStatusBar(0, WindowID(#MyWindow))
  ListIconGadget(#MyGadget, 5, 5, 340, 110, "Name", 100, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(#MyGadget, 1, "Address", 250)
  AddGadgetItem(#MyGadget, -1, "Harry Rannit" + Chr(10) + "12 Parliament Way, Battle Street, By the Bay")
  AddGadgetItem(#MyGadget, -1, "Ginger Brokeit" + Chr(10) + "130 PureBasic Road, BigTown, CodeCity")

EndIf
  Repeat

   ev=WaitWindowEvent()

   Select ev
      Case #PB_Event_CloseWindow
         ende=1
      Case #PB_Event_Gadget
         ; was ist passiert ?
         If EventGadget() = #MyGadget And EventType() = #PB_EventType_LeftClick   ; <---Wichtig!
           For i=0 To CountGadgetItems(#MyGadget)-1
             If GetGadgetItemState(#MyGadget,i) & #PB_ListIcon_Checked 
               StatusBarText(0, 0, "Item " + Str(i) + " has been checked")
             EndIf
           Next
         EndIf
   EndSelect
Until ende 
Es wird hier per Schleife nacheinander die Zeilen in der Liste abgefragt, ob sie abgehakt wurde. Wenn es Dir nützt, kannst Du auch weitere Beispiel unter

http://www.purebasic.fr/german/viewtopi ... 0598#80598 bzw.
http://www.purebasic.fr/german/viewtopi ... =3367#3367

finden...:)



Gruß, Häns