PureBasic
https://www.purebasic.fr/french/

Gestion des évènements en PureBasic.
https://www.purebasic.fr/french/viewtopic.php?f=16&t=17091
Page 1 sur 1

Auteur:  selzig [ Sam 16/Déc/2017 15:53 ]
Sujet du message:  Gestion des évènements en PureBasic.

Bonjour, soit le code suivant :

Code:
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:
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

Citation:
[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:
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

Auteur:  Zorro [ Sam 16/Déc/2017 16:44 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

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

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

Auteur:  Zorro [ Sam 16/Déc/2017 16:54 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

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:
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



Auteur:  selzig [ Sam 16/Déc/2017 16:59 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

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

Auteur:  Zorro [ Sam 16/Déc/2017 17:05 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

lorsque je t'ai demandé ce que voulais faire avec ça
Code:
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 ?

Auteur:  selzig [ Sam 16/Déc/2017 17:10 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

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).

Auteur:  selzig [ Sam 16/Déc/2017 17:25 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

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.

Auteur:  selzig [ Sam 16/Déc/2017 17:32 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

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:
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:
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

Auteur:  selzig [ Sam 16/Déc/2017 18:15 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

OK j'ai trouvé une solution :
Code:
; 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

Auteur:  Marc56 [ Sam 16/Déc/2017 18:47 ]
Sujet du message:  Re: Gestion des évènements en PureBasic.

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:

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/