Page 6 sur 10

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

Publié : ven. 05/déc./2014 11:20
par klystron
Merci Marc56 de ta modif, oui c'est bon

Marc56 m'a donné une solution pour l'ajout du bouton calculer 8O

merci

je vais noté tout ça , cela me servira de model .

merci Falsam et Marc56 pour m'avoir aider un maximum.

bonne journée a vous deux.
je dois m'absenter pour la matinée, je vous reverrais en fin d'apres-midi.
encore merci pour tout.

Yves, A+

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

Publié : ven. 05/déc./2014 11:26
par Marc56
(mince, j'aurais dû te laisser bosser :oops: )

Une chose à considérer: Déclencher le calcul sur #PB_EventType_Change est bien pour avoir un affichage en temps réel, mais le problème est que la procédure se déclenche à chaque nouveau caractère entré (on peut le voir en mettant un affichage de debug dans la procédure). Donc si on met 15 chiffres, on déclenche 15 fois la procédure! (dans un petit programme ça se voit pas, mais toujours considérer la possible évolution)

Il est préférable de déclencher sur ordre (ex: un bouton) ou sur perte de focus.

Par contre le déclenchement sur #PB_EventType_Change peut être très utile pour faire un contrôle de saisie en temps réel (c'est ce qu'on fait sur un programme pro). Comme contrôler que l'utilisateur n'entre que des chiffres et/ou un point et vérifier le nombre de caractères entrés

On peut même s'en servir pour passer automatiquement au champs suivant

si #PB_EventType_Change
0 à 9 et '.' = OK
Chr(13) = Entrée = Passer au champ suivant
si Chr(13) et qu'on est sur le deuxième champs alors calculer.

:wink:

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

Publié : ven. 05/déc./2014 11:28
par falsam
Je n'avais pas vu la réponse de Marc.

@Marc56: klystron étant débutant en programmation, le but de ma démarche depuis le premier message était de lui montrer progressivement comment fonctionne Pure Basic.

Bien sur que je pouvais donner une réponse à klystron avec des codes tout fait, mais c'est peu didacticiel. :)

Redit :
Marc56 a écrit :(mince, j'aurais dû te laisser bosser )
Oui mais rien de grave.

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

Publié : ven. 05/déc./2014 11:30
par klystron
Merci Marc56
non, mais je vais regardé tout ca a tete reposée, pour moi je découvre tout en purebasic, :D
a+

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

Publié : ven. 05/déc./2014 11:32
par falsam
@klystron : As tu une version d'évaluation de Pure Basic ? ou une version commerciale ?

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

Publié : ven. 05/déc./2014 11:32
par Marc56
Je te laisse continuer :wink:

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

Publié : ven. 05/déc./2014 11:39
par falsam
Marc56 a écrit :Je te laisse continuer :wink:
Non non je ne souhaites pas du tout être le seul au contraire. Juste que chacun continue dans cette même démarche quand il s'agit d'un débutant.

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

Publié : ven. 05/déc./2014 11:42
par klystron
Falsam,

j'ai une version de PB commerciale oui.
je vais réfléchir pour ajouter au programme code pour y mettre le calcul de l'hypoténuse , et aussi du périmètre , soit deux cases de plus , c'est mon challange :D
Yves,A+

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

Publié : ven. 05/déc./2014 11:52
par Marc56
falsam a écrit :Non non je ne souhaites pas du tout être le seul au contraire. Juste que chacun continue dans cette même démarche quand il s'agit d'un débutant.
OK, c'est effectivement la bonne méthode d'apprentissage.
Je donnerais juste des conseils, mais pas la soluce :wink:

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

Publié : ven. 05/déc./2014 20:27
par klystron
Bonsoir,
j'ai commencé pour modifier mon petit code , mais j'ai une erreur a la page 79 variable déjà déclarée BC l'hypotenuse il faut pourtant prendre BC pour faire le calcul du perimetre du triangle ,amoins de mettre une autre variable ?

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
  #Hypotenuse
  #Perimetre
  #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, " -Elements 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
  

  TextGadget(#PB_Any, 10, 135, 100, 22, "Hypotenuse")
  StringGadget(#Hypotenuse, 120, 135, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule


  TextGadget(#PB_Any, 10, 170, 100, 22, "Perimetre")
  StringGadget(#Perimetre, 120, 170, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule



  ButtonGadget(#Bouton_Calculer, 10, 220, 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, 3)) ;Affichage du résultat avec 3 décimales
EndProcedure



; calcul de l'ypotenuse 

;********************avoir si ok ****************************************
Procedure Calculhypetenuse(Longueur.f, Largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f
  
  Protected BC.f     ;C'est la longueur de l'hypotenuse à retrouver
  
  Resultat = Pow(AB,2) + Pow(AC,2)    ; puissances 2
  
  BC = Sqr(Resultat)    ; racine carree
  
  SetGadgettext(#Hypotenuse,Strf(BC,3))     ;affichage du resultat avec 3 decimales
EndProcedure
;**************************************************************


; calcul du perimetre du triangle

;********************avoir si ok ****************************************
Procedure Calculperimetre(Longueur.f, Largeur.f,BC.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected BC.f = hypotenuse
  Protected Resultat.f
  
  Resultat = AB + AC + BC
  
    
  SetGadgettext(#perimetre,Strf(Resultat,3))     ;affichage du resultat avec 3 decimales
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


; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 68
; FirstLine = 32
; Folding = -
; EnableUnicode
; EnableXP

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

Publié : ven. 05/déc./2014 21:46
par Micoute
Bonsoir klystron,

à la ligne 75, remplace BC par hypothenuse et ça fonctionnera !

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

Publié : ven. 05/déc./2014 21:52
par klystron
Bonsoir Micoute,
merci pour l'info, je vais faire l'essai.
a+

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

Publié : ven. 05/déc./2014 22:11
par Ollivier
Bonjour Klystron,

bienvenu sur le site.

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

Publié : ven. 05/déc./2014 22:12
par klystron
Je viens de modifier une partie de mon petit code, je ne sais pas si c'est bon, il passe en test mais bon...
reste le plus difficile pour moi, afficher les valeurs dans les bonnes cases :D
là c'est pas gagner.

Code : Tout sélectionner

Enumeration Window
  #MaFenetre
EndEnumeration

Enumeration Gadget
  #Longueur
  #Largeur
  #Surface
  #Hypotenuse
  #Perimetre
  #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, " -Elements 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
  

  TextGadget(#PB_Any, 10, 135, 100, 22, "Hypotenuse")
  StringGadget(#Hypotenuse, 120, 135, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule


  TextGadget(#PB_Any, 10, 170, 100, 22, "Perimetre")
  StringGadget(#Perimetre, 120, 170, 80, 22, "", #PB_String_ReadOnly) ;Ce gadget sera en lecture seule



  ButtonGadget(#Bouton_Calculer, 10, 220, 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, 3)) ;Affichage du résultat avec 3 décimales
EndProcedure



; calcul de l'ypotenuse 

Procedure Calculhypotenuse(Longueur.f, Largeur.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected Resultat.f
  
  Protected BC.f     ;C'est la longueur de l'hypotenuse à retrouver
  
  Resultat = Pow(AB,2) + Pow(AC,2)    ; puissances 2
  
  BC = Sqr(Resultat)    ; racine carree
  
  SetGadgetText(#Hypotenuse,StrF(BC,3))     ;affichage du resultat avec 3 decimales
EndProcedure



; calcul du perimetre du triangle


Procedure Calculperimetre(Longueur.f, Largeur.f,BC.f)
  Protected AB.f = longueur
  Protected AC.f = largeur 
  Protected Resultat.f
  
  Resultat = AB + AC + BC
  
    
  SetGadgetText(#perimetre,StrF(Resultat,3))     ;affichage du resultat avec 3 decimales
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


; IDE Options = PureBasic 5.31 (Windows - x64)
; CursorPosition = 81
; FirstLine = 65
; Folding = -
; EnableUnicode
; EnableXP

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

Publié : ven. 05/déc./2014 22:13
par falsam

Code : Tout sélectionner

Procedure Calculperimetre(Longueur.f, Largeur.f,BC.f)
  Protected AB.f = longueur
  Protected AC.f = largeur
  Protected BC.f = hypotenuse
A la compilation le message d'erreur est pourtant clair.

:idea: Une variable ne peut pas être déclarée deux fois.

Dans cet extrait tu déclares BC en entrée de procédure et en variable interne à la procédure.

Pas d'inquiétude ....ça va venir :)

Tes variables peuvent se nommer comme tu veux

Code : Tout sélectionner

;********************avoir si ok ****************************************
Procedure Calculperimetre(Pomme.f, Poire.f, Abricot.f)
  Protected AB.f = Pomme
  Protected AC.f = Poire
  Protected BC.f = Abricot
  
  Protected Resultat.f
  
  Resultat = AB + AC + BC
  
    
  SetGadgetText(#perimetre,StrF(Resultat,3))     ;affichage du resultat avec 3 decimales
EndProcedure
et ça fonctionne aussi :)