Gambas France BETA

Connexion

Pas de compte ? Incription

Calculatrice simple :


Calculatrice simple :


Je ressorts de la forge une petite pépite de Patrick (calc2), une calculatrice simple écrite façon POO, en peu de ligne de code.
Cette application était, au moment où Patrick l'a écrite, une démonstration suite à discussion entre lui, Sphéris et moi-même pour décrire ce qu'apportait comme facilité d'écriture du code, la POO que je n'avais pas comprise, alors.
Je me suis permis de reprendre le code de son application, de le commenter et de l'étayer (à peine).

Voici l'intégralité du code :


Les déclarations :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE STATIC '<-------------------------------------------'
INHERITS Window '<-----------------------------------------' pour ne pas utiliser de Formulaire
EXPORT '<-------------------------------------------------' c'est un composant

PRIVATE $tb AS TextBox '<---------------------------------' zone d'affichage des calculs et résultats
PRIVATE $sFrmt AS STRING = "###,###.00" '<-----------------' format d'affichage grand nombre
PRIVATE $fVal AS FLOAT '<---------------------------------' valeur float du résultat
PRIVATE $bVirgule AS BOOLEAN '<---------------------------' présence ou non d'une virgule
'énumération des touches (nombre exact de touches)
PUBLIC ENUM zero, un, deux, trois, quatre, cinq, six, sept, huit, neuf, egal, mult, divi, soust, addit, virgul, retour, efface

PROPERTY Font AS Font '<-----------------------------------' propriété à récupérer
PROPERTY Padding AS INTEGER '<-----------------------------' propriété à récupérer

EVENT resultat(Value AS FLOAT) ''Envoie le resultat
' Event formule(Value As String) ''Envoie l'opération compléte
EVENT touche(Value AS INTEGER) ''Envoie le code de chaque touche


Commentaires :

- C'est une Class exportée, car il s'agit d'un composant héritié de Window que nous voulons utiliser.
- Nous déclarons les variables dont nous aurons besoin.
- L'énumération, nous permet de définir une liste de nom, un pour chacun de nos boutons
- les propriétés déclarées dont nous aurons besoin
- les évènements que nous souhaitons récupérer

La Préparation de la calculatrice :



Commentaires :

- Là, il s'agit de la construction graphique de notre calculatrice avec ses boutons et panels.
- Il y a combien de boutons et combien de panels?
- Arrivez vous, à vous la représenter?
- Une astuce est d'ajouter une ligne commentée à chaque fois que vous avez ceci :pan = New Panel(Me) car tout ce qui suit est attribué à ce pan (Panel).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
PUBLIC SUB _new()

DIM pan AS Panel '<-------------------------------------' variable locale à la procédure
DIM lab AS Label '<-------------------------------------' variable locale à la procédure
DIM but AS Button '<------------------------------------' variable locale à la procédure
DIM i AS INTEGER '<-------------------------------------' variable locale à la procédure

'on dessine la calculatrice, celle ci peut être soit dans une form soit seule dans une fenêtre, elle est redimentionable.
ME.Padding = 5 '<---------------------------------------' propriété Padding
ME.Arrangement = Arrange.Vertical '<--------------------' propriété Arrangement
ME.Text = "Calculatrice" '<------------------------------' propriété Text

IF IsNull(ME.Parent) THEN '<-----------------------------' si le parent n'existe pas
ME.h = Desktop.H / (0.618034 * Pi)'<-------------------' dimension H de la window
ME.w = Desktop.W / (1.618034 * Pi)'<-------------------' dimension W de la window
ENDIF

$tb = NEW TextBox(ME) AS "affiche" '<-------------------' le textbox
' $tb.Text = "0" '<-------------------------------------' on peut afficher un zéro
$tb.Expand = TRUE '<-------------------------------------' propriété expand

pan = NEW Panel(ME) '<-----------------------------------' nouveau panel pour accueillir ce qui suit
pan.Arrangement = Arrange.Horizontal '<-----------------' propriété Arrangement
pan.Padding = 5 '<--------------------------------------' propriété Padding
pan.Expand = TRUE '<-------------------------------------' propriété expand

FOR i = 7 TO 9 '<---------------------------------------' les chiffres et leur touche
but = NEW Button(pan) AS "clavier" '<-----------------' nouveau bouton à cliquer appartenant au panel
but.Text = Str(i) '<-----------------------------------' propriété Text
but.Tag = i '<-----------------------------------------' propriété Tag
but.Expand = TRUE '<-----------------------------------' propriété expand
NEXT

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "+" '<----------------------------------------' propriété Text
but.tag = addit '<---------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

pan = NEW Panel(ME) '<-----------------------------------' nouveau panel pour accueillir ce qui suit
pan.Arrangement = Arrange.Horizontal '<-----------------' propriété Arrangement
pan.Padding = 5 '<--------------------------------------' propriété Padding
pan.Expand = TRUE '<-------------------------------------' propriété expand

FOR i = 4 TO 6 '<---------------------------------------' les chiffres et leur touche
but = NEW Button(pan) AS "clavier" '<-----------------' nouveau bouton à cliquer appartenant au panel
but.Text = Str(i) '<-----------------------------------' propriété Text
but.Tag = i '<-----------------------------------------' propriété Tag
but.Expand = TRUE '<-----------------------------------' propriété expand
' but.Show
NEXT

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "-" '<----------------------------------------' propriété Text
but.tag = soust '<---------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

pan = NEW Panel(ME) '<-----------------------------------' nouveau panel pour accueillir ce qui suit
pan.Arrangement = Arrange.Horizontal '<-----------------' propriété Arrangement
pan.Padding = 5 '<--------------------------------------' propriété Padding
pan.Expand = TRUE '<-------------------------------------' propriété expand

FOR i = 1 TO 3 '<---------------------------------------' les chiffres et leur touche
but = NEW Button(pan) AS "clavier" '<-----------------' nouveau bouton à cliquer appartenant au panel
but.Text = Str(i) '<-----------------------------------' propriété Text
but.Tag = i '<-----------------------------------------' propriété Tag
but.Expand = TRUE '<-----------------------------------' propriété expand
NEXT

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "*" '<----------------------------------------' propriété Text
but.tag = mult '<----------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

pan = NEW Panel(ME) '<-----------------------------------' nouveau panel pour accueillir ce qui suit
pan.Arrangement = Arrange.Horizontal '<-----------------' propriété Arrangement
pan.Padding = 5 '<--------------------------------------' propriété Padding
pan.Expand = TRUE '<-------------------------------------' propriété expand

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "0" '<----------------------------------------' propriété Text
but.tag = zero '<----------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "," '<----------------------------------------' propriété Text
but.tag = virgul '<--------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "/" '<----------------------------------------' propriété Text
but.tag = divi '<----------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

pan = NEW Panel(ME) '<-----------------------------------' nouveau panel pour accueillir ce qui suit
pan.Arrangement = Arrange.Horizontal '<-----------------' propriété Arrangement
pan.Padding = 5 '<--------------------------------------' propriété Padding
pan.Expand = TRUE '<-------------------------------------' propriété expand

lab = NEW Label(pan) '<---------------------------------' à votre avis, appartenant au panel
lab.Expand = TRUE '<-------------------------------------' propriété expand

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Picture = Picture["icon:/22/clear"] '<---------------' propriété Picture (icône)
but.tag = retour '<--------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "C" '<----------------------------------------' propriété Text
but.tag = efface '<--------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

but = NEW Button(pan) AS "clavier" '<-------------------' nouveau bouton à cliquer appartenant au panel
but.Text = "=" '<----------------------------------------' propriété Text
but.tag = egal '<----------------------------------------' propriété Tag
but.Expand = TRUE '<-------------------------------------' propriété expand

END

Les Procédures :



Commentaires :

Actions liées au clique souris
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
PUBLIC SUB clavier_click() '<-----------------------------' évènement _Click sur les boutons créés

$tb.SetFocus
SELECT CASE LAST.tag
CASE 0 TO 9
Desktop.SendKeys(Str(LAST.tag)) '$tb recoit la touche last.tag
CASE mult
Desktop.SendKeys("*")
IF $fVal <> 0 THEN $tb.Text = Str($fVal) '<---------' affichage sans format de la valeur
$bVirgule = FALSE '<---------------------------------' pour permettre saisie avec virgule du nombre suivant
CASE divi
Desktop.SendKeys("/")
IF $fVal <> 0 THEN $tb.Text = Str($fVal) '<---------' affichage sans format de la valeur
$bVirgule = FALSE '<---------------------------------' pour permettre saisie avec virgule du nombre suivant
CASE soust
Desktop.SendKeys("-")
IF $fVal <> 0 THEN $tb.Text = Str($fVal) '<---------' affichage sans format de la valeur
$bVirgule = FALSE '<---------------------------------' pour permettre saisie avec virgule du nombre suivant
CASE addit
Desktop.SendKeys("+")
IF $fVal <> 0 THEN $tb.Text = Str($fVal) '<---------' affichage sans format de la valeur
$bVirgule = FALSE '<---------------------------------' pour permettre saisie avec virgule du nombre suivant
CASE efface
$tb.Clear '<-----------------------------------------' effacement du TextBox
$fVal = 0 '<-----------------------------------------' pour ne pas traîner une valeur
CASE retour
IF $fVal <> 0 THEN $tb.Text = Str($fVal) '<---------' affichage sans format de la valeur
Desktop.SendKeys("[BackSpace]")
IF InStr($tb.text, ",") = 0 AND InStr($tb.text, ".") = 0 THEN $bVirgule = FALSE
IF InStr($tb.text, ",") = 1 AND InStr($tb.text, ".") = 1 THEN $bVirgule = TRUE
$fVal = 0
CASE virgul
IF InStr($tb.text, ",") = 0 AND InStr($tb.text, ".") = 0 THEN $bVirgule = FALSE
IF InStr($tb.text, ",") = 1 AND InStr($tb.text, ".") = 1 THEN $bVirgule = TRUE
IF $bVirgule = FALSE THEN
Desktop.SendKeys(".")
$bVirgule = TRUE '<---------------------------------' pour interdire nouvelle saisie de virgule
ENDIF
CASE egal
calcul() '<------------------------------------------' procédure calcul()
END SELECT

END

Commentaires :

Actions liées à l'utilisation du clavier :
1
2
3
4
5
6
7
8
9
10
PUBLIC SUB affiche_keypress() '<---------------------------' évènement _keypress sur TextBox

SELECT CASE Key.Code
CASE Key.Enter, Key.Return, Asc("=")
calcul()
CASE ELSE
RAISE touche(Key.code) '<---------------------------' levée de l'évènement déclaré touche(integer)
END SELECT

END

Commentaires :

- Les différentes procédures utiles au fonctionnement de la calculatrice.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PRIVATE SUB calcul() '<-----------------------------------' procédure calcul()

IF $tb.Text MATCH "=" THEN RETURN

$tb.Text = Replace($tb.Text, ",", ".") '<---------------' virgule au lieu de point
$fVal = Eval($tb.Text) ' Evalue l'expression contenu dans $tb, toutes les expressions sont permises (ex : 10 mod 2), ouvre la porte à l'utilisation de variables
' Raise formule($tb.Text) '<-----------------------------' levée de l'évènement formule

IF $fVal > 999 THEN '<----------------------------------' affichage de l'opération en cours avec ou sans format
$tb.Text &= " = " & Format($fVal, $sFrmt)
ELSE
$tb.Text &= " = " & Str($fVal)
ENDIF

RAISE resultat($fVal) '<---------------------------------' levée de l'évènement resultat
WAIT 1 '<----------------------------------------------' attente d'une seconde avant effacement

IF $fVal > 999 THEN '<----------------------------------' affichage du résultat avec ou sans format
$tb.Text = Format($fVal, $sFrmt)
ELSE
$tb.Text = Str($fVal)
ENDIF

CATCH
Message.Error("Il y a une erreur dans votre expression " & Error.Text) '<-----' si l'expression ne peut être évaluée

END


Les Propriétés :


Commentaires :

- Les différentes propriétés que nous souhaitons récupérer.
1
2
3
4
5
PRIVATE FUNCTION Font_Read() AS Font '<-------------------' définition propriété

RETURN SUPER.Font

END
1
2
3
4
5
6
7
8
9
10
PRIVATE SUB Font_Write(Value AS Font) '<------------------' définition propriété
'on surcharge la class Font pour modifier tous les objets

DIM obj AS OBJECT

FOR EACH obj IN ME.Children
TRY obj.Font = value
NEXT

END
1
2
3
4
5
PRIVATE FUNCTION Padding_Read() AS INTEGER '<-------------' définition propriété

RETURN SUPER.Padding

END
1
2
3
4
5
6
7
8
9
10
11
12
13
PRIVATE SUB Padding_Write(Value AS INTEGER) '<------------' définition propriété
'on surcharge le padding des panels

DIM obj AS OBJECT

FOR EACH obj IN ME.Children
IF Object.Class(obj).Name = "Panel" THEN
obj.Padding = value
ENDIF
NEXT
SUPER.Padding = value

END


Le Module d'appel de la Class :


Où, l'on créer une instance de la Class Calc, ici nommée "calc3" pour récupérer les évènements dont on pourrait avoir besoin.
1
2
3
4
5
6
7
8
9
10
PUBLIC SUB Main()

DIM c AS Calc

c = NEW Calc AS "calc3"
c.Font = Font["Serif,Bold,14"] 'on change les font du clavier
c.Show
c.Padding = 2 'on change l'espacement entre les panels

END


Commentaires :

- nous pouvons aussi, utiliser cette class comme un composant à insérer dans un formulaire. Nous vous laissons le soin de tester la chose.
- Je me suis servi de cette petite application pour progresser en POO, c'est pourquoi je la ressors du placard où, elle était enfermée.

Ma version de cette calculatrice est plus étoffée, mais le but n'était pas là, mais bien dans la manipulation d'objets virtuels, ce qui est une démarche difficile, au début, mais on ne reviendrait pas en arrière.

Une image de ce que cela donne, à l'écran :



Une image dans l'IDE pour juger de la place occupée :



Le lien de téléchargement sur la forge :


calculatrice simple

====================

- Je ne résiste pas à vous montrer comment :

se servir de cette Class comme d'un conteneur à insérer dans un formulaire :



- Dans notre projet créons un formulaire vide.
- dans celui-ci, avec l'onglet conteneur de la boite à outil de l'ide, cherchons Calc et intégrons le dans le formulaire. L'IDE donne un numéro d'ordre par défaut (nous pouvons changer de nom), donc, nous avons un Calc1 que nous venons de déposer sur le formulaire.



- rajoutons trois TextArea à droite de Calc1, qui nous servirons à récupérer les évènements que nous avons déclarés dans la Class, Calc.

Ce que cela donne en images :


Dans l'IDE :

Une fois lancé :
Pour être certain d'avoir le focus sur le TextBox de Calc1, il suffit de vérifier la hiérarchie des objets dans le formulaire, et de bien mettre Calc1, en haut de la liste, dans l'IDE.

Le code pour ce que nous avons ajouté :
1
2
3
4
5
6
7
8
PUBLIC SUB Calc1_resultat(Value AS FLOAT) '<---------' Event resultat, pour récupérer le résultat d'une opération

DIM sText AS STRING

sText = Format(Value, "###,###.00######")
TextArea1.Insert(sText & gb.CrLf)

END
1
2
3
4
5
PUBLIC SUB Calc1_formule(Value AS STRING) '<--------' Event formule, pour récupérer l'intégralité d'une opération

TextArea2.Insert(Value & gb.CrLf)

END
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUBLIC SUB Calc1_touche(Value AS INTEGER) '<---------' Event touche, pour récupérer chaque touche enfoncée

DIM sText AS STRING

sText = String.Chr(Value)

IF sText = "=" OR IF sText = Key.Enter OR IF sText = Key.Return THEN
TextArea3.Insert(gb.CrLf)
ELSE
' Try TextArea3.Insert(Chr(value))
TRY TextArea3.Insert(sText)
ENDIF

END
1
2
3
4
5
6
7
8
9
10
PUBLIC SUB Calc1_KeyPress() '<----------' pour effacer sans perdre le focus sur Calc1

SELECT CASE Key.Code
CASE Key.Esc, (Key.Shift AND Key["c"])
TextArea1.Clear
TextArea2.Clear
TextArea3.Clear
END SELECT

END


Nous avons d'autres possibilités de déclaration, avec Calc1, il suffit de commencer une déclaration de procédure, pour que l'IDE nous fasse des propositions plus qu'honnêtes.

Nous avons, aussi, la possibilité, dans ce formulaire, de déclarer une instance de la Class, Calc, pour récupérer d'autres évènements dont on pourrait avoir besoin :
1
2
3
4
5
6
7
8
9
PUBLIC SUB principale()

DIM c AS Calc

c = NEW Calc AS "calculatrice"
c.Font = Font["Default,Bold,15"] 'on change les font du clavier
c.Padding = 2 'on change l'espacement entre les panels

END

Ici, par exemple, puisque j'ai déclaré calculatrice ;
1
PUBLIC SUB calculatrice_NomDeLevenement...


====================

Navigation :



<-- Liens du Wiki : <--
<-- Accueil du WIKI : <--
<-- Création de Projets <--

====================

Documentation :



====================