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