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