Gambas France BETA


Pas de compte ? Incription

Présentation de la classe Config, configuration de logiciels avec JSON

1
AuteurMessages
tincho#1 Posté le 28/2/2022 à 10:03:52
Bonjour les amis.
Je voudrais vous présenter une méthode pour gérer la configuration d'un logiciel, que je trouve intéressante.
En collaboration avec TercoIDE (gambas-es), nous avons préparé cet exemple dans lequel une classe contient tous les paramètres d'un logiciel et où il est possible d'en ajouter d'autres avec une grande flexibilité. Ensuite, dans n'importe quelle autre partie du programme, vous pouvez lire et écrire ces variables.
Enfin, il existe une méthode (Save) qui parcourt les symboles de la classe et les enregistre dans un fichier texte au format json pour une utilisation ultérieure en récupérant ces données avec la méthode "Load".
N'hésitez pas à donner votre avis, à faire des commentaires ou à améliorer ce programme.
A bientôt.

Config.class
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
' Gambas class file
CREATE STATIC
EXPORT
PRIVATE CONST ConfigFile AS STRING = ".app/config.json"
''Configuration variables to be saved, add as needed below
PUBLIC CurrentColor AS BYTE = 1
PUBLIC CurrentWidth AS BYTE = 1
PUBLIC CurrentLType AS BYTE = 1
PUBLIC OtherParameter1 AS STRING = "gambas-es.org"
PUBLIC OtherParameter2 AS STRING = "gambas.one"
PUBLIC OtherParameter3 AS STRING = "gambas-club.de"
PUBLIC OtherParameter4 AS STRING = "gambas-it.org"

PUBLIC SUB Load(OPTIONAL sFile AS STRING)

DIM jConfig AS Collection
DIM i AS INTEGER
DIM sSymbol AS STRING
DIM obj AS OBJECT = ME
DIM MyClass AS Class = Object.Class(obj)

IF sFile = "" THEN
sFile = User.Home &/ ConfigFile
ENDIF

IF Exist(sFile) THEN
jConfig = JSON.FromString(File.Load(sFile))
FOR EACH sSymbol IN myClass.Symbols
IF jConfig.Exist(sSymbol) THEN
Object.SetProperty(obj, sSymbol, jConfig[sSymbol])
ENDIF
NEXT
ENDIF
END

STATIC PUBLIC SUB Save(OPTIONAL sFile AS STRING)
DIM i AS INTEGER
DIM jConfig AS NEW JSONCollection
DIM obj AS OBJECT = ME
DIM MyClass AS Class = Object.Class(obj)
DIM Var AS STRING
DIM Valor AS VARIANT
IF sFile = "" THEN
sFile = User.Home &/ ConfigFile
ENDIF
FOR EACH Var IN myClass.Symbols
'' Verifying that it is a property or a variable.
IF (MyClass[var].kind = Class.Variable) OR (MyClass[var].kind = Class.Property) THEN
valor = Object.GetProperty(obj, var)
jConfig.Add(Valor, var)
END IF
NEXT
IF NOT Exist(File.Dir(sFile)) THEN
SHELL "mkdir -p " & File.Dir(sFile) WAIT
ENDIF
File.Save(sFile, JSON.Encode(jConfig))
END


Par exemple dans un formulaire...
1
2
3
4
5
6
7
PUBLIC SUB Form_Open()
Config.Load()
PRINT "Color saved", Config.CurrentColor
Config.CurrentColor = Rand(0, 255)
PRINT "Color to save", Config.CurrentColor
Config.Save()
END


Cette méthode étend la classe JSON et permet d'encoder le texte Json dans une forme plus lisible pour les humains. Pour l'utiliser vous devez créer une classe dans votre projet appelée JSON (avec des lettres majuscules) et ensuite mettre ce code (Encode2) prêt alors au lieu d'utiliser JSON.Encode dans vos projets utilisez JSON.Encode2 et vous avez terminé.

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
' Gambas class file

EXPORT

'' Encode in JSON format in a human readable way. Based on a Laurent tool

STATIC PUBLIC FUNCTION Encode2(vData AS VARIANT) AS STRING

DIM sInput AS STRING
DIM sOutput AS STRING
DIM iStream AS Stream

DIM $sReadChar AS STRING
DIM $iTab AS INTEGER
DIM $bQuote, $bBracket AS BOOLEAN

sInput = JSON.Encode(vData)

iStream = OPEN STRING sInput FOR READ

WHILE (NOT Eof(iStream))
$sReadChar = READ #iStream, 1
IF ($sReadChar = "{" AND NOT $bQuote) THEN
$iTab += 1
$sReadChar &= "\n" & Space$($iTab * 2)
ELSE IF ($sReadChar = "}" AND NOT $bQuote) THEN
$iTab -= 1
$sReadChar = "\n" & Space$($iTab * 2) & $sReadChar
ELSE IF ($sReadChar = "\"") THEN
$bQuote = NOT $bQuote
ELSE IF ($sReadChar = "[") THEN
$bBracket = TRUE
ELSE IF ($sReadChar = "]") THEN
$bBracket = FALSE
ELSE IF ($sReadChar = ":" AND NOT $bQuote) THEN
$sReadChar &= " "
ELSE IF ($sReadChar = "," AND NOT $bQuote) THEN
IF (NOT $bBracket) THEN
$sReadChar &= "\n" & Space$($iTab * 2)
ELSE
$sReadChar &= " "
ENDIF
ENDIF
sOutput &= $sReadChar
WEND

CLOSE iStream
' replace null with ""
sOutput = Replace(sOutput, " null", " \"\"")

RETURN sOutput

END