Page 1 of 1

#PB_EventType_Change doesn't trigger on a checkbox change

Posted: Wed Mar 10, 2021 8:49 pm
by TRS-Eric
This would be most helpful to me if it could trigger when a checkbox is changed!

See example:

Code: Select all

  If OpenWindow(0, 0, 0, 270, 160, "CheckBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget  (0, 10,  10, 150, 20, "String Gadget")
    CheckBoxGadget(1, 10,  40, 250, 20, "CheckBox checked"): SetGadgetState(1, #PB_Checkbox_Checked)
    CheckBoxGadget(2, 10,  70, 250, 20, "CheckBox three state", #PB_CheckBox_ThreeState): SetGadgetState(2, #PB_Checkbox_Inbetween)
    CheckBoxGadget(3, 10, 100, 250, 20, "CheckBox right", #PB_CheckBox_Right)
    CheckBoxGadget(4, 10, 130, 250, 20, "CheckBox center", #PB_CheckBox_Center)
    
    
    Repeat
      ex_event = WaitWindowEvent()
      ex_event_type = EventType()
      If ex_event_type = #PB_EventType_Change
        Debug "Changed!"
      EndIf
      
    Until ex_event = #PB_Event_CloseWindow
  EndIf


Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Wed Mar 10, 2021 9:15 pm
by infratec
This is not a bug.

It is more a feature request.

But it generates an event, like a button:

Code: Select all

If OpenWindow(0, 0, 0, 270, 160, "CheckBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget  (0, 10,  10, 150, 20, "String Gadget")
  CheckBoxGadget(1, 10,  40, 250, 20, "CheckBox checked"): SetGadgetState(1, #PB_Checkbox_Checked)
  CheckBoxGadget(2, 10,  70, 250, 20, "CheckBox three state", #PB_CheckBox_ThreeState): SetGadgetState(2, #PB_Checkbox_Inbetween)
  CheckBoxGadget(3, 10, 100, 250, 20, "CheckBox right", #PB_CheckBox_Right)
  CheckBoxGadget(4, 10, 130, 250, 20, "CheckBox center", #PB_CheckBox_Center)
  
  
  Repeat
    ex_event = WaitWindowEvent()
    
    Select ex_event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1 To 4
            Debug "Changed"
        EndSelect
    EndSelect
    
  Until ex_event = #PB_Event_CloseWindow
EndIf
So it was more a coding question :wink:

Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Wed Mar 10, 2021 9:19 pm
by VB6_to_PBx

Code: Select all

  If OpenWindow(0, 0, 0, 270, 160, "CheckBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    StringGadget  (0, 10,  10, 150, 20, "String Gadget")
    CheckBoxGadget(1, 10,  40, 250, 20, "CheckBox checked"): SetGadgetState(1, #PB_Checkbox_Checked)
    CheckBoxGadget(2, 10,  70, 250, 20, "CheckBox three state", #PB_CheckBox_ThreeState): SetGadgetState(2, #PB_Checkbox_Inbetween)
    CheckBoxGadget(3, 10, 100, 250, 20, "CheckBox right", #PB_CheckBox_Right)
    CheckBoxGadget(4, 10, 130, 250, 20, "CheckBox center", #PB_CheckBox_Center)
   
   
    Repeat
      ex_event = WaitWindowEvent()
      Select EventGadget()
      Case 1 : Debug "CheckBoxGadget # 1 was Changed! GadgetState = " + Str(GetGadgetState(1))
      Case 2 : Debug "CheckBoxGadget # 2 was Changed! GadgetState = " + Str(GetGadgetState(2))
      Case 3 : Debug "CheckBoxGadget # 3 was Changed! GadgetState = " + Str(GetGadgetState(3))
      Case 4 : Debug "CheckBoxGadget # 4 was Changed! GadgetState = " + Str(GetGadgetState(4))
      EndSelect
    Until ex_event = #PB_Event_CloseWindow
  EndIf

Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Wed Mar 10, 2021 9:21 pm
by TRS-Eric
I don't think I would call that a feature request. From this list it seems to me that checkmarks should trigger #PB_EventType_Change, how else would one know that the checkbox had changed other than checking on every #PB_Event_Gadget event (and having a very large list of if/then statements to check each checkmark)? At the very least this should be mentioned in the documentation.

Code: Select all

The following values are possible, if an event of the type #PB_Event_Gadget (library Gadget) or #PB_Event_SysTray (library Systray) occurs: 
  #PB_EventType_LeftClick       : Left mouse button click
  #PB_EventType_RightClick      : right mouse button click
  #PB_EventType_LeftDoubleClick : Left mouse button double click
  #PB_EventType_RightDoubleClick: Right mouse button double click
  #PB_EventType_Focus           : Get the focus.
  #PB_EventType_LostFocus       : Lose the focus.
  #PB_EventType_Change          : Content change.
  #PB_EventType_DragStart       : The user tries to start a Drag & Drop operation.


Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Wed Mar 10, 2021 10:14 pm
by infratec
No, it is nowhere written that the CheckBoxGadget() supports EventType()

This is written at every Gadget who supports it.
Also at the help of EventType() it is not listed.

Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Thu Mar 11, 2021 12:08 am
by IdeasVacuum
Why do you need an event triggered when a Checkbox is changed?

Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Thu Mar 11, 2021 1:43 am
by kenmo
Hello. I think some of the responses have been confusing.

1. CheckBoxGadget DOES generate an event when it changes. It just doesn't specify EventType()... because Change is the only type it would possibly generate!

2. You don't need to hard-code out all the gadgets to check for. Try it, minimal change to your original code:

Code: Select all

If OpenWindow(0, 0, 0, 270, 160, "CheckBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget  (0, 10,  10, 150, 20, "String Gadget")
  CheckBoxGadget(1, 10,  40, 250, 20, "CheckBox checked"): SetGadgetState(1, #PB_Checkbox_Checked)
  CheckBoxGadget(2, 10,  70, 250, 20, "CheckBox three state", #PB_CheckBox_ThreeState): SetGadgetState(2, #PB_Checkbox_Inbetween)
  CheckBoxGadget(3, 10, 100, 250, 20, "CheckBox right", #PB_CheckBox_Right)
  CheckBoxGadget(4, 10, 130, 250, 20, "CheckBox center", #PB_CheckBox_Center)
 
 
  Repeat
    ex_event = WaitWindowEvent()
    If (ex_event = #PB_Event_Gadget)
      If (EventGadget() <> -1) ; because it seems to fire some Gadget = -1 events, which IS perhaps a bug...
        Debug "Gadget " + Str(EventGadget())
      EndIf
    EndIf
   
  Until ex_event = #PB_Event_CloseWindow
EndIf
3. This is not a "bug". That gadget doesn't claim to use EventType(), and as I said in (1) it doesn't need to. "Change" is the only type.

4. This could be a Feature Request (which I would support!) that CheckBoxGadget() should indicate #PB_EventType_Change along with its events.

Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Thu Mar 11, 2021 7:17 am
by BarryG
TRS-Eric wrote:From this list it seems to me that checkmarks should trigger #PB_EventType_Change
Nope - you didn't read the manual just above that list, which clearly states: The following gadgets support EventType(), and CheckboxGadgets() are NOT included.

Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Thu Mar 11, 2021 9:06 am
by VB6_to_PBx

Code: Select all

If OpenWindow(0, 0, 0, 270, 160, "CheckBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StringGadget  (0, 10,  10, 150, 20, "String Gadget")
  CheckBoxGadget(1, 10,  40, 250, 20, "CheckBox checked"): SetGadgetState(1, #PB_Checkbox_Checked)
  CheckBoxGadget(2, 10,  70, 250, 20, "CheckBox three state", #PB_CheckBox_ThreeState): SetGadgetState(2, #PB_Checkbox_Inbetween)
  CheckBoxGadget(3, 10, 100, 250, 20, "CheckBox right", #PB_CheckBox_Right)
  CheckBoxGadget(4, 10, 130, 250, 20, "CheckBox center", #PB_CheckBox_Center)
  
  Repeat
    ex_event = WaitWindowEvent()
    If (ex_event = #PB_Event_Gadget)
       If (EventGadget() <> -1) ;<<--- because it seems to fire some Gadget = -1 events, which IS perhaps a bug...
          Debug "CheckBoxGadget # " + Str(EventGadget()) + " was Changed! GadgetState = " + Str(GetGadgetState(EventGadget()))
          SetWindowTitle(0,Str(EventGadget()) + " GadgetState = " + Str(GetGadgetState(EventGadget())))
       EndIf
    EndIf
   
  Until ex_event = #PB_Event_CloseWindow
EndIf


Re: #PB_EventType_Change doesn't trigger on a checkbox chang

Posted: Thu Mar 11, 2021 12:15 pm
by TI-994A
Just roll your own:

Code: Select all

wFlags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered 
If OpenWindow(0, 0, 0, 270, 160, "CheckBoxGadget", wFlags)
  StringGadget  (0, 10,  10, 250, 20, "String Gadget")
  CheckBoxGadget(1, 10,  40, 250, 20, "CheckBox checked")
  CheckBoxGadget(2, 10,  70, 250, 20, "CheckBox three state", #PB_CheckBox_ThreeState)
  CheckBoxGadget(3, 10, 100, 250, 20, "CheckBox right", #PB_CheckBox_Right)
  CheckBoxGadget(4, 10, 130, 250, 20, "CheckBox center", #PB_CheckBox_Center)
  SetGadgetState(2, #PB_Checkbox_Inbetween)
    
  Repeat
    
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        appQuit = #True
        
      Case #PB_Event_Gadget        
        event_gadget = EventGadget()        
        If IsGadget(event_gadget)
          
          Select GadgetType(event_gadget)
              
            Case #PB_GadgetType_CheckBox  ;for checkbox gadgets              
              Select event_gadget
                  
                Case 1
                  SetGadgetText(0, "CheckBox gadget 1 state: " + GetGadgetState(1))
                  
                Case 2               
                  SetGadgetText(0, "CheckBox gadget 2 state: " + GetGadgetState(2))
                  
                Case 3
                  SetGadgetText(0, "CheckBox gadget 3 state: " + GetGadgetState(3))
                  
                Case 4
                  SetGadgetText(0, "CheckBox gadget 4 state: " + GetGadgetState(4))
                  
              EndSelect            
              
            Default  ;for all other gadget types              
              Select event_gadget
                  
                Case 0
                  Debug "String gadget 0 change/focus event..."
                  
              EndSelect
              
          EndSelect
          
        EndIf
        
    EndSelect
    
  Until appQuit
  
EndIf