Gambas France BETA


Pas de compte ? Incription

howmuch5

À propos de ce code

Sur la base d'un programme de Spheris
Réécriture complète et limitation à 999 999 999,99 €
Version avec expression régulière gb.pcre
Création de deux Class pour la saisie et l'affichage formaté
Gestion de plusieurs expressions régulières et formats
Ajout d'une seconde Class pour comparaison de programmation
Utilisation de la nouvelle propriété TextReg

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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
' Gambas class file

INHERITS TextBox '<--------------------------------------------------------- Tout l'héritage du composant TextBox
'<----------------------------------------------------------------------------- (Export) pour créer la class dans l'IDE
EXPORT
'<------------------------------- remarquez les doubles '' pour faire apparaître les commentaires en explication des objets dans l'IDE
PRIVATE $value AS FLOAT ''Contient la valeur numérique
PRIVATE $regPat AS STRING ''Pattern des expressions réguliéres
PRIVATE $format AS STRING ''Contient le formatage de la variable
PRIVATE $regex AS NEW RegExp ''Contrôle l'entrée, il faut activer gb.pcre
PRIVATE $bFocus AS BOOLEAN ''Boolean du focus
PRIVATE $listview1 AS ListView ''Le listview pour afficher et choisir l'expression régulière
PRIVATE $TextBox2 AS TextBox ''pour afficher les informations sur les expressions régul.
PRIVATE $lab AS Label ''pour afficher le nombre formaté selon l'express. régul.

PRIVATE ENUM sNumVirgule0, sNumVirgule1, sNumVirgule2, sNumVirgule3, sNumVirgule' ne sert qu'à rendre les valeurs plus explicites dans le code

PRIVATE $ListeC AS NEW String[] '<-------------------------------------------- instanciation de la liste des formats
PRIVATE $ListeB AS NEW String[] '<-------------------------------------------- instanciation de la liste des explications
PRIVATE $Liste AS NEW String[] '<--------------------------------------------- instanciation de la liste des expressions régulières

PRIVATE $obs AS Observer '<-------------------------------------------------- les observer peuvent être déclarés en local
PRIVATE $lvw1Obs AS Observer '<---------------------------------------------- ou en global

'<------------------- Début propriétés ajoutées à TextBox ---------------------
PROPERTY Value AS FLOAT ''Valeur float de la textbox
PROPERTY Format AS STRING ''On passe le format que l'on souhaite voir en sortie
PROPERTY TextReg AS INTEGER ''On passe l'expression régulière

PRIVATE SUB Value_Write(Value AS FLOAT) '<------------------------------------- la propriété Value de notre TextBox

$value = Value '<--------------------------------------------------------- récupération de la valeur et transmision à la variable locale

END

PRIVATE FUNCTION Value_Read() AS FLOAT '<------------------------------------- la propriété Value de notre TextBox

RETURN $value '<---------------------------------------------------------- renvoi de la propriété

END

PRIVATE SUB Format_Write(sFormat AS STRING) '<------------------------------- la propriété Format de notre TextBox

$format = sFormat '<------------------------------------------------------ récupération de la valeur et transmision à la variable locale

END

PRIVATE FUNCTION Format_Read() AS STRING '<--------------------------------- la propriété Format de notre TextBox

RETURN $format '<--------------------------------------------------------- renvoi de la propriété

END

PRIVATE FUNCTION TextReg_Read() AS INTEGER '<--------------------------------- la propriété TextReg de notre TextBox

RETURN $Liste.Find($regPat) '<---------------------------------------------- renvoi de la propriété

END

PRIVATE SUB TextReg_Write(Value AS INTEGER) '<------------------------------- la propriété TextReg de notre TextBox

$regPat = $Liste[Value] '<------------------------------------------------ récupération de la valeur et transmision à la variable locale

END
'<-------------------- Fin propriétés ajoutées à TextBox ----------------------

PUBLIC SUB _new() '<--------------------------------------------------------- création et instanciation de tous les objets nécessaires

' Dim obs As Observer '<--------------------------------------------------- les observer peuvent être déclarés en local
' Dim lvw1Obs As Observer '<----------------------------------------------- ou en global qui les rend privées

DIM sCste AS STRING '<----------------------------------------------------- variables locales pour alimenter le listview
DIM i AS INTEGER '<-------------------------------------------------------- variables locales pour alimenter le listview

$obs = NEW Observer(ME) AS "obs" '<---------------------------------------- instanciation observateur pour récupérer les évènements
$listview1 = NEW ListView(ME.Parent) '<--------------------------------- instanciation listview d'affichage des expressions régulmières
$TextBox2 = NEW TextBox(ME.Parent) '<----------------------------------- instanciation textbox d'affichage d'explications
$lvw1Obs = NEW Observer($listview1) AS "ListView1" '<---------------------- instanciation observer pour suivre l'évènement _Select
$lab = NEW Label(ME.Parent) '<--------------------------------------------- instanciation label d'affichage du format

$lab.Alignment = Align.Right '<------------------------------------------ définition du label d'affichage

$listview1.ShowCheck = TRUE '<--------------------------------------------- définition du listview1 par ses propriétés
$listview1.X = 7 '<----------------------------------------------------- position horizontale
$listview1.Y = 7 '<----------------------------------------------------- position verticale
$listview1.H = 150 '<----------------------------------------------------- hauteur du champ
$listview1.W = 250 '<----------------------------------------------------- largeur du champ
$listview1.Visible = TRUE '<--------------------------------------------- le champ est visible

$TextBox2.X = 7 '<--------------------------------------------------------- définition du textbox2 par ses propriétés
$TextBox2.Y = $listview1.Y + $listview1.H
$TextBox2.H = 35
$TextBox2.W = 250
$TextBox2.Visible = TRUE
$TextBox2.ReadOnly = TRUE
'<------------------------------------------------------------------------- initialisation des listes
$ListeC = ["$#,###", "$#,###.#", "$#,###.##", "$#,###.###", "$#,###.##############"] '<----- liste des formats
$ListeB = [("Valeur Numérique sans décimale" ("Valeur Numérique à une décimale"), ("Valeur Numérique à deux décimales"), ("Valeur Numérique à trois décimales"), ("Valeur Numérique à virgule")] '<------------------ liste des explications
$Liste = ["^-?[0-9]*[,.]?[0-9]{0,0}$", "^-?[0-9]*[,.]?[0-9]{0,1}$", "^-?[0-9]*[,.]?[0-9]{0,2}$", "^-?[0-9]*[,.]?[0-9]{0,3}$", "^-?[0-9]*[,.]?[0-9]*$"] '<------------------------------------------------ liste des expressions régulières

i = 0
FOR EACH sCste IN $Liste
$ListView1.Add(CStr(i), sCste) '<------------------------------------- initialisation, remplissage de la listview1 avec la $Liste
INC i
NEXT

$ListView1.Key = sNumVirgule2 '<----------------------------------------- initialisation de départ de l'expression régulière (ici 2)
listview1_select() '<----------------------------------------------------- premier appel pour obtenir le format et l'express. régul.
$bFocus = TRUE '<---------------------------------------------------------- initialisation du boolean

END

'<----------------------------------------------------------------------------- on utilise Me pour faire appel à toutes les propriétés
'<----------------------------------------------------------------------------- du composant à l'intérieur de la Class et bien sûr celles
'<----------------------------------------------------------------------------- qu'on vient de créer par l'utilisation des procédures
'<----------------------------------------------------------------------------- _read et _write

PUBLIC SUB defLabel() '<----------------------------------------------------- les propriétés pour le label d'affichage

$lab.X = ME.X
$lab.Y = ME.Y + ME.H + 2
$lab.h = ME.H - 3
$lab.w = ME.W - 3
$lab.Border = TRUE
$lab.Border = Border.Dotted
$lab.Visible = TRUE
$lab.Background = Color.ButtonBackground
$lab.Font = ME.Font '<----------------------------------------------------- même police que tb1 dans Fmain.Form

END

PUBLIC SUB ListView1_select() '<--------------------------------------------- évènement _select pour listview1

ME.TextReg = $ListView1.Key '<------------------------------------------- express. régul. sélectionnée (key=integer)
$TextBox2.Text = $ListeB[CInt($ListView1.Key)] '<------------------------ affichage des informations sur l'expression régulière pointée
TransFormat($regPat) '<------------------------------------------------- format transmis à notre class en fonction de $regPat
$regex.Compile($regPat) '<------------------------------------------------- précompile en fonction de l'expression régulière choisie

END

PUBLIC FUNCTION TransFormat(valeur AS STRING) AS STRING '<--------------------- renvoie du format en fonction de l'express. régul.

DIM i AS INTEGER

i = $Liste.Find(valeur)
IF valeur = $liste[i] THEN ME.Format = $ListeC[i]
RETURN ME.Format '<----------------------------------------------------- on utilise Me.propriété ou la variable privée $propriété

END

PUBLIC SUB obs_Change() ''Contrôle de la saisie

IF ME.text THEN '<--------------------------------------------------------- pour ne pas avoir d'erreur de texte vide
$regex.Exec(ME.Text) '<--------------------------------------------- test de la valeur au crible de l'expression régulière
ME.Text = $regex.Text '<--------------------------------------------- isNumber() donc on récupère chaque chiffre
IF ME.Text MATCH "." THEN ME.Text = Replace(ME.Text, ".", ",") '<----- pour récupérer la virgule à partir du point
IF ME.text THEN $value = Val(ME.Text) '<----------------------------- si j'ai du texte alors j'ai une valeur
IF ME.Value > 20000000 THEN '<----------------------------------------- pour ne pas dépasser la somme
ME.Value = 0 '<------------------------------------------------- la valeur est remise àzéro
ME.Clear '<----------------------------------------------------- le texte est effacé
ME.SetFocus '<----------------------------------------------------- le focus est remis au champ
$lab.Text = "" '<------------------------------------------------- la label d'affichage est effacé
ENDIF
ELSE
$value = 0
$lab.Text = ""
ENDIF

IF ME.Text AND IF $format THEN
$lab.Text = Format(Val(ME.Text), $format) '<------------------------- affichage dans le label selon le format
ENDIF

END

PUBLIC SUB obs_Lostfocus() ''Le format ne sera appliqué qu'après

IF ME.Text THEN
$value = Val(Format($value, "#.##################")) '<------------- on s'assure que le texte est une suite de chiffres sans format
IF $format THEN
Object.Lock(ME) '<------------------------------------------------- on verrouille l'objet pour ne pas appeler l'event Change
ME.Text = Format($value, $format) '<----------------------------- on formate le texte comme voulu
Object.Unlock(ME) '<----------------------------------------------- on deverouille l'objet
ENDIF
$bFocus = NOT $bFocus '<--------------------------------------------- inversion du boolean
ELSE
ME.Clear
ENDIF

$lab.Visible = FALSE
$lab.Text = ""

END

PUBLIC SUB obs_Gotfocus() ''Pour être certain d'avoir à la fois une valeur et un texte

IF $value = 0 THEN '<----------------------------------------------------- pour être sûr que la valeur et le texte sont de concert
ME.Clear
ELSE
ME.Text = Format($value, "#.##################") '<----------------- on s'assure que le texte est une suite de chiffres sans format
$bFocus = NOT $bFocus '<--------------------------------------------- inversion du boolean
ENDIF

defLabel() '<------------------------------------------------------------- définition du label d'affichage (voir plus haut)

END

PUBLIC SUB obs_Activate() ''L'utilisateur tape sur entrée et bascule l'affichage

SELECT CASE $bFocus '<----------------------------------------------------- on alterne le focus en fonction du drapeau boolean
CASE TRUE
obs_Lostfocus() '<------------------------------------------------- le composant perd le focus
CASE FALSE
obs_Gotfocus() '<------------------------------------------------- le composant gagne le focus
END SELECT

END

Commentaires

Commentaire de valaquarus, Le 2/7/2022 à 21:30:45
Deux Class pour le prix d'une à essayer sans tarder.
Dans le formulaire principal nommé Fmain.Form, alterner entre tbxPerso et tbxPerso1
en gardant le même nom pour le composant à intégrer, à savoir tb1.
Les différences sont peu visibles mais sensibles surtout si l'on veut récupérer
des éléments pour d'autres programmes.
PilValaquarus