Gestion des évènements en PureBasic.

Codes specifiques à MacOS X
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Gestion des évènements en PureBasic.

Message 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
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Gestion des évènements en PureBasic.

Message par Zorro »

Excuse moi , mais t'as voulu faire quoi avec ça ?

Code : Tout sélectionner

	uX.i = Int(WindowWidth(EventWindow())/10)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Gestion des évènements en PureBasic.

Message 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


Dernière modification par Zorro le sam. 16/déc./2017 17:04, modifié 2 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Gestion des évènements en PureBasic.

Message 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
Dernière modification par selzig le sam. 16/déc./2017 17:07, modifié 3 fois.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Gestion des évènements en PureBasic.

Message 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 ?
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Gestion des évènements en PureBasic.

Message 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).
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Gestion des évènements en PureBasic.

Message 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.
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Gestion des évènements en PureBasic.

Message 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
selzig
Messages : 68
Inscription : sam. 11/juil./2009 9:34

Re: Gestion des évènements en PureBasic.

Message 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
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Gestion des évènements en PureBasic.

Message 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:
Répondre