Utilisation des constantes
- Philippe_GEORGES
- Messages : 140
- Inscription : mer. 28/janv./2009 13:28
Utilisation des constantes
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
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
Philippe GEORGES
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
Re: Utilisation des constantes
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.
Utiliser des constantes ou pas ne doit pas générer de problèmes en soi.
M.
-
- Messages : 604
- Inscription : lun. 26/avr./2010 16:14
- Localisation : S 48° 52' 31'' / O 123° 23' 33''
Re: Utilisation des constantes
Mon (humble) avis et rien que mon avis...Philippe_GEORGES a écrit : Faut il utiliser des constantes pour les fenêtres et gadgets de manière systématique ?
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.
- Philippe_GEORGES
- Messages : 140
- Inscription : mer. 28/janv./2009 13:28
Re: Utilisation des constantes
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
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
Philippe GEORGES
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
Re: Utilisation des constantes
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
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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
-
- Messages : 604
- Inscription : lun. 26/avr./2010 16:14
- Localisation : S 48° 52' 31'' / O 123° 23' 33''
Re: Utilisation des constantes
Salut Ar-s
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 :
, 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é.
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.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.
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 :
Note : Sans vouloir jouer les chieurs#PARAM = #PB_Window_MinimizeGadget | #PB_Window_MinimizeGadget

-
- Messages : 604
- Inscription : lun. 26/avr./2010 16:14
- Localisation : S 48° 52' 31'' / O 123° 23' 33''
Re: Utilisation des constantes
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
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
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 :
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.
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
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)
;-----------------------------------------------------------
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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
-
- Messages : 604
- Inscription : lun. 26/avr./2010 16:14
- Localisation : S 48° 52' 31'' / O 123° 23' 33''
Re: Utilisation des constantes
Ok.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

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.)
-
- Messages : 604
- Inscription : lun. 26/avr./2010 16:14
- Localisation : S 48° 52' 31'' / O 123° 23' 33''
Re: Utilisation des constantes
@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é...
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
Non non justement, c'est juste un exemple, et c'est en faisant cet exemple que je me suis aperçu de ça.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
-
- Messages : 604
- Inscription : lun. 26/avr./2010 16:14
- Localisation : S 48° 52' 31'' / O 123° 23' 33''
Re: Utilisation des constantes
Sous quelle version de PB l'exécutes-tu ?
Edit : Oupps, je viens de voir la réponse sur le forum anglais
Edit : Oupps, je viens de voir la réponse sur le forum anglais
