Page 1 of 1

PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 11:44 am
by ar-s
Hey
When manipulating several windows, I have a memory access bug if I use #PB_Window_MinimizeGadget | #PB_Window_MinimizeGadget as a parameters, whereas if I only use #PB_Window_SystemMenu it works.

Code: Select all

; -----------------------------------
;         - INITIALISATION - 
; -----------------------------------
Enumeration Fenetres
    #Fenetre1
    #Fenetre2
EndEnumeration

Enumeration Gadgets
    #BTouvrirFen1
    #BTouvrirFen2
    #BTfermerFen1
    #BTfermerFen2
EndEnumeration

Declare OuvrirFenetre1()
Declare OuvrirFenetre2()

Global.b Fenetre1Ouverte = #False, Fenetre2Ouverte = #False , exit = 0

; -----------------------------------
;            - PROCEDURES - 
; -----------------------------------

#PARAM = #PB_Window_MinimizeGadget | #PB_Window_MinimizeGadget ; <- BUG
#PARAM2 = #PB_Window_SystemMenu

Procedure OuvrirFenetre1()
    If OpenWindow(#Fenetre1, 300, 10, 300, 600, "Fenetre 1", #PARAM2) ; <- Try #PARAM here instead of #PARAM2
        ButtonGadget(#BTouvrirFen2, 10,10,100,30, "Ouvrir fen2")
        ButtonGadget(#BTfermerFen1, 10,40,100,30, "Fermer moi")
        Fenetre1Ouverte = #True
        Debug "Fen ouverte 1 : " + Fenetre1Ouverte
        ProcedureReturn Fenetre1Ouverte
    EndIf
EndProcedure

Procedure OuvrirFenetre2()
    If OpenWindow(#Fenetre2, WindowX(#Fenetre1)+302, WindowY(#Fenetre1), 300, 600, "Fenetre 2", #PARAM2) ; <- Try #PARAM here instead of #PARAM2
        ButtonGadget(#BTouvrirFen1, 10,10,100,30, "Ouvrir fen1")
        ButtonGadget(#BTfermerFen2, 10,40,100,30, "Ferme moi")
        Fenetre2Ouverte = #True
        Debug "Fen ouverte 2 : " + Fenetre2Ouverte
        If Fenetre1Ouverte = #True
            DisableGadget(#BTouvrirFen1,1)
        EndIf
        ProcedureReturn Fenetre2Ouverte  
    EndIf
EndProcedure


; -----------------------------------
;            - PROGRAMME - 
; -----------------------------------

OuvrirFenetre1()

Repeat
    
    Event = WaitWindowEvent(20) 
    Fenetre = EventWindow()     
    Gadget =  EventGadget()     
    TypeEvent = EventType()     
    
    Select Event
            
        ;Gestion des actions sur les gadgets    
        Case #PB_Event_Gadget
            Select Gadget
                Case #BTouvrirFen1
                    If Fenetre1Ouverte = #False
                        OuvrirFenetre1()
                        DisableGadget(#BTouvrirFen1,1)
                    Else
                        Debug "Fenêtre 1 déjà ouverte"
                    EndIf
                    
                Case #BTouvrirFen2
                    If Fenetre2Ouverte = #False
                        OuvrirFenetre2()
                        DisableGadget(#BTouvrirFen2,1)
                        Else
                        Debug "Fenêtre 2 déjà ouverte"
                    EndIf
                    
                Case #BTfermerFen1
                    Fenetre1Ouverte = #False 
                    CloseWindow(#Fenetre1)
                    Debug "Fen ouverte 1 : " + Fenetre1Ouverte
                    
                    If Fenetre2Ouverte = #False
                        exit = 1
                    Else
                        DisableGadget(#BTouvrirFen1,0)
                    EndIf
                    
                    
                Case #BTfermerFen2
                    Fenetre2Ouverte = #False 
                    CloseWindow(#Fenetre2)
                    Debug "Fen ouverte 2 : " + Fenetre2Ouverte
      
                    If Fenetre1Ouverte = #False
                        exit = 1
                        Else
                        DisableGadget(#BTouvrirFen2,0)
                    EndIf
                    
            EndSelect
            
        ;Gestion des actions si fermeture des fenêtres    
        Case #PB_Event_CloseWindow 
            Select Fenetre
                Case #Fenetre1
                    Fenetre1Ouverte = #False
                    CloseWindow(#Fenetre1)
                    If Fenetre2Ouverte = #False
                        exit = 1    
                    EndIf
                    
                    
                Case #Fenetre2
                    Fenetre2Ouverte = #False
                    CloseWindow(#Fenetre2)
                    If Fenetre1Ouverte = #False
                        exit = 1    
                    EndIf
            EndSelect
            
    EndSelect
Until exit = 1

End

// Moved from "Bugs - Windows" to "Coding Questions" (Kiffi)

Re: PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 12:31 pm
by Mindphazer
Tested on MacOS and Windows (PB 6.03 and 6.04)
No problem...

Re: PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 12:47 pm
by Caronte3D
What's the sense of the same constant with the "|" (Or) logic? :?

Re: PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 1:50 pm
by ChrisR
It works well here, without memory access bug. Even if #PB_Window_MinimizeGadget = #PB_Window_MinimizeGadget | #PB_Window_MinimizeGadget :!:
You can possibly avoid the 2 global variables Fenetre1Ouverte and Fenetre2Ouverte by replacing them with If (Not) IsWindow(#Fenetre1(2))

Re: PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 2:20 pm
by ar-s
You're right Caronte3D 8)
i removed "param" wich is nonsense.

With that one, i still have random crash when à try "openF2,closeF1, openF1 etc... " after 3 to 10 clics

Code: Select all

; -----------------------------------
;         - INITIALISATION - 
; -----------------------------------

Enumeration Fenetres
    #Fenetre1
    #Fenetre2
EndEnumeration

Enumeration Gadgets
    #BTouvrirFen1
    #BTouvrirFen2
    #BTfermerFen1
    #BTfermerFen2
EndEnumeration

Declare OuvrirFenetre1()
Declare OuvrirFenetre2()

Global.b Fenetre1Ouverte = #False, Fenetre2Ouverte = #False , exit = 0

; -----------------------------------
;            - PROCEDURES - 
; -----------------------------------

Procedure OuvrirFenetre1()
    If OpenWindow(#Fenetre1, 300, 150, 300, 600, "Fenetre 1", #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget) 
        ButtonGadget(#BTouvrirFen2, 10,10,100,30, "Ouvrir fen2")
        ButtonGadget(#BTfermerFen1, 10,40,100,30, "Fermer moi")
        Fenetre1Ouverte = #True
        Debug "Fen ouverte 1 : " + Fenetre1Ouverte
        If Fenetre2Ouverte = #True
             DisableGadget(#BTouvrirFen2,1)
        EndIf
        ProcedureReturn Fenetre1Ouverte
    EndIf
EndProcedure

Procedure OuvrirFenetre2()
    If OpenWindow(#Fenetre2, WindowX(#Fenetre1)+302, WindowY(#Fenetre1), 300, 600, "Fenetre 2", #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget) 
        ButtonGadget(#BTouvrirFen1, 10,10,100,30, "Ouvrir fen1")
        ButtonGadget(#BTfermerFen2, 10,40,100,30, "Ferme moi")
        Fenetre2Ouverte = #True
        Debug "Fen ouverte 2 : " + Fenetre2Ouverte
        If Fenetre1Ouverte = #True
             DisableGadget(#BTouvrirFen1,1)
        EndIf
        ProcedureReturn Fenetre2Ouverte  
    EndIf
EndProcedure


; -----------------------------------
;            - PROGRAMME - 
; -----------------------------------

OuvrirFenetre1()


Repeat
    
    Event = WaitWindowEvent(20) 
    Fenetre = EventWindow()     
    Gadget =  EventGadget()     
    TypeEvent = EventType()     
    
    Select Event
            
        ;Gestion des actions sur les gadgets    
        Case #PB_Event_Gadget
            Select Gadget
                Case #BTouvrirFen1
                    If Fenetre1Ouverte = #False
                        OuvrirFenetre1()
                        DisableGadget(#BTouvrirFen1,1)
                    Else
                        Debug "Fenêtre 1 déjà ouverte"
                    EndIf
                    
                Case #BTouvrirFen2
                    If Fenetre2Ouverte = #False
                        OuvrirFenetre2()
                        DisableGadget(#BTouvrirFen2,1)
                        Else
                        Debug "Fenêtre 2 déjà ouverte"
                    EndIf
                    
                Case #BTfermerFen1
                    Fenetre1Ouverte = #False 
                    CloseWindow(#Fenetre1)
                    Debug "Fen ouverte 1 : " + Fenetre1Ouverte
                    
                    If Fenetre2Ouverte = #False
                        exit = 1
                    Else
                        DisableGadget(#BTouvrirFen1,0)
                    EndIf
                    
                    
                Case #BTfermerFen2
                    Fenetre2Ouverte = #False 
                    CloseWindow(#Fenetre2)
                    Debug "Fen ouverte 2 : " + Fenetre2Ouverte
      
                    If Fenetre1Ouverte = #False
                        exit = 1
                        Else
                        DisableGadget(#BTouvrirFen2,0)
                    EndIf
                    
            EndSelect
            
        ;Gestion des actions si fermeture des fenêtres    
        Case #PB_Event_CloseWindow 
            Select Fenetre
                Case #Fenetre1
                    Fenetre1Ouverte = #False
                    CloseWindow(#Fenetre1)
                    If Fenetre2Ouverte = #False
                        exit = 1    
                    EndIf
                    
                    
                Case #Fenetre2
                    Fenetre2Ouverte = #False
                    CloseWindow(#Fenetre2)
                    If Fenetre1Ouverte = #False
                        exit = 1    
                    EndIf
            EndSelect
            
    EndSelect
Until exit = 1

End

Re: PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 7:02 pm
by ChrisR
Still no crash here after more than 50 clicks and looking through the code, it looks good
It's just missing DisableGadget(#BTouvrirFen1(2),0) also for the #PB_Event_CloseWindow event

Code: Select all

        Case #PB_Event_CloseWindow 
            Select Fenetre
                Case #Fenetre1
                    ..........
                    If Fenetre2Ouverte = #False
                      exit = 1
                    Else
                      DisableGadget(#BTouvrirFen1,0)   ; <==
                    EndIf
                Case #Fenetre2
                    ..........
                    If Fenetre1Ouverte = #False
                      exit = 1
                    Else
                      DisableGadget(#BTouvrirFen2,0)   ; <==
                    EndIf
            EndSelect

Re: PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 8:20 pm
by ChrisR
Tested also with a thread to emulate button clicks, no worries either, no idea why it crashes for you :?:

Code: Select all

Procedure ThreadOuvrirFenetre(*Delay)
  For i = 1 To 50
    PostEvent(#PB_Event_Gadget, #Fenetre1, #BTouvrirFen2, #PB_EventType_LeftClick) : Delay(*Delay)
    PostEvent(#PB_Event_Gadget, #Fenetre1, #BTfermerFen1, #PB_EventType_LeftClick) : Delay(*Delay)
    PostEvent(#PB_Event_Gadget, #Fenetre2, #BTouvrirFen1, #PB_EventType_LeftClick) : Delay(*Delay)
    PostEvent(#PB_Event_Gadget, #Fenetre2, #BTfermerFen2, #PB_EventType_LeftClick) : Delay(*Delay)
  Next
EndProcedure

; -----------------------------------
;            - PROGRAMME - 
; -----------------------------------

OuvrirFenetre1()
CreateThread(@ThreadOuvrirFenetre(), 200)

Re: PB6.03, 6.04 - window parameters generate an error

Posted: Sat Jan 20, 2024 10:19 pm
by ar-s
Hum... that's amazing..
I'll try with a proper install of PB 6.10