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.
ListIconGadget mit CheckBox
Re: ListIconGadget mit CheckBox
das einfachste wäre es, wenn Du WaitWindowEvent() auf #PB_Event_GadgetThoPie hat geschrieben:Gibt es eine Möglichkeit ein Ereignis auszulösen, wenn irgendeine Veränderung an den CheckBoxes vorgenommen wurde?
und EventGadget() auf Dein ListIconGadget testen würdest.
Grüße ... Kiffi
a²+b²=mc²
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:
Beim Haken entfernen:
Statt ein Array als Flankenmerker, kannst Du auch eine LinkedList verwenden.
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
Code: Alles auswählen
If Not GetGadgetItemState(#ListIconGadget, Position) And Flanke(Position)
Flanke(Position) = 0
*Dein Code*
EndIf
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
Hier ein Beispiel aus dem englischen Forum, welches als Beispiel dir eventuell hilft
OriginalCode mit eingefügtem SetGadgetState Befehl um Zeile zu markieren
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
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Darf es denn auch ohne API gehen?
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
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
http://www.purebasic.fr/german/viewtopi ... 0598#80598 bzw.
http://www.purebasic.fr/german/viewtopi ... =3367#3367
finden...

Gruß, Häns
PB 5.6
Windows 7 Professional
Windows 7 Professional