Page 1 of 1

[SOLVED] Calling a window from another events problem

Posted: Fri Aug 16, 2019 10:56 am
by forgottencoder
Hi everyone

1º In window1 when i press "add 1" button it adds to textbox (it's working).
2º Then i open window2 and press "add 1" button and it adds to textbox in window1.
3º Then when i go back to window 1 and press "add 1" button it doesn't work anymore.

What i am doing wrong ? I don't want to close window2.

Code: Select all

Enumeration
  #window1
  #window1_button1
  #window1_button2
  #window1_text1
  #window2
  #window2_button1
EndEnumeration
  
Declare p_window1_ini()
Declare p_window2_ini()
Declare p_window1_control()
Declare p_window2_control()

Global n=0

If OpenWindow(#window1, 0, 0, 800, 600, "window1",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  p_window1_ini()
  p_window1_control()
EndIf

End


Procedure p_window2()
  If OpenWindow(#window2, 0, 0, 400, 300, "window2",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    StickyWindow(#Window2, #True) 
    p_window2_ini()
    p_window2_control()
    CloseWindow(#window2)
  EndIf  
EndProcedure  


Procedure p_window1_ini()
  
  ButtonGadget(#window1_button1, 10, 10, 150, 20, "Open Window2")
  ButtonGadget(#window1_button2, 10, 30, 150, 20, "Add 1")
  TextGadget(#window1_text1, 10, 50, 150, 20, Str(n),#PB_Text_Border)
  
EndProcedure  
  
Procedure p_window2_ini()
  ButtonGadget(#window2_button1, 10, 30, 150, 20, "Add 1")
  
EndProcedure  

Procedure p_window1_control()
  Protected window1_event
    
  Repeat
    window1_event=WaitWindowEvent()
            
    Select window1_event
      Case #PB_Event_Gadget
        Select EventGadget()        
          Case #window1_button1  
            p_window2()
          Case #window1_button2
            n=n+1
            SetGadgetText(#window1_text1,Str(n))
            
            
        EndSelect    
      Case #PB_Event_CloseWindow
        Break
  
    EndSelect    
  ForEver      
EndProcedure  


Procedure p_window2_control()
  Protected window2_event
    
  Repeat
    window2_event=WaitWindowEvent()
        
    Select window2_event
      Case #PB_Event_Gadget
        Select EventGadget()        
          Case #window2_button1  
            n=n+1
            SetGadgetText(#window1_text1,Str(n))
        EndSelect    
      Case #PB_Event_CloseWindow
        Break
  
    EndSelect    
  ForEver      
EndProcedure  


Re: Calling a window from another events problem

Posted: Fri Aug 16, 2019 11:14 am
by infratec
One program -> one event loop :!:

Code: Select all

Enumeration
  #window1
  #window1_button1
  #window1_button2
  #window1_text1
  #window2
  #window2_button1
EndEnumeration

Declare p_window1_ini()
Declare p_window2_ini()
Declare p_window_control()

Global n=0

If OpenWindow(#window1, 0, 0, 800, 600, "window1",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  p_window1_ini()
  p_window_control()
EndIf

End


Procedure p_window2()
  If OpenWindow(#window2, 0, 0, 400, 300, "window2",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    StickyWindow(#Window2, #True)
    p_window2_ini()
  EndIf 
EndProcedure 


Procedure p_window1_ini()
  
  ButtonGadget(#window1_button1, 10, 10, 150, 20, "Open Window2")
  ButtonGadget(#window1_button2, 10, 30, 150, 20, "Add 1")
  TextGadget(#window1_text1, 10, 50, 150, 20, Str(n),#PB_Text_Border)
  
EndProcedure 

Procedure p_window2_ini()
  ButtonGadget(#window2_button1, 10, 30, 150, 20, "Add 1")
  
EndProcedure 

Procedure p_window_control()
  Protected window_event
  
  Repeat
    window_event=WaitWindowEvent()
    
    Select EventWindow()
      Case #window1
        
        Select window_event
          Case #PB_Event_Gadget
            Select EventGadget()       
              Case #window1_button1 
                p_window2()
              Case #window1_button2
                n=n+1
                SetGadgetText(#window1_text1,Str(n))
                
                
            EndSelect   
          Case #PB_Event_CloseWindow
            Break
            
        EndSelect 
        
      Case #window2
        Select window_event
          Case #PB_Event_Gadget
            Select EventGadget()       
              Case #window2_button1 
                n=n+1
                SetGadgetText(#window1_text1,Str(n))
            EndSelect   
          Case #PB_Event_CloseWindow
            CloseWindow(#window2)
            SetActiveWindow(#window1)
        EndSelect
        
    EndSelect
    
  ForEver     
EndProcedure 

Re: Calling a window from another events problem

Posted: Fri Aug 16, 2019 11:21 am
by mk-soft
Only one event-loop may exist at any one time.

WaitWindowEvent() is your passing from system to your application.
This must always run without interruption, so that all events are always processed by the system. Even the ones you don't need.

Code: Select all

Enumeration
  #window1
  #window1_button1
  #window1_button2
  #window1_text1
  #window2
  #window2_button1
EndEnumeration
  
Declare p_window1_ini()
Declare p_window2_ini()

Global n=0

Procedure p_window1_ini()
  If OpenWindow(#window1, 0, 0, 800, 600, "window1",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    ButtonGadget(#window1_button1, 10, 10, 150, 20, "Open Window2")
    ButtonGadget(#window1_button2, 10, 30, 150, 20, "Add 1")
    TextGadget(#window1_text1, 10, 50, 150, 20, Str(n),#PB_Text_Border)
  EndIf
EndProcedure  

Procedure p_window2_ini()
  If OpenWindow(#window2, 0, 0, 400, 300, "window2",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    StickyWindow(#Window2, #True) 
    ButtonGadget(#window2_button1, 10, 30, 150, 20, "Add 1")
  EndIf  
EndProcedure  

Procedure p_event_loop()
  Protected window_event
    
  Repeat
    window_event=WaitWindowEvent()
            
    Select window_event
      Case #PB_Event_Gadget
        Select EventGadget()        
          Case #window1_button1  
            p_window2_ini()
          Case #window1_button2
            n=n+1
            SetGadgetText(#window1_text1,Str(n))
          Case #window2_button1  
            n=n+1
            SetGadgetText(#window1_text1,Str(n))
        EndSelect    
      Case #PB_Event_CloseWindow
        Select EventWindow()
          Case #window1
            Break
          Case #window2
            CloseWindow(#window2)
        EndSelect
    EndSelect    
  ForEver      
EndProcedure  

Procedure p_main()
  p_window1_ini()
  p_event_loop()
EndProcedure

p_main()
infratec was a little faster :wink:

Re: Calling a window from another events problem

Posted: Fri Aug 16, 2019 1:12 pm
by collectordave
Hi

You can have more than one event loop in your program BUT it is up to you the programmer to keep track of which one is active at any time as only one can be active. PB does not restrict you from this.

In your program you open window 2 and pass control to the p_window2_control() procedure so yes events are still being processed however there is nothing in p_window2_control() to handle
events from #window1_button2 and no escape from p_window2_control() unless window 2 is closed.

You can process events from window 1 in p_window2_control() as in the code below but you have to decide is it exactly what you want? Also do not rely on being able to do this as your programs get more complicated and you use modules and more variables you can go up blind alleys.

It is best to stick to the single event loop as infratec and mk_soft have shown until you are absolutely sure you are keeping track of which event loop is active at anytime during you programmes execution.

Code: Select all

Code:
Enumeration
  #window1
  #window1_button1
  #window1_button2
  #window1_text1
  #window2
  #window2_button1
EndEnumeration
 
Declare p_window1_ini()
Declare p_window2_ini()
Declare p_window1_control()
Declare p_window2_control()

Global n=0

If OpenWindow(#window1, 0, 0, 800, 600, "window1",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  p_window1_ini()
  p_window1_control()
EndIf

End


Procedure p_window2()
  If OpenWindow(#window2, 0, 0, 400, 300, "window2",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    StickyWindow(#Window2, #True)
    p_window2_ini()
    p_window2_control()
    CloseWindow(#window2)
  EndIf 
EndProcedure 


Procedure p_window1_ini()
 
  ButtonGadget(#window1_button1, 10, 10, 150, 20, "Open Window2")
  ButtonGadget(#window1_button2, 10, 30, 150, 20, "Add 1")
  TextGadget(#window1_text1, 10, 50, 150, 20, Str(n),#PB_Text_Border)
 
EndProcedure 
 
Procedure p_window2_ini()
  ButtonGadget(#window2_button1, 10, 30, 150, 20, "Add 1")
 
EndProcedure 

Procedure p_window1_control()
  Protected window1_event
   
  Repeat
    window1_event=WaitWindowEvent()
           
    Select window1_event
      Case #PB_Event_Gadget
        Select EventGadget()       
          Case #window1_button1 
            p_window2()
          Case #window1_button2
            n=n+1
            SetGadgetText(#window1_text1,Str(n))
           
           
        EndSelect   
      Case #PB_Event_CloseWindow
        Break
 
    EndSelect   
  ForEver     
EndProcedure 


Procedure p_window2_control()
  Protected window2_event
   
  Repeat
    window2_event=WaitWindowEvent()
       
    Select window2_event
      Case #PB_Event_Gadget
        Select EventGadget()       
          Case #window2_button1 
            n=n+1
            SetGadgetText(#window1_text1,Str(n))
            
            
          ;Added event here to keep it going  
          Case #window1_button2
            n=n+1
            SetGadgetText(#window1_text1,Str(n))
            
            
            
            
        EndSelect   
      Case #PB_Event_CloseWindow
        Break
 
    EndSelect   
  ForEver     
EndProcedure  

Re: Calling a window from another events problem

Posted: Fri Aug 16, 2019 2:38 pm
by dcr3
mk-soft
infratec was a little faster :wink:
Right on time. Your logic prevails. Thanks. :D

Re: Calling a window from another events problem

Posted: Sun Aug 18, 2019 4:33 pm
by forgottencoder
Thanks everybody for answers. Now i am on the right track. :D