PureBasic

Forums PureBasic
Nous sommes le Ven 20/Avr/2018 21:02

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 
Auteur Message
 Sujet du message: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 15:53 
Hors ligne

Inscription: Sam 11/Juil/2009 9:34
Messages: 68
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 16:44 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1890
Excuse moi , mais t'as voulu faire quoi avec ça ?

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

_________________
Image
Image
Site: http://michel.dobro.free.fr
Twitch : https://www.twitch.tv/dobro013


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 16:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1890
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



_________________
Image
Image
Site: http://michel.dobro.free.fr
Twitch : https://www.twitch.tv/dobro013


Dernière édition par Zorro le Sam 16/Déc/2017 17:04, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 16:59 
Hors ligne

Inscription: Sam 11/Juil/2009 9:34
Messages: 68
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 édition par selzig le Sam 16/Déc/2017 17:07, édité 3 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 17:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1890
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 ?

_________________
Image
Image
Site: http://michel.dobro.free.fr
Twitch : https://www.twitch.tv/dobro013


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 17:10 
Hors ligne

Inscription: Sam 11/Juil/2009 9:34
Messages: 68
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).


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 17:25 
Hors ligne

Inscription: Sam 11/Juil/2009 9:34
Messages: 68
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 17:32 
Hors ligne

Inscription: Sam 11/Juil/2009 9:34
Messages: 68
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 18:15 
Hors ligne

Inscription: Sam 11/Juil/2009 9:34
Messages: 68
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gestion des évènements en PureBasic.
MessagePosté: Sam 16/Déc/2017 18:47 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1236
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:

_________________
Windows 10 x64 - CPU intel i3 - RAM 16Go - Video NVidia GT 620 - 1920x1080
Linux Slackware et Debian 64bits / xfce - (VirtualBox 5)


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 10 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye