fenetre pour entrer valeurs et calcul

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Laser_bleu

fenetre pour entrer valeurs et calcul

Message par Laser_bleu »

bonjour, je suis novice, j'aimerais avoir un exemple de fenetre de sortie pour entrer une valeur dans un rectangle approprié et une sortie de calcul par exemple dans un autre rectangle de cette fenetre , merci par avance.

laser_bleu :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: fenetre pour entrer valeurs et calcul

Message par Ar-S »

Laser_bleu a écrit :bonjour, je suis novice, j'aimerais avoir un exemple de fenetre de sortie pour entrer une valeur dans un rectangle approprié et une sortie de calcul par exemple dans un autre rectangle de cette fenetre , merci par avance.

laser_bleu :wink:
Salut, j'ai rien compris à ce que tu veux...

En gros tu veux deux string gadget, un pour entrer des valeurs et l'autre pour afficher des resultats ??
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Sans déconner, comment tu veux répondre à cà? 8O
Maintenant il faut être doué en programmation et avoir une licence en lettres option ingénierie inversée pour comprendre cette langue inconnue venue d'ailleurs... :?
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
SpaceMan
Messages : 290
Inscription : mar. 26/oct./2004 19:35
Contact :

Message par SpaceMan »

Slt Laser_bleu !
j'ai essayé de lire dans tes pensées car j'ai pas bien compris ce que tu voulais.
tu dois garder quelque chose de très important si tu veux apprendre à programmer :
1. Lire l'aide de PureBasic afin d'avoir une bonne base(c'est primordial)
2. faire tout pour comprendre les exemples données dans l'aide
3. Poser clairement des questions
il n'ya que des gens bien ici. Et ils ne demandent qu'à aider donc la balle est dans ton camp
voici un exemple de code quand j'avais débuté. j'ai éssayé de le commenter afin qu'il soit un peu plus comprehensible pour toi

Code : Tout sélectionner

Enumeration 
  #window_0 
  #bouton_1 
  #bouton_2 
  #bouton_3 
  #Gadget 
  #chaine_1 
  #chaine_2 
  #chaine_3
  #Text 
  #Text_0 
  #Text_1 
EndEnumeration 

Enumeration
#font
EndEnumeration

;ces valeurs seront accessibles dans tous le code
Global Resultat.l 
Global Resultat2.l 
Global Resultat$ 
Global Resultat2$ 

If OpenWindow(#window_0, 443, 86, 350, 260, "Davida", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar) 
   
    ; pour afficher les cases dans lesquelles s'affichent les valleurs
    ; " #PB_String_ReadOnly " ----> pour signifier que cette case ne pourra pas etre écrit(donc lecture seule)
    ; " #PB_String_Numeric  " ----> pour signifier que cette case ne contiendra que des valeurs numériques
    
    StringGadget(#chaine_1, 220, 35, 110, 25, "", #PB_String_ReadOnly | #PB_Text_Right) 
    StringGadget(#chaine_2, 220, 95, 110, 25, "", #PB_String_ReadOnly | #PB_Text_Right) 
    StringGadget(#chaine_3, 220, 155, 110, 25, "0", #PB_String_Numeric | #PB_Text_Right) 
  
    ButtonGadget(#bouton_1, 230, 220, 110, 22, "Quitter") ;pour créer le bouton "Quitter"
    ButtonGadget(#bouton_2, 10, 220, 110, 22, "Commencer", #PB_EventType_LeftClick) 
    ButtonGadget(#bouton_3, 120, 220, 110, 22, "Verifier") 
    TextGadget(#Text, 100, 40, 160, 20, "1er Nombre :")  ; pour afficher le texte "1er Nombre :"
    TextGadget(#Text_0, 90, 105, 170, 20, "2ème Nombre :") 
    TextGadget(#Text_1, 125, 165, 55, 20, "Resultat :") 
    TextGadget(#Text_0, 185, 65, 20, 20, "+") 
    
EndIf 

;cette partie permet de choisir les valeurs à afficher pour les operérations
;ces valeurs sont choisies de façon allétoire.
;la premiere valeur est comprise entre 0 et 7000
;la premiere valeur est comprise entre 0 et 4560
;juste des valeurs prises au hasard

Procedure Autres_operations() 
  Autres_operations : 
  Resultat.l = Random(7000) 
  Resultat2.l = Random(4560) 
  Resultat$ = Str (Resultat.l) 
  Resultat2$ = Str (Resultat2.l) 
  
  SetGadgetText(#chaine_1, Str (Val(Resultat$))) 
  SetGadgetText(#chaine_2, Str (Val(Resultat2$))) 
  DisableGadget(#bouton_2, 1) 
EndProcedure 


Repeat 
  EventID = WaitWindowEvent() 
  If Event = #PB_Event_Gadget 
  EndIf 
  Select EventID ; Gadget() 
    Case #PB_Event_Gadget 
      Select EventGadget() 
          
        Case 1 : Event = #bouton_1 
          
          
          ; Affichage des nombres alléatoires 
        Case 2 : Evebt = #bouton_2 
          Autres_operations() 
          
          
        Case 3 : Event3 = #bouton_3 
          ;un message à afficher si l'utilisateur ne met rien dans la case et clique sur le bouton 
          ;Vérifier
          If GetGadgetText(#chaine_3) = "0" Or GetGadgetText(#chaine_3) = "" 
            MessageRequester("Désolé", "La case est vide,Entrez d'abord votre réponse.", #PB_MessageRequester_Ok) 
            
          Else 
            
            nombre + 1 
            
            If nombre = 5 ;pour limiter le nombre d'opération à 5
              MessageRequester("Désolé", "Toutes les opérations sont terminées.", #PB_MessageRequester_Ok) 
              DisableGadget(#bouton_2, 0) 
              
            Else 
                ; si le resultat est faut,voici un message à afficher
              If GetGadgetText(#chaine_3) <> Str (Resultat + Resultat) 
                rep = MessageRequester("Désolé", "Mauvaise réponse. Voulez-vous voir la bonne réponse ?", #PB_MessageRequester_YesNo) 
                If rep = 6 
                ;un autre message à afficher pour demander à l'utilisateur s'il veut réessayer
                ; ou s'il souhaite voir la bonne reponse  
                  MessageRequester("Reponse", "La bonne réponse est:" + Str (Resultat + Resultat), #PB_MessageRequester_Ok) 
                  SetGadgetText(#chaine_3, "") 
                ElseIf rep = 7 
                  SetGadgetText(#chaine_3, "") 
                EndIf 
              Else 
                  rep_2 = MessageRequester("Thank", "Bravo", #PB_MessageRequester_Ok) 
                  Autres_operations() 
                  nombre = 0 
              EndIf 
            EndIf 
          EndIf 
          
      EndSelect 
      
    Case #PB_Event_CloseWindow 
      Event = #bouton_1 
  EndSelect 
Until Event = #bouton_1
Du courage
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Salut Laser_bleu,

Ne t'inquiète pas, le code de SpaceMan contient deux bugs. La correction est tout en bas...

Bienvenu! Voici un code un peu plus simple qui contient DEUX zones dans une fenêtre.
Ce sont deux «StringGadget»

Si tu écris en minuscule dans celle du haut, tu verras ton mot écrit en majuscule dans la zone du bas.

Dans l'aide de PureBasic, le code d'exemple qui se rapproche le plus de ce code-ci est accessible en faisant ceci:
1) Tu tapes StringGadget() dans l'éditeur
2) Tu tapes F1 (c'est l'aide)

Compare ce code ci-dessous et le code dans l'aide. ça te donnera un peu une idée de départ pour comprendre le PureBasic.

N'hésite à observer d'autres exemples de gadgets. La liste est exhaustive.

Que dire de plus?

>> Que ce qui se trouve entre REPEAT et UNTIL se répète indéfiniment tant qu'il n'y a pas d'événement de sortie (clic sur la croix)

>> Que DEFINE permet de définir des variables

>> Que UCASE() (abrégé de Upper CASE) est la fonction qui met en majuscule

>> Que chacun de ces termes expliqués a un exemple dans l'aide de PureBasic.

>> Que je te conseille de t'intéresser à IF ... ELSE ... ENDIF dans l'aide de PureBasic pour découvrir pourquoi un programme n'est pas seulement une suite de lignes qui s'exécutent successivement. Ainsi, tu verras que selon les entrées, tu pourras faire exécuter certaines lignes et pas d'autres.

Bon début.

Code : Tout sélectionner

;***********************************
;***********************************
;***********************************
; Passe une chaîne en majuscule
;***********************************
;***********************************
;***********************************

;===================================
; INITIALISATION
;===================================
#FenetreTest = 1
#StyleStandard = $CF0001

Enumeration
#Entree1
#Sortie1
EndEnumeration

Define Event0.L
Define Texte.S

;===================================
; DEMARRAGE
;===================================
If OpenWindow(#FenetreTest, 0, 0, 156, 96, "Test", #StyleStandard)
   StringGadget(#Entree1, 16, 16, 128, 24, "")
   StringGadget(#Sortie1, 16, 40, 128, 24, "")
EndIf

;===================================
; BOUCLE PRINCIPALE
;===================================
Repeat


   ; On attend un événement système...
   Event0 = WaitWindowEvent() ; ...stocké dans Event0

   
   ; On récupère le texte d'entrée
   Texte = GetGadgetText(#Entree1)
   ; On le met en majuscule
   Texte = UCase(Texte)
   ; On le place dans la zone de sortie
   SetGadgetText(#Sortie1, Texte)


   ; On laisse le CPU se reposer un peu...   
   Delay(15)

; Si l'événement système est une sortie (code 16)...
Until Event0 = 16

; ...On ne remonte pas à la ligne REPEAT (début de boucle)
End
Ci-dessous, c'est le code de SpaceMan plus mais SANS LES BUGS!!!

Code : Tout sélectionner

Enumeration 
  #window_0 
  #bouton_1 
  #bouton_2 
  #bouton_3 
  #Gadget 
  #chaine_1 
  #chaine_2 
  #chaine_3 
  #Text 
  #Text_0 
  #Text_1 
EndEnumeration 

Enumeration 
#font 
EndEnumeration 

;ces valeurs seront accessibles dans tous le code 
Global Resultat.l 
Global Resultat2.l 
Global Resultat$ 
Global Resultat2$ 

If OpenWindow(#window_0, 443, 86, 350, 260, "Davida", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar) 
    
    ; pour afficher les cases dans lesquelles s'affichent les valleurs 
    ; " #PB_String_ReadOnly " ----> pour signifier que cette case ne pourra pas etre écrit(donc lecture seule) 
    ; " #PB_String_Numeric  " ----> pour signifier que cette case ne contiendra que des valeurs numériques 
    
    StringGadget(#chaine_1, 220, 35, 110, 25, "", #PB_String_ReadOnly | #PB_Text_Right) 
    StringGadget(#chaine_2, 220, 95, 110, 25, "", #PB_String_ReadOnly | #PB_Text_Right) 
    StringGadget(#chaine_3, 220, 155, 110, 25, "0", #PB_String_Numeric | #PB_Text_Right) 
  
    ButtonGadget(#bouton_1, 230, 220, 110, 22, "Quitter") ;pour créer le bouton "Quitter" 
    ButtonGadget(#bouton_2, 10, 220, 110, 22, "Commencer", #PB_EventType_LeftClick) 
    ButtonGadget(#bouton_3, 120, 220, 110, 22, "Verifier") 
    TextGadget(#Text, 100, 40, 160, 20, "1er Nombre :")  ; pour afficher le texte "1er Nombre :" 
    TextGadget(#Text_0, 90, 105, 170, 20, "2ème Nombre :") 
    TextGadget(#Text_1, 125, 165, 55, 20, "Resultat :") 
    TextGadget(#Text_0, 185, 65, 20, 20, "+") 
    
EndIf 

;cette partie permet de choisir les valeurs à afficher pour les operérations 
;ces valeurs sont choisies de façon allétoire. 
;la premiere valeur est comprise entre 0 et 7000 
;la premiere valeur est comprise entre 0 et 4560 
;juste des valeurs prises au hasard 

Procedure Autres_operations() 
  Autres_operations : 
  Resultat.l = Random(7000) 
  Resultat2.l = Random(4560) 
  Resultat$ = Str (Resultat.l) 
  Resultat2$ = Str (Resultat2.l) 
  
  SetGadgetText(#chaine_1, Str (Val(Resultat$))) 
  SetGadgetText(#chaine_2, Str (Val(Resultat2$))) 
  DisableGadget(#bouton_2, 1) 
EndProcedure 


Repeat 
  EventID = WaitWindowEvent() 
  If Event = #PB_Event_Gadget 
  EndIf 
  Select EventID ; Gadget() 
    Case #PB_Event_Gadget 
      Select EventGadget() 
          
        Case 1 : Event = #bouton_1 
          
          
          ; Affichage des nombres alléatoires 
        Case 2 : Evebt = #bouton_2 
          Autres_operations() 
          
          
        Case 3 : Event3 = #bouton_3 
          ;un message à afficher si l'utilisateur ne met rien dans la case et clique sur le bouton 
          ;Vérifier 
          If GetGadgetText(#chaine_3) = "0" Or GetGadgetText(#chaine_3) = "" 
            MessageRequester("Désolé", "La case est vide,Entrez d'abord votre réponse.", #PB_MessageRequester_Ok) 
            
          Else 
            
            nombre + 1 
            
            If nombre = 5 ;pour limiter le nombre d'opération à 5 
              MessageRequester("Désolé", "Toutes les opérations sont terminées.", #PB_MessageRequester_Ok) 
              DisableGadget(#bouton_2, 0) 
              
            Else 
                ; si le resultat est faut,voici un message à afficher 
              If GetGadgetText(#chaine_3) <> Str (Resultat + Resultat2) 
                rep = MessageRequester("Désolé", "Mauvaise réponse. Voulez-vous voir la bonne réponse ?", #PB_MessageRequester_YesNo) 
                If rep = 6 
                ;un autre message à afficher pour demander à l'utilisateur s'il veut réessayer 
                ; ou s'il souhaite voir la bonne reponse  
                  MessageRequester("Reponse", "La bonne réponse est:" + Str (Resultat + Resultat2), #PB_MessageRequester_Ok) 
                  SetGadgetText(#chaine_3, "") 
                ElseIf rep = 7 
                  SetGadgetText(#chaine_3, "") 
                EndIf 
              Else 
                  rep_2 = MessageRequester("Thank", "Bravo", #PB_MessageRequester_Ok) 
                  Autres_operations() 
                  nombre = 0 
              EndIf 
            EndIf 
          EndIf 
          
      EndSelect 
      
    Case #PB_Event_CloseWindow 
      Event = #bouton_1 
  EndSelect 
Until Event = #bouton_1 
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Salut Laser_bleu,

Tout d'abord, évite de changer de pseudo parce que sinon, on ne va pas s'en sortir pour t'expliquer les choses facilement!

Je réponds publiquement à ton pm pour que d'autres puissent éventuellement en profiter.

Donc, en résumé tu veux automatiser un calcul particulier.

Je reprends le code minuscule/majuscule que j'ai posté plus haut. La première étape consiste à préparer le programme à ce qu'il y ait un nombre inconnu de gadgets (sachant que, dans ton cas, 1 gadget = 1 valeur physique).

Résultat: pas de changement en apparence. J'ai défini (avec Define) une variable entière 32 bits (un «Long» donc «.L») appelée GadgetCurseurY.
Cette variable va gérer la position d'affichage des gadgets.

Dans la partie «Démarrage», j'ai fait en sorte que la position commence à 16 pixels de haut pour le premier gadget. Chaque gadget créé est descendu de 32 pixels.

Code : Tout sélectionner

;*********************************** 
;*********************************** 
;*********************************** 
; Passe une chaîne en majuscule 
;***********************************
; On prépare le code pour afficher
; d'autres gadgets 
;*********************************** 
;*********************************** 

;=================================== 
; INITIALISATION 
;=================================== 
#FenetreTest = 1 
#StyleStandard = $CF0001 

Enumeration 
#Entree1 
#Sortie1 
EndEnumeration 

Define Event0.L 
Define Texte.S 
; On rajoute la notion de position de gadget
Define GadgetCurseurY.L

;=================================== 
; DEMARRAGE 
;=================================== 
If OpenWindow(#FenetreTest, 0, 0, 156, 96, "Test", #StyleStandard) 

   GadgetCurseurY = 16 ; On règle la position à 16 pixels
   StringGadget(#Entree1, 16, GadgetCurseurY, 128, 24, "")

   GadgetCurseurY + 32 ; On descend de 32 pixels
   StringGadget(#Sortie1, 16, GadgetCurseurY, 128, 24, "")

   ; On rajoute le redimensionnement de la fenêtre
   ; en fonction du nombre de gadgets créés
   ResizeWindow(#FenetreTest, #PB_Ignore, #PB_Ignore, #PB_Ignore, 32 + GadgetCurseurY) 

EndIf 

;=================================== 
; BOUCLE PRINCIPALE 
;=================================== 
Repeat 


   ; On attend un événement système... 
   Event0 = WaitWindowEvent() ; ...stocké dans Event0 

    
   ; On récupère le texte d'entrée 
   Texte = GetGadgetText(#Entree1) 
   ; On le met en majuscule 
   Texte = UCase(Texte) 
   ; On le place dans la zone de sortie 
   SetGadgetText(#Sortie1, Texte) 


   ; On laisse le CPU se reposer un peu...    
   Delay(15) 

; Si l'événement système est une sortie (code 16)... 
Until Event0 = 16 

; ...On ne remonte pas à la ligne REPEAT (début de boucle) 
End
[/u]
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ensuite, on rajoute une valeur physique d'entrée.(#Entree2)
>> A) dans les énumérations (Cf F1=ENUMERATION)
>> B) un copier/coller/modifier dans la partie démarrage

A l'exécution, tu devrait voir 3 gadgets au lieu de deux désormais. Si tu comprends ce principe, tu pourras alors rajouter autant de valeurs physiques que tu veux par la suite.

Code : Tout sélectionner

;*********************************** 
;*********************************** 
;*********************************** 
; Passe une chaîne en majuscule 
;***********************************
; 2) On rajoute une entrée
;*********************************** 
;*********************************** 

;=================================== 
; INITIALISATION 
;=================================== 
#FenetreTest = 1 
#StyleStandard = $CF0001 

Enumeration 
#Entree1
#Entree2 
#Sortie1 
EndEnumeration 

Define Event0.L 
Define Texte.S 
Define GadgetCurseurY.L

;=================================== 
; DEMARRAGE 
;=================================== 
If OpenWindow(#FenetreTest, 0, 0, 156, 96, "Test", #StyleStandard) 

   GadgetCurseurY = 16
   StringGadget(#Entree1, 16, GadgetCurseurY, 128, 24, "")

   GadgetCurseurY + 32
   StringGadget(#Entree2, 16, GadgetCurseurY, 128, 24, "")

   GadgetCurseurY + 32
   StringGadget(#Sortie1, 16, GadgetCurseurY, 128, 24, "")

   ResizeWindow(#FenetreTest, #PB_Ignore, #PB_Ignore, #PB_Ignore, 32 + GadgetCurseurY) 

EndIf 

;=================================== 
; BOUCLE PRINCIPALE 
;=================================== 
Repeat 


   ; On attend un événement système... 
   Event0 = WaitWindowEvent() ; ...stocké dans Event0 

    
   ; On récupère le texte d'entrée 
   Texte = GetGadgetText(#Entree1) 
   ; On le met en majuscule 
   Texte = UCase(Texte) 
   ; On le place dans la zone de sortie 
   SetGadgetText(#Sortie1, Texte) 


   ; On laisse le CPU se reposer un peu...    
   Delay(15) 

; Si l'événement système est une sortie (code 16)... 
Until Event0 = 16 

; ...On ne remonte pas à la ligne REPEAT (début de boucle) 
End
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ensuite, on passe au calcul. Alors, comme la prog c'est étape par étape (sinon, ça n'est pas très évident), je vais prendre un calcul physique simple :
P = U * I

Ce n'est plus un texte qui va être traité, mais des grandeurs physiques. Donc, dans les définitions, on remplace

Code : Tout sélectionner

Define Texte.S
par

Code : Tout sélectionner

Define Tension.D
Define Intensite.D
Define Puissance.D
D c'est l'initiale de Double. ça signifie que ces 3 variables ont un type flottant double précision (nombre réel stocké sur 64 bits)

Dans la boucle principale, on place le calcul P = U * I.
Comme les gadgets donnent un texte, et que le texte n'est pas un calcul, il faut confiner le calcul, c'est-à-dire convertir le texte d'entrée en nombre (Grâce à ValD() ), faire le calcul, puis convertir le résultat en texte (Grâce à StrD() ).

Code : Tout sélectionner

;*********************************** 
;*********************************** 
;*********************************** 
; Calcul de la puissance P en
; fonction de l'intensité I
; et la tension U 
;***********************************
; (3/4) On programme le calcul
;*********************************** 
;*********************************** 

;=================================== 
; INITIALISATION 
;=================================== 
#FenetreTest = 1 
#StyleStandard = $CF0001 

Enumeration 
#Entree1
#Entree2 
#Sortie1 
EndEnumeration 

Define Event0.L 

Define Tension.D
Define Intensite.D
Define Puissance.D
 
Define GadgetCurseurY.L

;=================================== 
; DEMARRAGE 
;=================================== 
If OpenWindow(#FenetreTest, 0, 0, 156, 96, "Test", #StyleStandard) 

   GadgetCurseurY = 16
   StringGadget(#Entree1, 16, GadgetCurseurY, 128, 24, "")

   GadgetCurseurY + 32
   StringGadget(#Entree2, 16, GadgetCurseurY, 128, 24, "")

   GadgetCurseurY + 32
   StringGadget(#Sortie1, 16, GadgetCurseurY, 128, 24, "")

   ResizeWindow(#FenetreTest, #PB_Ignore, #PB_Ignore, #PB_Ignore, 32 + GadgetCurseurY) 

EndIf 

;=================================== 
; BOUCLE PRINCIPALE 
;=================================== 
Repeat 


   ; On attend un événement système... 
   Event0 = WaitWindowEvent() ; ...stocké dans Event0 

    
   ; On récupère la tension 
   Tension = ValD(GetGadgetText(#Entree1) ) 
   ; On récupère l'intensité
   Intensite = ValD(GetGadgetText(#Entree2) )
    
   ; On fait le calcul 
   Puissance = Tension * Intensite
    
   ; On le place dans la zone de sortie 
   SetGadgetText(#Sortie1, StrD(Puissance, 3) ) 


   ; On laisse le CPU se reposer un peu...    
   Delay(15) 

; Si l'événement système est une sortie (code 16)... 
Until Event0 = 16 

; ...On ne remonte pas à la ligne REPEAT (début de boucle) 
End
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Pour (presque!) finir, on va CREER notre propre type d'utilisation.
Au lieu de mettre un S, pour le texte
ou au lieu de mettre un D, pour le nombre réel
on va mettre un «GrandeurPhysique» et définir ce que c'est, pour nous, dans ce programme, une grandeur physique.

On peut faire cela grâce à la Structure (F1 pour comprendre)
Si, dans la partie Initialisation, on rajoute cette Structure:Structure

Code : Tout sélectionner

Structure GrandeurPhysique
   Nom.S
   GadgetNom.L
   Valeur.D
   GadgetVal.L
   Unite.S
   GadgetUnite.L
EndStructure
et que l'on remplace

Code : Tout sélectionner

Define Tension.D
par

Code : Tout sélectionner

Define Tension.GrandeurPhysique
L'objet défini et appelé «Tension» aura alors les 6 éléments précisés par la structure ci-dessus. Il n'aura pas que la valeur du nombre (D). Au total, il aura:
1) Un nom (texte ici : "Tension")
2) Un numéro de gadget pour afficher le nom
3) La valeur (nombre réel)
4) Un numéro de gadget qui contient et peut saisir la valeur
5) Une unité (texte ici : le "volt")
6) Un numéro de gadget pour afficher l'unité

Dans la partie préparation, au lieu de créer un simple gadget, on va créer les 3 gadgets (Nom, valeur et unité). Pour ne pas encombrer la partie Préparation, on appelle une Procédure nommée GrandeurInstaller(). Et c'est dans cette procédure (c'est un sous-programme qui t'évite de recopier toutes les instructions quand tu dois répéter certaines actions), les 3 gadgets seront créés à chaque fois que l'on appellera GrandeurInstaller() dans la partie Préparation.

Ainsi, on installe
>> la tension (3 gadgets pour la tension)
>> l'intensité (3 gadgets pour l'intensité)
>> la puissance (3 gadgets pour la puissance)
chacun avec un nom, une valeur et une unité.

Pour te repérer, j'ai mis des petits signes de commentaire /!\ dans le code. Ce sont les endroits que tu peux modifier pour changer les grandeurs physiques et les calculs.

Code : Tout sélectionner

;*********************************** 
;*********************************** 
;*********************************** 
; Calcul de la puissance P en
; fonction de l'intensité I
; et la tension U 
;***********************************
; (4) Rajout de texte
; & Mise en structure
;*********************************** 
;*********************************** 

;=================================== 
; INITIALISATION 
;=================================== 
#FenetreTest = 1 
#StyleStandard = $CF0001 

Structure GrandeurPhysique
   Nom.S
   GadgetNom.L
   Valeur.D
   GadgetVal.L
   Unite.S
   GadgetUnite.L
EndStructure

Define Event0.L 

Define Tension.GrandeurPhysique
Define Intensite.GrandeurPhysique
Define Puissance.GrandeurPhysique
;/!\
 
Global GadgetCurseurY.L

Procedure GrandeurInstaller(*C.GrandeurPhysique, Nom.S, Unite.S)
   With *C 
      \GadgetNom = TextGadget(-1, 16, GadgetCurseurY, 80, 24, Nom)
      \GadgetVal = StringGadget(-1, 96, GadgetCurseurY, 128, 24, "")
      \GadgetUnite = TextGadget(-1, 240, GadgetCurseurY, 128, 24, Unite)
   EndWith
   GadgetCurseurY + 32
EndProcedure

;=================================== 
; DEMARRAGE 
;=================================== 
If OpenWindow(#FenetreTest, 0, 0, 320, 96, "Test", #StyleStandard) 

   GadgetCurseurY = 16
   
   GrandeurInstaller(Tension, "Tension", "Volt(s)")
   GrandeurInstaller(Intensite, "Intensité", "Ampère(s)")
   GrandeurInstaller(Puissance, "Puissance", "Watt(s)")
   ;/!\

   ResizeWindow(#FenetreTest, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetCurseurY) 

EndIf 

;=================================== 
; BOUCLE PRINCIPALE 
;=================================== 
Repeat 


   ; On attend un événement système... 
   Event0 = WaitWindowEvent() ; ...stocké dans Event0 

    
   ; On récupère la tension 
   Tension\Valeur = ValD(GetGadgetText(Tension\GadgetVal) ) 
   ; On récupère l'intensité
   Intensite\Valeur = ValD(GetGadgetText(Intensite\GadgetVal) )
   ; /!\
    
   ; On fait le calcul 
   Puissance\Valeur = Tension\Valeur * Intensite\Valeur
   ; /!\ Modifier le calcul
    
   ; On place le résultat dans la zone de sortie 
   SetGadgetText(Puissance\GadgetVal, StrD(Puissance\Valeur, 3) ) 
   ; /!\ Modifier le nom de la sortie /!\
   ; /!\ car ça n'est pas forcément la puissance /!\

   ; On laisse le CPU se reposer un peu...    
   Delay(15) 

; Si l'événement système est une sortie (code 16)... 
Until Event0 = 16 

; ...On ne remonte pas à la ligne REPEAT (début de boucle) 
End
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Enfin (!), voici comment on peut rajouter les échelles (micro, méga, etc...). Comme chaque grandeur physique (en entrée comme en sortie) a sa propre échelle, on peut rajouter cette échelle dans la structure récemment créée.

Code : Tout sélectionner

Structure GrandeurPhysique
   Nom.S
   GadgetNom.L
   Valeur.D
   GadgetVal.L
   Unite.S
   GadgetUnite.L
   Exposant.L ; <<<<<<<< ICI
EndStructure
Petit rappel de maths :

n puissance 1 = n
n puissance 2 = n * n (peut se lire n au carré)
n puissance 3 = n * n * n (peut se lire n au cube)
n puissance -1 = 1 / n
n puissance -2 = 1 / (n * n)
n puissance -3 = 1 / (n * n * n)
n puissance (a + b) = (n puissance a) * (n puissance b)
n puissance (a - b) = (n puissance a) / (n puissance b)
n puissance 0 = n puissance (1 - 1) = (n puissance 1) / (n puissance 1) = n / n = 1
n puissance (1/2) = Racine carrée de n (on peut pas écrire le symbole ici)
n puissance (1/3) = Racine cubique de n
n puissance (1/x) = Racine x ième de n

Petit rappel d'anglais : puissance se dit POWER
D'où l'instruction PureBasic Pow(a, b)

Pow(a, b) signifie a puissance b

Le champ appelé "Exposant" dans la structure ci-dessus, stocke en fait la valeur n tel que

le nombre réel traité = Valeur * Pow(10, n)

Exemples:
***********

Valeur = 15
Exposant = 3
>> Valeur réelle = 15 000

Valeur = 26
Exposant = 2
>> Valeur réelle = 2 600

Valeur = 31
Exposant = 0
>> Valeur réelle = 31

Valeur = 171
Exposant = 1
>> Valeur réelle = 1710

Valeur = 12
Exposant = -1
>> Valeur réelle = 1.2

Remarque: L'exposant est un nombre entier

J'ai rajouté une procédure appelée StrExpo(n)
Elle retourne un texte en fonction de l'exposant n spécifié

Exemple:
**********
Debug StrExpo(3) affichera "Kilo"
Debug StrExpo(-6) affichera "Micro"

Il y a aussi les symboles abrégés. Pour cela, il faut rajouter un argument de valeur entière 1.

Debug StrExpo(6, 1) affichera "M" (parce que "Méga")
Debug StrExpo(1, 1) affichera "Da" (parce que "Déca")
Etc...

Au moment où les textes des gadgets sont convertis en nombres, ils doivent subir la conversion des échelles (D'où la présence de *Pow(10, blabla) dans la boucle principale)

Au moment où le résultat est converti en texte pour être réaffiché, il doit aussi subir la conversion d'échelle.

Résultat: le calcul reste confiné et tu n'as donc pas à te soucier des échelles dans le calcul même.

Tu dois gérer les échelles dans la partie "Préparation" du programme, et plus précisément quand tu crées une grandeur avec GrandeurInstalle(). C'est le dernier argument entre parenthèses.

Si tu as des questions, il n'y a aucun souci. N'oublie pas les petits signes /!\ qui indiquent les endroits qui sont importants pour toi dans le code, et permettent d'arriver facilement à ce que tu m'as demandé en pm. C'est logiquement un bon repérage.

Bon courage.

Code : Tout sélectionner

;*********************************** 
;*********************************** 
;*********************************** 
; Calcul de la puissance P en
; fonction de l'intensité I
; et la tension U 
;***********************************
; (4) Rajout de texte
; & Mise en structure
;*********************************** 
;*********************************** 

;=================================== 
; INITIALISATION 
;=================================== 
#FenetreTest = 1 
#StyleStandard = $CF0001 

Structure GrandeurPhysique
   Nom.S
   GadgetNom.L
   Valeur.D
   GadgetVal.L
   Unite.S
   GadgetUnite.L
   Exposant.L
EndStructure

Define Event0.L 

Define Tension.GrandeurPhysique
Define Intensite.GrandeurPhysique
Define Puissance.GrandeurPhysique
;/!\
 
Global GadgetCurseurY.L

Procedure.S StrExpo(n.L, Abrege.L = 0)
   Protected Result.S
   Static Ech3.S = "atto/a;pico/p;nano/n;micro/µ;milli/m;/;kilo/K;méga/M;giga/G;tera/T"
   Static Ech10.S = "centi/c;déci/d;/;déca/Da;hecto/H"
   If Abs(n) <= 2
      Result = StringField(Ech10, n + 3, ";")
   Else
      Result = StringField(Ech3, (n / 3) + 6, ";")
   EndIf
   If Abrege
      Result = StringField(Result, 2, "/")
   Else
      Result = StringField(Result, 1, "/")
      Result = UCase(Left(Result, 1) ) + Right(Result, Len(Result) - 1)
   EndIf
   ProcedureReturn Result
EndProcedure

Procedure GrandeurInstaller(*C.GrandeurPhysique, Nom.S, Unite.S, Exposant.L = 0)
   With *C 
      \GadgetNom = TextGadget(-1, 16, GadgetCurseurY, 80, 24, Nom)
      \GadgetVal = StringGadget(-1, 96, GadgetCurseurY, 128, 24, "")
      \GadgetUnite = TextGadget(-1, 240, GadgetCurseurY, 128, 24, StrExpo(Exposant) + Unite)
      \Exposant = Exposant
   EndWith
   GadgetCurseurY + 32
EndProcedure

;=================================== 
; DEMARRAGE 
;=================================== 
If OpenWindow(#FenetreTest, 0, 0, 320, 96, "Test", #StyleStandard) 

   GadgetCurseurY = 16
   
   GrandeurInstaller(Tension, "Tension", "Volt(s)", -3)
   GrandeurInstaller(Intensite, "Intensité", "Ampère(s)", 6)
   GrandeurInstaller(Puissance, "Puissance", "Watt(s)", 3)
   ;/!\

   ResizeWindow(#FenetreTest, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetCurseurY) 

EndIf 

;=================================== 
; BOUCLE PRINCIPALE 
;=================================== 
Repeat 


   ; On attend un événement système... 
   Event0 = WaitWindowEvent() ; ...stocké dans Event0 

    
   ; On récupère la tension 
   Tension\Valeur = ValD(GetGadgetText(Tension\GadgetVal) ) * Pow(10, Tension\Exposant) 
   ; On récupère l'intensité
   Intensite\Valeur = ValD(GetGadgetText(Intensite\GadgetVal) ) * Pow(10, Intensite\Exposant)
   ; /!\
    
   ; On fait le calcul 
   Puissance\Valeur = Tension\Valeur * Intensite\Valeur
   ; /!\ Modifier le calcul
    
   ; On place le résultat dans la zone de sortie 
   SetGadgetText(Puissance\GadgetVal, StrD(Puissance\Valeur * Pow(10, 0.0 - Puissance\Exposant), 3) ) 
   ; /!\ Modifier le nom de la sortie /!\
   ; /!\ car ça n'est pas forcément la puissance /!\

   ; On laisse le CPU se reposer un peu...    
   Delay(15) 

; Si l'événement système est une sortie (code 16)... 
Until Event0 = 16 

; ...On ne remonte pas à la ligne REPEAT (début de boucle) 
End
Répondre