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