Gambas France BETA


Pas de compte ? Incription

Calculatrice ++

À propos de ce code

Une variante améliorée de la précédente Calculatrice.
Ajout propriété Resultat
Ajout Résultat intermédiaire
Ajout +/-
Correction bugs
Ajout de commentaires
Correction d'un bug sur compteur de virgule

Code source

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
' Gambas class file

PRIVATE $sSigne AS STRING '<--------------------------------------- signe des opérations
PRIVATE $iVirgule AS INTEGER '<----------------------------------- pour suivre la virgule
PRIVATE $iPosVirgule AS INTEGER '<-------------------------------- position de la virgule dans le mot
PRIVATE $iLongMot AS INTEGER '<----------------------------------- longeur du mot
PRIVATE $iNextCharPos AS INTEGER '<-------------------------------- position du prochain caractère
PRIVATE $fNombre AS FLOAT
PRIVATE $fMemNombre AS FLOAT
PRIVATE $sMemSigne AS NEW String[]
PRIVATE $iSigne AS INTEGER
PRIVATE $bEgal AS BOOLEAN
PRIVATE $bChiffres AS BOOLEAN

PROPERTY Resultat AS STRING USE $sTransfText '<--------------------- définition propriété pour récupérer le résultat

'<------------------------------------------------------------------ création d'un Group pour les chiffres nommé Chiffres
'<------------------------------------------------------------------ création d'un Group pour les opérations nommé Signes

PRIVATE SUB posVirgule(monObjet AS OBJECT) '<----------------------- détermination longueur de mot et position de virgule

SELECT CASE System.Language
CASE "en_US.UTF-8"
$iPosVirgule = String.RInStr(monObjet.Text, ".", 0)
$iNextCharPos = $iPosVirgule + 1
$iLongMot = String.Len(monObjet.Text)
CASE ELSE '<------------------------------------------------ pour Europa
$iPosVirgule = String.RInStr(monObjet.Text, ",", 0)'<------ pour déterminer la position de la virgule
$iNextCharPos = $iPosVirgule + 1 '<---------------------- position du prochain caractère
$iLongMot = String.Len(monObjet.Text) '<----------------- longeur du mot
END SELECT

END

PUBLIC SUB Form_Open() '<------------------------------------------ initialisation des variables globales

$sTransfText = ""
$sSigne = ""
$iVirgule = 0
$iPosVirgule = 0
$iLongMot = 0
$iNextCharPos = 0
$fNombre = 0
$fMemNombre = 0
$iSigne = 0
$bEgal = FALSE
$bChiffres = FALSE
$sMemSigne.Clear

END

PUBLIC SUB btnEffacer_Click() '<------------------------------------ effacement d'un caractère pour correction

tbAffichage.Text = String.Mid(tbAffichage.Text, 1, -1)

$iLongMot -= 1 '<----------------------------------------------- conséquence de l'effacement d'un caractère

IF $iLongMot > -1 THEN
IF $iLongMot = 0 THEN tbAffichage.Text = "0"
Insertion() '<------------------------------------------------ insertion de la valeur dans tableau
ELSE
RETURN '<--------------------------------------------------- tant que la longueur est positive
ENDIF

IF $iPosVirgule = $iLongMot THEN $iVirgule = 0 '<--------------- on réinitialise iVirgule quand

END

PRIVATE SUB Insertion() '<------------------------------------------ insertion des valeurs dans tableau de float

IF IsFloat(tbAffichage.Text) THEN
$fNombre = Val(tbAffichage.Text)
posVirgule(tbAffichage) '<------------------------------------ position de la virgule dans le mot
ELSE
Message.Info(("Erreur de format !") & gb.crlf & ("Corriger l'erreur !"))
$bChiffres = FALSE
ENDIF

END

PUBLIC SUB Chiffres_Click() '<------------------------------------ évènement _Click() pour le Group Chiffres

IF LAST.text = "." OR LAST.text = "," THEN $iVirgule += 1 '<----- une seule virgule possible
IF $iVirgule > 1 THEN
RETURN
ELSE
tbAffichage.Text &= LAST.text '<------------------------------ concaténation dans textbox1
Insertion() '<------------------------------------------------ insertion de la valeur dans tableau
$bChiffres = TRUE
ENDIF

END

PRIVATE SUB Operations(Signe AS STRING)

SELECT CASE Signe '<-------------------------------------------- les opérations à faire en fonction du signe cliqué
CASE "+"
$fMemNombre += $fNombre
CASE "-"
$fMemNombre -= $fNombre
CASE "*"
$fMemNombre *= $fNombre
CASE "/"
IF $fNombre <> 0 THEN $fMemNombre /= $fNombre
END SELECT

$fNombre = 0 '<------------------------------------------------ efface la valeur en sortie sinon gardée en mémoire

END

PUBLIC SUB Signes_Click() '<--------------------------------------- évènement _Click() pour le Group Signes

IF $bChiffres = FALSE THEN RETURN

IF $iSigne = 0 THEN '<------------------------------------------ ajout dans tableau premier signe (toujours + )
$sMemSigne.Add("+", 0)
ENDIF

$iSigne += 1
$sSigne = LAST.Text '<------------------------------------------- on récupère signe pour les opérations
$sMemSigne.Add($sSigne, $iSigne) '<------------------------------ inscriptio du signe dans tableau
Operations($sMemSigne[$iSigne - 1]) '<--------------------------- opération antérieure ( -1 )

tbAffichage.Clear

END

PRIVATE SUB AffichResult()

tbAffichage.Text = Str($fMemNombre)

END

PUBLIC SUB btnEgal_Click() '<--------------------------------------- évènement _Click() lors de l'appui sur "="

IF $iSigne = 0 THEN RETURN
$bEgal = TRUE
Operations($sMemSigne[$iSigne])
AffichResult()
$sTransfText = Str($fMemNombre)
'<--------------------------------------------------------------- réinitialisation
$sMemSigne.Clear
$bEgal = FALSE
$iSigne = 0 '<--------------------------------------------------- remise à zéro pour saisie initiale
$iVirgule = 0 '<----------------------------------------------- réinitialisation iVirgule

END

PUBLIC SUB Form_KeyPress() '<--------------------------------------- saisie clavier

DIM vText AS VARIANT
DIM cChiffres AS String[] = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ","]
DIM cSignes AS String[] = ["+", "-", "*", "/"]

vText = Key.Text '<--------------------------------------------- touche pressée

IF vText MATCH "." THEN vText = Replace(vText, ".", ",") '<------ localisation Europa

IF Key.Code = key.Return OR Key.Code = key.Enter THEN btnEgal_Click()
IF Key.Code = Key.Esc THEN btnCancel_Click()
IF Key.Code = Key.Backspace OR Key.Code = Key.Delete THEN btnEffacer_Click()

IF cChiffres.Exist(vText) THEN
LAST.text = vText
Chiffres_Click()
ENDIF

IF cSignes.Exist(vText) THEN
LAST.text = vText
Signes_Click()
ENDIF

IF NOT cSignes.Exist(Key.Text) OR NOT cChiffres.Exist(Key.Text) THEN STOP EVENT

ME.Text = "Calculatrice ++" '<--------------------------------- pour ne pas afficher vText dans le titre du formulaire

END

PUBLIC SUB btnCancel_Click() '<------------------------------------- Réinitialisation de tout

tbAffichage.Clear
$iVirgule = 0
$iLongMot = 0
$iPosVirgule = 0
$iNextCharPos = 0
$sTransfText = ""
$iSigne = 0
$bEgal = FALSE
$bChiffres = FALSE
$fNombre = 0
$fMemNombre = 0
$sMemSigne.Clear
$sSigne = ""

END

PUBLIC SUB btnClose_Click()

ME.Close()

END

Commentaires