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
|