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