Page 1 sur 1

Utilisation des constantes

Publié : ven. 19/janv./2024 10:29
par Philippe_GEORGES
Bonjour à tous,

Je développe des applications avec PureBasic de plus en plus complexes, multifenêtres, aussi bien pour Windows que MacOsX.

Ma question est la suivante : souvent, je rencontre des problèmes du style "fenêtre qui ne se ferme pas", affichage non conforme....etc.

Ces problèmes sont dûs aux Handles des fenêtres, et autre gadgets.

Faut il utiliser des constantes pour les fenêtres et gadgets de manière systématique ? Comment être sûr que les valeurs de ces Handles ne vont pas interférer avec des variables entières déclarées globalement dans l'application ? L'utilisation de enumeration xxxx me pose souvent problème....

Ma question peut sembler un peu simpliste, mais je voudrais l'avis des développeurs très expérimentés, afin d'avoir sur ce point une règle de conduite claire !

Merce d'avance, et si vous avez un exemple de squelette d'application type, celà me rendrait bien service !

Amitiés à tous,

Phil

Re: Utilisation des constantes

Publié : ven. 19/janv./2024 11:35
par Mesa
A priori ce ne sont pas les handles qui sont en cause mais leur gestions par le programmeur, surtout dans la boucle principale.
Utiliser des constantes ou pas ne doit pas générer de problèmes en soi.

M.

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 2:18
par boddhi
Philippe_GEORGES a écrit : Faut il utiliser des constantes pour les fenêtres et gadgets de manière systématique ?
Mon (humble) avis et rien que mon avis...
Dans la mesure du possible, tant que faire se peut, oui. Et avec Enumeration qui, utilisée correctement, garantit qu'il n'y aura pas de doublons de valeurs.
Ca évite également bien des erreurs de typage notamment entre les systèmes 32 et 64 bits, d'affectation de valeurs (sachant que la valeur d'une constante ne peut être modifiée).
Pour ma part, j'évite au maximum de recourir à #PB_Any et à des variables, mais bien évidemment il y a des situations où c'est impossible, principalement lorsqu'on fait appel aux API pour créer des objets.

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 11:22
par Philippe_GEORGES
Merci Boddhi,

Celà confirme ce que je pensais. Je n'ai rencontré des problèmes que très recemment, lors de la création de très grosses applications, avec tout plein de fenêtres !!

Je suis Ok sur le fait qu'il ne faut pas recourrir à #PB_Any, ce qui tombe bien, je n'utilise pas ou très peu les API windows.

Je crée un fichier declarations.pbi avec les énumétations des constantes.

Merci pour ton avis !!

Phil

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 11:38
par Ar-S
Je crois avoir levé un bug concernant la gestion des fenêtres multiples. Je vais poster le code en section bug.
Je vous invite à le tester pour voir si vous avez le même soucis ou si vous remarquez une erreur de ma part.
-> https://www.purebasic.fr/english/viewtopic.php?t=83383

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 13:02
par boddhi
Salut Ar-s
Ar-S a écrit : sam. 20/janv./2024 11:38 Je vous invite à le tester pour voir si vous avez le même soucis ou si vous remarquez une erreur de ma part.
Je ne sais pas quelle(s) séquence(s) de manip(s) il faut effectuer pour obtenir ton erreur mais je n'ai pas eu de plantage.
J'ai ouvert la fenêtre 2 puis fermé les fenêtres une à une sans qu'il y ait de plantage.
De même en modifiant le nom de la constante dans OpenWindow()
Testé avec PB 6.10b2 x64 sous Windows

En revanche, je m'interroge sur ton doublon :
#PARAM = #PB_Window_MinimizeGadget | #PB_Window_MinimizeGadget
Note : Sans vouloir jouer les chieurs :mrgreen:, il y a un léger bug de gestion d'activation/désactivation des boutons quand tu ouvres les 2 fenêtres, tu fermes la fenêtre 1, tu la ré-ouvres alors le bouton 'Ouvrir Fen2" n'est pas désactivé.

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 13:17
par boddhi

Code : Tout sélectionner

Case #BTouvrirFen1
    If Fenetre1Ouverte = #False
        OuvrirFenetre1()
        DisableGadget(#BTouvrirFen1,1)
        DisableGadget(#BTouvrirFen2,1) ; A ajouter
    Else
        Debug "Fenêtre 1 déjà ouverte"
    EndIf
    
Case #BTouvrirFen2
    If Fenetre2Ouverte = #False
        OuvrirFenetre2()
        DisableGadget(#BTouvrirFen2,1)
        DisableGadget(#BTouvrirFen1,1) ; A ajouter
        Else
        Debug "Fenêtre 2 déjà ouverte"
    EndIf

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 17:28
par Ar-S
Le code je l'avais modifié ainsi
Mais j'ai toujours un crash présent si je joue avec les clics sur ouvrir/fermer/ouvrir etc...

Mais je ne veux pas empiéter sur le topic de Philippe_GEORGES

Code : Tout sélectionner

; -----------------------------------
;         - 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)
                    If Fenetre2Ouverte = #False
                        exit = 1
                    Else
                        DisableGadget(#BTouvrirFen1,0)
                    EndIf
                    
                    
                Case #BTfermerFen2
                    Fenetre2Ouverte = #False 
                    CloseWindow(#Fenetre2)
                    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
T'es ; A ajouter ne le sont pas.
Une partie de la gestion des disable est géré dans les procedures
ça évide de DisableGadget(N,1) un gadget déjà disable

-----------------------------------------

Pour réponde à Philippe, concernant les enumération on peut voir que :

Code : Tout sélectionner

;V1
Enumeration WIN
    #WIN0
    #WIN1
EndEnumeration

Enumeration GAD
    #G1
    #G2
    #G3
EndEnumeration

Enumeration Tim
    #MonTimer1
    #MonTimer2
EndEnumeration


Debug #WIN0
Debug #WIN1
Debug #G1
Debug #G2
Debug #G3
Debug #MonTimer1
Debug #MonTimer2

; on se retrouve avec : 0 1 - 0 1 2 et 0 1 
;-------------------------------------------


;V2
Enumeration 
    #WIN00
    #WIN11
EndEnumeration

Enumeration 
    #G11
    #G22
    #G33
EndEnumeration

Enumeration 
    #MonTimer11
    #MonTimer22
EndEnumeration


Debug #WIN00
Debug #WIN11
Debug #G11
Debug #G22
Debug #G33
Debug #MonTimer11
Debug #MonTimer22

; Idem on se retrouve avec : 0 1 - 0 1 2 et 0 1 
;-------------------------------------------




;V3
Enumeration 
    #WIN000
    #WIN111
    #G111
    #G222
    #G333
    #MonTimer111
    #MonTimer222
EndEnumeration


Debug #WIN000
Debug #WIN111
Debug #G111
Debug #G222
Debug #G333
Debug #MonTimer111
Debug #MonTimer222

; Idem on se retrouve avec : 0 1 2 3 4 5 6 (ce qui est OK) 
;-------------------------------------------





;V4
Enumeration 0
    #WIN0000
    #WIN1111
EndEnumeration

Enumeration 5
    #G1111
    #G2222
    #G3333
EndEnumeration

Enumeration 50
    #MonTimer1111
    #MonTimer2222
EndEnumeration

Debug #WIN0000
Debug #WIN1111
Debug #G1111
Debug #G2222
Debug #G3333
Debug #MonTimer1111
Debug #MonTimer2222

; on se retrouve avec : 0 1 5 6 7 50 51 (ce qui est OK aussi) 
;-----------------------------------------------------------
Je ne suis pas adepte du #PB_ANY.
J'avoue que je préfère Enumeration NOMBRE lorsque j'ai de nombreux gadget.

Si je dois traiter une série de gadget (25 checkbox par exemple),
je préfère en amont les enumérer genre
Enumeration 100
#checkB1
#checkB2
#checkB3
etc..
Endenumeration

et de faire un For i = 100 to #checkB3 ....

Certains trouveront ça peut être crade mais ça fonctionne.

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 18:55
par boddhi
Ar-S a écrit : Une partie de la gestion des disable est géré dans les procedures. ça évide de DisableGadget(N,1) un gadget déjà disable
Ok. :wink:

Je vais tester ton autre code dès que je peux...

@Philippe_GEORGES
Pour compléter sur Enumeration, comme le montre aussi l'exemple d'Ar-s, l'intérêt de Enumeration NOMX permet aussi de reprendre une suite de constantes (ou autrement dit, une continuité de valeurs) dans plusieurs fichiers sans qu'il y ait de conflit entre elles.
Perso, j'y recours systématiquement dès lors qu'il y a un risque de redondance d'affectation déclarative (fenêtres, gadgets, images, timers, fichiers, polices, etc.)

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 19:52
par boddhi
@Ar-s

J'ai eu beau triturer ton appli dans tous les sens, je n'ai pas réussi à obtenir de plantage. (Toujours sous PB610b2-x64/Win10-x64)
Après, je me doute, que le code que tu as posté n'est qu'un bout de code incomplet...

Je suis parfois confronté à ce genre de situations (dont une qui me gave méchamment en ce moment) où une erreur se produit dans un code complet et ne se reproduit pas dans un code épuré...

Re: Utilisation des constantes

Publié : sam. 20/janv./2024 22:17
par Ar-S
Non non justement, c'est juste un exemple, et c'est en faisant cet exemple que je me suis aperçu de ça.

Re: Utilisation des constantes

Publié : dim. 21/janv./2024 4:11
par boddhi
Sous quelle version de PB l'exécutes-tu ?

Edit : Oupps, je viens de voir la réponse sur le forum anglais :wink: