Page 1 sur 1

Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 15:53
par selzig
Bonjour, soit le code suivant :

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #WdwMain
EndEnumeration

Global WdwLargeur.i = 800 ; La Largeur de la fenêtre.
Global WdwHauteur.i = 600 ; La Hauteur de la fenêtre.
Global WdwOptions.i = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered

Global uX.i ; Espace entre 2 lignes verticales.
Global uY.i ; Espace entre 2 lignes horizontales.

Declare Exit()
Declare Paint()

Procedure WdwMain()
    
  ; Ouverture de la fenêtre.
  OpenWindow(#WdwMain, 0, 0, WdwLargeur, WdwHauteur, "Représentation graphique", WdwOptions.i)
      
  ; On place un Callback pour la fermeture de la fenêtre.
  BindEvent(#PB_Event_CloseWindow, @Exit(), #WdwMain)
  ; On place un Callback pour le repaint de la fenêtre.
  BindEvent(#PB_Event_SizeWindow, @Paint(), #WdwMain)
  
  Paint();
 
EndProcedure

Procedure Exit()
  End
EndProcedure

Procedure Paint()
  uX.i = Int(WindowWidth(EventWindow())/10)
  uY.i = Int(WindowHeight(EventWindow())/10)
EndProcedure

; Ouverture de la fenêtre.
WdwMain()

Repeat
   WaitWindowEvent(1)
ForEver
Cela passe.

Je rajoute la déclaration (uniquement la déclaration) de ma fameuse fenêtre de correction de bug pour le dualscreen

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #WdwGosht
  #WdwMain
EndEnumeration

Global WdwLargeur.i = 800 ; La Largeur de la fenêtre.
Global WdwHauteur.i = 600 ; La Hauteur de la fenêtre.
Global WdwOptions.i = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered

Global uX.i ; Espace entre 2 lignes verticales.
Global uY.i ; Espace entre 2 lignes horizontales.

Declare Exit()
Declare Paint()

Procedure WdwMain()
    
  ; Ouverture de la fenêtre.
  OpenWindow(#WdwMain, 100, 100, WdwLargeur, WdwHauteur, "Représentation graphique", WdwOptions.i)
      
  ; On place un Callback pour la fernmeture de la fenêtre.
  BindEvent(#PB_Event_CloseWindow, @Exit(), #WdwMain)
  ; On place un Callback pour le repaint de la fenêtre.
  BindEvent(#PB_Event_SizeWindow, @Paint(), #WdwMain)
  
  Paint();
  
EndProcedure

Procedure Exit()
  End
EndProcedure

Procedure Paint()
  uX.i = Int(WindowWidth(EventWindow())/10)
  uY.i = Int(WindowHeight(EventWindow())/10)
EndProcedure

; Ouverture de la fenêtre.
WdwMain()

Repeat
   WaitWindowEvent(1)
ForEver
[15:44:38] Waiting for executable to start...
[15:44:38] Executable type: MacOSX - x64 (64bit, Unicode)
[15:44:38] Executable started.
[15:44:38] [ERROR] Line: 29
[15:44:38] [ERROR] The specified #Window is not initialised.
Je corrige le tir :

Code : Tout sélectionner

EnableExplicit

Enumeration Window
  #WdwGosht
  #WdwMain
EndEnumeration

Global WdwLargeur.i = 800 ; La Largeur de la fenêtre.
Global WdwHauteur.i = 600 ; La Hauteur de la fenêtre.
Global WdwOptions.i = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered

Global uX.i ; Espace entre 2 lignes verticales.
Global uY.i ; Espace entre 2 lignes horizontales.

Declare Exit()
Declare Paint()


Procedure WdwMain()
    
  ; Ouverture de la fenêtre.
  OpenWindow(#WdwMain, 100, 100, WdwLargeur, WdwHauteur -1, "Représentation graphique", WdwOptions.i)
      
  ; On place un Callback pour la fernmeture de la fenêtre.
  BindEvent(#PB_Event_CloseWindow, @Exit(), #WdwMain)
  ; On place un Callback pour le repaint de la fenêtre.
  BindEvent(#PB_Event_SizeWindow, @Paint(), #WdwMain)
  
  WdwHauteur = WdwHauteur +1;
  ResizeWindow(#WdwMain, #PB_Ignore, #PB_Ignore, #PB_Ignore, WdwHauteur) (avec une hauteur différente pour Repaint()
 
EndProcedure

Procedure Exit()
  End
EndProcedure

Procedure Paint()
  uX.i = Int(WindowWidth(EventWindow())/10)
  uY.i = Int(WindowHeight(EventWindow())/10)
EndProcedure

; Ouverture de la fenêtre.
WdwMain()

Repeat
   WaitWindowEvent(1)
ForEver
Mais je ne comprends pas : L'événement Paint() associé à #WdwMain est déclaré avant son appel. Pourquoi dans un langage événementiel n'est-il pas (effectivement ou correctement) associé au moment où je l'appelle c'est à dire après ?

Merci pour vous lumières. Gilles

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 16:44
par Zorro
Excuse moi , mais t'as voulu faire quoi avec ça ?

Code : Tout sélectionner

	uX.i = Int(WindowWidth(EventWindow())/10)

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 16:54
par Zorro
essayes ceci : (je n'ai pas de MAc , et pas 2 ecrans )
il faut borner tes fonctions lorsque tu n'es pas sur qu'elles aboutissent
avec des "Is****" , ici IsWindows evite le crash

de plus tu veux connaitre le numero de la dernière fenêtre utilisée , c'est donc dans la boucle principale que
ça doit se passer ....

de plus , si tu utilises "Declare" , ben tes procédures , il vaut mieux les mettre en fin de code
APRES la boucle d'event .....
dans une zone "Zone des Procedures" comme ça c'est clair .....

en clair, Creer bien tes sections de codes, ça permet d"y voir clair

ps: je ne suis pas un fan des fonctions Bind()
je préfère la méthode ancienne des événements gérés dans la boucle principal
avec des sous section par gadgets , plutot que par des bind()
les callback , je les réserve a des événements spéciaux

voici

Code : Tout sélectionner

EnableExplicit
;-Enumerations
Enumeration Window
		#WdwGosht
		#WdwMain
EndEnumeration

;-declaration des variables
Global WdwLargeur.i = 800 ; La Largeur de la fenêtre.
Global WdwHauteur.i = 600 ; La Hauteur de la fenêtre.
Global WdwOptions.i = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered

Global uX.i ; Espace entre 2 lignes verticales.
Global uY.i ; Espace entre 2 lignes horizontales.

Global Num_window

;-declarations des procedures
Declare paint()
Declare wdwmain()
Declare exit()





; Ouverture de la fenêtre.
WdwMain()
Paint();

; ********** boucle principale *****
;-boucle principale
Repeat
		WaitWindowEvent(1)
		Num_window=EventWindow()  ;< aJoout Zorro , ainsi tu es sur de connaitre le numero de la derniere fenetre utilisé
ForEver 
; **********************************



;-zone procedures
; *************** Zone des Procedures ******************************
Procedure Paint()		
		if IsWindow(Num_window) ; Ajout Zorro 		
				uX.i = Int(WindowWidth(	Num_window)/10)
				uY.i = Int(WindowHeight(	Num_window)/10)		
		Endif
EndProcedure
;
Procedure WdwMain()   
;-WdwMain()   
		; Ouverture de la fenêtre.
		OpenWindow(#WdwMain, 100, 100, WdwLargeur, WdwHauteur, "Représentation graphique", WdwOptions.i)		
		; On place un Callback pour la fernmeture de la fenêtre.
		BindEvent(#PB_Event_CloseWindow, @Exit(), #WdwMain)
		; On place un Callback pour le repaint de la fenêtre.
		BindEvent(#PB_Event_SizeWindow, @Paint(), #WdwMain)
EndProcedure
;
Procedure Exit()
		End
EndProcedure



Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 16:59
par selzig
Bonjour,

Ceci (en version PB)
Image

C'est un logiciel entrainant des élèves à donner l'équation d'une droite en quelques secondes (une dizaine au plus) ou d'en construire une également en quelques secondes quelque soit son équation. J'avais remarqué qu'ils mettaient moins de temps à déterminer l'équation d'une tangente en un point d'une courbe qu'à la tracer... Donc comme je suis resté en contact, je ne serais pas mécontent
  • de fournir un exécutable autonome de quelques octets avec PureBasic
  • de transcrire le programme avec SpiderBasic en androïd.app ou iOS.app.
Donc le /10 est à titre de test parce qu'en réalité, le nombre d'intervalles du repère est calculer pour que les élèves aient des valeurs entières sur lesquelles s'appuyer pour déterminer l'équation.

Merci pour la structure et les conseils. Je regarde cela tout de suite.
Voilà. Cordialement. Gilles

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 17:05
par Zorro
lorsque je t'ai demandé ce que voulais faire avec ça

Code : Tout sélectionner

 uX.i = Int(WindowWidth(EventWindow())/10)
je parlais de la ligne de code ;)

bon je t'ai mis un exemple de code ci dessus, ça marche ?

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 17:10
par selzig
Désolé, je n'avais pas compris le sens de votre question.

Alors techniquement, lorsque la fenêtre est redessinée (i.e. quand l'élève veut l'agrandir ou la diminuer ou qu'en phase de test, le programme passe à la question suivante), il faut que le repère suive, la droite, la taille et le positionnement de l'écriture, les flèches... donc il faut recalculer beaucoup de choses en réalité.

Pour l'exemple, je demande un petit peu de temps. Il faut que je le réplique dans mon code actuel qui est plus avancé. Je pose les questions que j'ai en réserve dans mes périodes de pause (de pause café voulais-je dire).

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 17:25
par selzig
Votre exemple fonctionne mais pour l'instant, j'obtiens la même erreur quand je l'intègre à mon source. Je cherche où je me suis planté dans l'intégration.

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 17:32
par selzig
Alors OK, je vois le problème mais pas la solution : J'avais oublié d'intégrer la ligne conditionnelle dans la procédure Paint()

Code : Tout sélectionner

Procedure Paint()
If IsWindow(Num_window) ; Ajout Zorro  
Or elle retourne false (donc la fenêtre n'est pas redessinée et évidemment il n'y a pas de plantage), y compris dans votre code :

Code : Tout sélectionner

Procedure Paint()      
      If IsWindow(Num_window) ; Ajout Zorro       
            uX.i = Int(WindowWidth(   Num_window)/10)
            uY.i = Int(WindowHeight(   Num_window)/10)      
          Else
            Debug "False"
      EndIf
EndProcedure
J'entrevoyais une explication à laquelle je n'avais pas pensé : éventuellement l'ordre de déclaration des procédures parce qu'en Qt et en Pascal Objet quand une méthode est déclarée dans une classe, l'ordre importe peu. Chacun y retrouve ses "petits". D'ailleurs il faudra que je fasse attention à cela avec PB. Je ne sais pas si l'ordre des Declare est impératif ou pas.

Cordialement. Gilles

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 18:15
par selzig
OK j'ai trouvé une solution :

Code : Tout sélectionner

 ; Ouverture de la fenêtre.
WdwMain()
WindowEvent()  ; A ajouter
Paint()
Merci beaucoup pour votre aide et vos conseils précieux de structuration du code. Avec les classes, on ne fait plus vraiment attention.
A bientôt. Gilles

Re: Gestion des évènements en PureBasic.

Publié : sam. 16/déc./2017 18:47
par Marc56
L'ordre des déclaration de procédure n'a pas d'importance. Les déclarations de procédures sont d'ailleurs facultatives à condition de pourvoir les créer dans l'ordre d'utilisation, ce qui n'est pas toujours possible.

:idea: Prends l'habitude de cliquer sur les mots clé dans le code (même si tu en connais la syntaxe dans d'autres langages) et d'appuyer sur F1, l'aide PB est excellente (c'est rare même sur les langages pro)

Exemple pour le mot clé Declare:
Dans certains cas, une procédure peut appeler une autre procédure qui n'a pas été déclarée avant sa propre définition. Ce cas peut se produire et provoquer une erreur de compilation. Declare permet de traiter ce cas particulier en déclarant seulement l'en-tête de la procédure. Il est essentiel que les attributs de la fonction Declare et la déclaration réelle de la procédure soient identiques (type et ValeurParDefaut compris).

:wink: