Gambas France BETA

Connexion

Pas de compte ? Incription

Application Calculatrice simple :

Je ressorts de la forge une petite pépite de Patrick (calc2), une calculatrice simple écrite en 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 :


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


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 ?

Les Procédures :


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
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

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

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


Commentaires :
- Les différentes procédures utiles au fonctionnement de la calculatrice.

Les Propriétés :


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
PRIVATE FUNCTION Font_Read() AS Font '<-------------------' définition propriété

RETURN SUPER.Font

END

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

PRIVATE FUNCTION Padding_Read() AS INTEGER '<-------------' définition propriété

RETURN SUPER.Padding

END

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


Commentaires :
- Les différentes propriétés que nous souhaitons récupérer.

Le Module d'appel de la Class :


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.

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

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

Navigation :



<-- Liens du Wiki : <--
<-- Accueil du WIKI : <--

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

La Documentation :



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