calcul surface d'un rectangle pour me familiariser avec pb .

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par falsam »

klystron a écrit :si je veux avoir des décimales ,les variables en point F , les mots cles protected ne sont plus valable ?
Bien sur que si.

Code : Tout sélectionner

Procedure CalculPerimetre(Longueur.s, Largeur.s)
  Protected AB = Val(Longueur)
  Protected AC = Val(Largeur)
  Protected Resultat.i
  
  Protected BC.i ;C'est la longueur à retrouver
  
  Resultat = Pow(AB,2) + Pow(AC,2)
  
  BC = Sqr(Resultat)
  
  MessageRequester("Résultat de l'opération", Str(AB + BC + AC))
EndProcedure
Dans cet extrait de code, Protected veut simplement dire que le contenu de ta variable ne pourra être lu que dans la procédure CalculPerimetre()
klystron a écrit :si je veux que dés que j'ai entré la dernière valeur( longueur et largeur ), les résultats de la surface et du périmètre s'affichent sans toucher aux deux boutons ?
Lors des explications précédentes tu as appris à détecter quel était le gadget qui a provoqué un événement

avec la fonction EventGadget()

Nous allons voir cette fois-çi que la fonction EventType() permet de savoir quel type d’événement il c'est produit sur un gadget.

Regarde ce code largement commenté

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
EndEnumeration

;Création de la fenetre et des différents gadgets
Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, "Surface d'un triangle rectangle")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
  StringGadget(#Longueur, 120, 30, 80, 22, "", #PB_String_Numeric)

  TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
  StringGadget(#Largeur, 120, 60, 80, 22, "", #PB_String_Numeric)
  
  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule
EndProcedure

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.s, largeur.s)
  Protected AB = Val(Longueur)
  Protected AC = Val(Largeur)
  Protected Resultat.i
  
  Resultat = (AB * AC)/2
  
  SetGadgetText(#Surface, Str(Resultat))
EndProcedure

;Le programme commence ici : On ouvre la fenêtre 
Open_MainForm()

;Boucle événementielle
Repeat 
  Select WaitWindowEvent() ;Un événement est arrivé
    Case #PB_Event_Gadget  ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget() ;Apparemment oui : On cherche qui 
          
        Case #Longueur ;Apparemment c'est le gadget #Longueur qui provoque l’événement
          
          Select EventType() ;Quel type d'évenement il y a eu sur le gadget #Longueur?
            Case #PB_EventType_Focus ;? Le curseur est dans le gadget #Longueur : On ne fera rien
              
            Case #PB_EventType_LostFocus ;? le curseur vient de quitter le gadget #Longueur : On ne fera rien      
              
            Case #PB_EventType_Change ;? il y a du changement dans le gadget : Là ça nous intéresse
              CalculSurface(GetGadgetText(#Longueur), GetGadgetText(#Largeur)) ;On appelle la procédure de calcul de la surface
          EndSelect
          
          
        Case #Largeur ;Apparemment c'est le gadget #Largeur qui provoque l’événement
          
          Select EventType() ;Quel type d’événement il y a eu sur le gadget #largeur?  
            Case #PB_EventType_Change ;? il y a du changement dans le gadget (Inutile de traiter les événements qui ne font pas l'objet de calcul)
              CalculSurface(GetGadgetText(#Longueur), GetGadgetText(#Largeur)) ;On appelle la procédure de calcul de la surface
          EndSelect    
      EndSelect
         
    Case #PB_Event_CloseWindow ;Est ce une fermeture de la fenêtre ?
      End ;Apparemment oui : Fermeture de la fenêtre.
      
  EndSelect
ForEver
Tu remarquera que l'ouverture de la fenêtre est maintenant incluse dans une procédure.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Bonsoir Falsam,
oui ca marche, merci bien.
oui j'ai essayé plusieurs façons , mais je ne suis pas tres doué ...
merci pour ton aide.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par falsam »

klystron a écrit :'ai essayé plusieurs façons , mais je ne suis pas tres doué
Je pense que tu n'as jamais codé auparavant mais rassures toi ..... tout le monde est passé par cette étape :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Je me suis amusé il y a tres longtemps sur GW-basic dans les années 80. avec le ms-dos.
je voudrais me faire un code type pour différents calculs divers, avec toujours le meme type de structure ou presque. alors c'est pourquoi je patoge car je ne connais pas ce language. mais a force de travailler et chercher...
merci pour ta patience.
avec tes infos je vais m'en sortir :D
merci et bonne soirée.
A+
Yves
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

je viens de modifier les variables avec point f pour avoir des décimales , mais je suis bloqué à la ligne 53 ( mauvais type de parametre ) :oops:

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
EndEnumeration

;Création de la fenetre et des différents gadgets
Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, "Surface d'un triangle rectangle")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
  StringGadget(#Longueur, 120, 30, 80, 22, "", #PB_String_Numeric)

  TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
  StringGadget(#Largeur, 120, 60, 80, 22, "", #PB_String_Numeric)
  
  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule
EndProcedure

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB = longueur.f
  Protected AC = largeur.f
  Protected Resultat.f
  
  Resultat.f = (AB * AC)/2
  
  SetGadgetText(#Surface, Str(Resultat.f))
EndProcedure

;Le programme commence ici : On ouvre la fenêtre 
Open_MainForm()

;Boucle événementielle
Repeat 
  Select WaitWindowEvent() ;Un événement est arrivé
    Case #PB_Event_Gadget  ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget() ;Apparemment oui : On cherche qui 
          
        Case #Longueur ;Apparemment c'est le gadget #Longueur qui provoque l’événement
          
          Select EventType() ;Quel type d'évenement il y a eu sur le gadget #Longueur?
            Case #PB_EventType_Focus ;? Le curseur est dans le gadget #Longueur : On ne fera rien
              
            Case #PB_EventType_LostFocus ;? le curseur vient de quitter le gadget #Longueur : On ne fera rien      
              
            Case #PB_EventType_Change ;? il y a du changement dans le gadget : Là ça nous intéresse
              CalculSurface(GetGadgetText(#Longueur), GetGadgetText(#Largeur)) ;On appelle la procédure de calcul de la surface
          EndSelect
          
          
        Case #Largeur ;Apparemment c'est le gadget #Largeur qui provoque l’événement
          
          Select EventType() ;Quel type d’événement il y a eu sur le gadget #largeur?  
            Case #PB_EventType_Change ;? il y a du changement dans le gadget (Inutile de traiter les événements qui ne font pas l'objet de calcul)
              CalculSurface(GetGadgetText(#Longueur), GetGadgetText(#Largeur)) ;On appelle la procédure de calcul de la surface
          EndSelect    
      EndSelect
         
    Case #PB_Event_CloseWindow ;Est ce une fermeture de la fenêtre ?
      End ;Apparemment oui : Fermeture de la fenêtre.
      
  EndSelect
ForEver
; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 52
; Folding = -
; EnableUnicode
; EnableXP
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

Bonjour klystron,

Tu as modifié ta fonction CalculSurface pour qu'elle accepte en entrée des nombres décimaux (.f) à la place d'une chaine (.s)

Code : Tout sélectionner

Procedure CalculSurface(Longueur.f, largeur.f)
Mais, dans ton appel de fonction tu lui donne une chaine, donc il aime pas.

Code : Tout sélectionner

CalculSurface(GetGadgetText(#Longueur), GetGadgetText(#Largeur))
Sachant que GetGadgetText() retourne une chaine, il faut donc faire un transtypage (transformation de type)
avec val() et comme tu veux un décimal il faut utiliser ValF() )
Ta ligne 53 (et 61) deviendraient

Code : Tout sélectionner

CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)))
et c'est pas tout (comme dirait la pub...)
Comme tu veux entrer un nombre avec décimale, il faut aussi libérer la restriction de saisie aux chiffres (isnumeric n'accepte pas le '.')
StringGadget(#Longueur, 120, 30, 80, 22, "", #PB_String_Numeric)
Dans les deux champs de saisie, supprimes ,#PB_String_Numeric

Mais quand tu va lancer, tu verra que le résultat est parfois faux, car il donne toujours un nombre entier, 8)
(d'où l'intérêt de toujours tester à côté)
il faut donc aussi modifier le retour de fonction calculer avec ValF à la place de Val

SetGadgetText(#Surface, StrF(Resultat.f))

et enfin, pour simplifier, sachant que les event sur #Longueur et #Largeur font (presque) la même chose, tu peux les cumuler

Code : Tout sélectionner

Case #Longueur, #Largeur
Prochains exercices à étudier pour toi:
- limiter le nombre de décimales de la sortie résultat (2 ça suffit souvent)
- contrôler les saisies: empêcher d'entrer autre chose que des chiffres et/ou 1 point et limiter la valeur maxi

Un programme est au point quand il ne peut plus générer d'erreur système, c'est à dire que le programmeur a prévu toutes les possibles erreurs de saisies et tous les dépassements de capacité (mémoire, disque, calcul etc)

(ça n'arrive jamais... :mrgreen: )

:wink:
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Bonjour Marc56,
merci pour les modifications sur mon code,
j'ai fais les modifications, mais je n'ai pas le resultat en decimale , j'ai du passé sur une modification ? 8O
il passe en test mais le résultat n'est pas bon.
pour avoir trois chiffres apres la virgule , il faut l'indiqué ou ?
enfin, si je voudrais mettre un bouton CALCUL pour avoir le résultat, ça change tout ?
bonne journée, et merci pour ton aide.
Yves.
voici le code actuellement:

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
EndEnumeration

;Création de la fenetre et des différents gadgets
Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, "Surface d'un triangle rectangle")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
StringGadget(#Longueur, 120, 30, 80, 22, "")

 TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
   StringGadget(#Largeur, 120, 60, 80, 22, "")
  
  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule
EndProcedure

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB = longueur.f
  Protected AC = largeur.f
  Protected Resultat.f
  
  Resultat.f = (AB * AC)/2
  
  SetGadgetText(#Surface, Str(Resultat.f))
EndProcedure

;Le programme commence ici : On ouvre la fenêtre 
Open_MainForm()

;Boucle événementielle
Repeat 
  Select WaitWindowEvent() ;Un événement est arrivé
    Case #PB_Event_Gadget  ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget() ;Apparemment oui : On cherche qui 
          
        Case #Longueur ;Apparemment c'est le gadget #Longueur qui provoque l’événement(
          
          Select EventType() ;Quel type d'évenement il y a eu sur le gadget #Longueur?
            Case #PB_EventType_Focus ;? Le curseur est dans le gadget #Longueur : On ne fera rien
              
            Case #PB_EventType_LostFocus ;? le curseur vient de quitter le gadget #Longueur : On ne fera rien      
              
            Case #PB_EventType_Change ;? il y a du changement dans le gadget : Là ça nous intéresse
              CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)));On appelle la procédure de calcul de la surface
          EndSelect
          
          
        Case #Largeur ;Apparemment c'est le gadget #Largeur qui provoque l’événement
          
          Select EventType() ;Quel type d’événement il y a eu sur le gadget #largeur?  
            Case #PB_EventType_Change ;? il y a du changement dans le gadget (Inutile de traiter les événements qui ne font pas l'objet de calcul)
              CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur))) ;On appelle la procédure de calcul de la surface
          EndSelect    
      EndSelect
         
    Case #PB_Event_CloseWindow ;Est ce une fermeture de la fenêtre ?
      End ;Apparemment oui : Fermeture de la fenêtre.
      
  EndSelect
ForEver
; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 18
; Folding = -
; EnableUnicode
; EnableXP
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

Rahhh, ça a marché tout à l'heure :oops:
J'ai dû oublié un truc le temps d'écrire l'article...
...et j'ai pas sauvegardé
(mes pov' neurones de quinqa sont en mode poisson rouge en ce moment)
:?

Actuellement le calcul se fait tout seul lors de la saisie.
Si tu veux qu'il se fasse sur un bouton, il suffit juste de changer le type d'évènement déclencheur (ce sera boutongadget)
Dernière modification par Marc56 le ven. 05/déc./2014 10:47, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par falsam »

Humm hum il y a quelques erreurs à ne pas commettre :)

Quand tu définis une variable typée il est inutile de le faire à nouveau pour lui affecter une valeur.

Exemple

Code : Tout sélectionner

Global Resultat.i

Resultat.i = 2
Debug Resultat
ça fonctionne c'est vrai, mais inutile.

Il vaut mieux faire

Code : Tout sélectionner

Global Resultat.i

Resultat = 2
Debug Resultat
ça c'est juste un warning :)

Revenons sur le typage avec ton code précédent.

Code : Tout sélectionner

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB = longueur.f
  Protected AC = largeur.f
  Protected Resultat.f
  
  Resultat.f = (AB * AC)/2
  
  SetGadgetText(#Surface, Str(Resultat.f))
EndProcedure
- Tu as en entrée de ta procédure deux variables décimales Longueur.f et largeur.f
- Ton erreur est d'affecter ces valeurs décimales à des valeurs entieres
  Exemple Protected AB = longueur.f
  Dans cet exemple, AB sera une valeur entiére (sans décimale) car tu ne l'as pas typée.
  Si AB reçoit la valeur 2.15 le contenu de AB sera 2.
  longueur étant déclaré dans la définition de ta procédure, il était inutile de déclarer à nouveau son typage.
  Correction : Protected AB.f = longueur

Restitution du résultat.
Le code suivant est incorect

Code : Tout sélectionner

Resultat.f = 2.156
Debug Str(Resultat)
Le résultat sera 2

C'est ce que tu fais dans ta procédure.

Code : Tout sélectionner

SetGadgetText(#Surface, Str(Resultat.f))
Tu vas devoir préciser le format d'affichage.

En reprenant mon code précédent, je vais utiliser la fonction StrF (F comme float) en précisant le nombre de décimal que je souhaite.

Code : Tout sélectionner

Resultat.f = 2.156
Debug StrF(Resultat, 2)
Le résultat sera bien 2.16 (Arrondi décimal supérieur dans mon exemple)
Avec la valeur 2.151, le résultat sera 2.15

A retenir.
:idea: Inutile de préciser à nouveau le typage d'une variable quand elle est déjà déclarée.
:idea: Faire attention au format de sortie en fonction du typage des variables
:idea: L'aide sur les manipulation des variables se trouve sur ce lien par exemple
  http://www.purebasic.com/french/documen ... index.html
Dernière modification par falsam le ven. 05/déc./2014 11:08, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par falsam »

la correction de ton code

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
EndEnumeration

;Création de la fenetre et des différents gadgets
Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, "Surface d'un triangle rectangle")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
  StringGadget(#Longueur, 120, 30, 80, 22, "")

  TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
  StringGadget(#Largeur, 120, 60, 80, 22, "")
  
  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule
EndProcedure

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f
  
  Resultat = (AB * AC)/2 ;Inutile de repeter le typage .f (float) à résultat car déja déclaré
  
  SetGadgetText(#Surface, StrF(Resultat, 2)) ;Affichage du résultat avec 2 décimale
EndProcedure

;Le programme commence ici : On ouvre la fenêtre 
Open_MainForm()

;Boucle événementielle
Repeat 
  Select WaitWindowEvent() ;Un événement est arrivé
    Case #PB_Event_Gadget  ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget() ;Apparemment oui : On cherche qui 
          
        ;Le gadget #Longueur et #largeur faisant appel à la meme procédure, on va simplifier le code.  
        Case #Longueur, #Largeur ;Apparemment c'est le gadget #Longueur ou #largeur qui provoque l’événement
          
          Select EventType() ;Quel type d'évenement il y a eu sur ces deux gadgets?              
            Case #PB_EventType_Change ;? il y a du changement dans le gadget : Là ça nous intéresse
              CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)));On appelle la procédure de calcul de la surface
          EndSelect ;Fin du Seledt EventType()
      EndSelect ;Fin du Seledt EventGadget()
         
    Case #PB_Event_CloseWindow ;Est ce une fermeture de la fenêtre ?
      End ;Apparemment oui : Fermeture de la fenêtre.
      
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Bonjour Falsam et marc56,
merci pour votre aide si précieuse.
oui ça fonctionne bien, je viens de l'essayer.
si , je veux mettre un bouton ( CALCULER ) en bas de la fenetre , pour avoir les résultats , au lieu de calculer aussitôt que la deuxième fenétre renseignée, c'est possible ?
a mon avis cela serait plus sympa.
mais ca change toute la procedure ?...
Yves
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par falsam »

klystron a écrit :pour avoir trois chiffres apres la virgule , il faut l'indiqué ou ?
je te laisse deviner :)
klystron a écrit :si je voudrais mettre un bouton CALCUL pour avoir le résultat, ça change tout ?
ça sert surtout à rien dans le code actuel car le calcul est automatique.
klystron a écrit :mais ca change toute la procedure
la procédure non, mais la gestion des événements oui

PS : Un indice de taille : StrF()
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: calcul surface d'un rectangle pour me familiariser avec

Message par Marc56 »

Variante avec un bouton

(; *** sur les lignes que j'ai ajouté)

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
  #Bouton_Calculer ; *** Déclarer l'ID du bouton Calculer
EndEnumeration

;Création de la fenetre et des différents gadgets
Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, "Surface d'un triangle rectangle")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
  StringGadget(#Longueur, 120, 30, 80, 22, "")

  TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
  StringGadget(#Largeur, 120, 60, 80, 22, "")
 
  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule
  
  ButtonGadget(#Bouton_Calculer, 10, 150, 100, 25, "Calculer") ; *** Le bouton Calculer
EndProcedure

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f
 
  Resultat = (AB * AC)/2 ;Inutile de repeter le typage .f (float) à résultat car déja déclaré
 
  SetGadgetText(#Surface, StrF(Resultat, 2)) ;Affichage du résultat avec 2 décimale
EndProcedure

;Le programme commence ici : On ouvre la fenêtre
Open_MainForm()

;Boucle événementielle
Repeat
  Select WaitWindowEvent() ;Un événement est arrivé
    Case #PB_Event_Gadget  ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget() ;Apparemment oui : On cherche qui
; *** Je désactive ici le déclenchement automatique sur changement de valeur d'un des deux champs		         
;         ;Le gadget #Longueur et #largeur faisant appel à la meme procédure, on va simplifier le code. 
;         Case #Longueur, #Largeur ;Apparemment c'est le gadget #Longueur ou #largeur qui provoque l’événement
;          
;           Select EventType() ;Quel type d'évenement il y a eu sur ces deux gadgets?             
;             Case #PB_EventType_Change ;? il y a du changement dans le gadget : Là ça nous intéresse
;               CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)));On appelle la procédure de calcul de la surface
;           EndSelect ;Fin du Seledt EventType()
;       EndSelect ;Fin du Seledt EventGadget()	
      		
; *** Je provoque le déclenchement par le bouton Calculer
	  	Case #Bouton_Calculer
	    		CalculSurface(ValF(GetGadgetText(#Longueur)), ValF(GetGadgetText(#Largeur)));On appelle la procédure de calcul de la surface
	    EndSelect	
         
    Case #PB_Event_CloseWindow ;Est ce une fermeture de la fenêtre ?
      End ;Apparemment oui : Fermeture de la fenêtre.
     
  EndSelect
ForEver
klystron
Messages : 149
Inscription : mar. 02/déc./2014 12:16

Re: calcul surface d'un rectangle pour me familiariser avec

Message par klystron »

Ok Falsam,
merci je vais réfléchir apres tous les modifs que je viens d'avoir, il me faut un peu de temps pour tout assimiler :D
mais c'est tres enrichissant toutes ces infos pour moi.
bonne journée a vous deux, je vais noter tout ca.
a+
Yves.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: calcul surface d'un rectangle pour me familiariser avec

Message par falsam »

Allez bosses un peu

Objectif.
- Placer un bouton que tu nommes comme tu le souhaites.
- Modifier la boucle événementielle en conséquence.

Le code à compléter.

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
  
  ;A compléter
EndEnumeration

;Création de la fenetre et des différents gadgets
Procedure Open_MainForm()
  OpenWindow(#MaFenetre, 100, 100, 800, 600, "Surface d'un triangle rectangle")

  TextGadget(#PB_Any, 10, 35, 100, 22, "Longueur")
  StringGadget(#Longueur, 120, 30, 80, 22, "")

  TextGadget(#PB_Any, 10, 65, 100, 22, "Largeur")
  StringGadget(#Largeur, 120, 60, 80, 22, "")
  
  TextGadget(#PB_Any, 10, 100, 100, 22, "Surface")
  StringGadget(#Surface, 120, 100, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule
EndProcedure

;Calcul de la surface d'un triangle rectangle
Procedure CalculSurface(Longueur.f, largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f
  
  Resultat = (AB * AC)/2 ;Inutile de repeter le typage .f (float) à résultat car déja déclaré
  
  SetGadgetText(#Surface, StrF(Resultat, 2)) ;Affichage du résultat avec 2 décimale
EndProcedure

;Le programme commence ici : On ouvre la fenêtre 
Open_MainForm()

;Boucle événementielle
Repeat 
  Select WaitWindowEvent() ;Un événement est arrivé
    Case #PB_Event_Gadget  ;Est ce un gadget qui a provoqué l'événement ?
      Select EventGadget() ;Apparemment oui : On cherche qui 
          
          ;A compléter
          ;Quel est le gadget qui provoquera l'appel de la procédure de calcul
          
         
    Case #PB_Event_CloseWindow ;Est ce une fermeture de la fenêtre ?
      End ;Apparemment oui : Fermeture de la fenêtre.
      
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre