Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Presentando Config class, configuracion de programas con JSON
#1
Bug 

[Imagen: nnwUBmA.jpg]
Hola amigos.
Deseo presentarles un método para gestionar la configuración de  un programa, que a mi me parece interesante.
En conjunto con TercoIDE preparamos este ejemplo en el cual en una clase existen todos los parámetros de un programa y con gran flexibilidad pueden agregarse mas. Luego en cualquier otra parte del programa se pueden leer y escribir esas variables.
Finalmente existe un método (Save) que recorre los simbolos de la clase y los guarda en un archivo de texto en formato json para futuros usos recuperando estos datos con el método "Load".
Por favor siéntanse en libertad de opinar, comentar o mejorar este programa.
Config.class
GAMBAS
  1. ' Gambas class file
  2. Private Const ConfigFile As String = ".app/config.json"
  3. ''Configuration variables to be saved, add as needed below
  4. Public CurrentColor As Byte = 1
  5. Public CurrentWidth As Byte = 1
  6. Public CurrentLType As Byte = 1
  7. Public OtherParameter1 As String = "gambas-es.org"
  8. Public OtherParameter2 As String = "gambas.one"
  9. Public OtherParameter3 As String = "gambas-club.de"
  10. Public OtherParameter4 As String = "gambas-it.org"
  11.  
  12.  
  13.   Dim jConfig As Collection
  14.   Dim sSymbol As String
  15.   Dim obj As Object = Me
  16.   Dim MyClass As Class = Object.Class(obj)
  17.  
  18.   If sFile = "" Then
  19.     sFile = User.Home &/ ConfigFile
  20.  
  21.   If Exist(sFile) Then
  22.     jConfig = JSON.FromString(File.Load(sFile))
  23.     For Each sSymbol In myClass.Symbols
  24.       If jConfig.Exist(sSymbol) Then
  25.         Object.SetProperty(obj, sSymbol, jConfig[sSymbol])
  26.       Endif
  27.     Next
  28.  
  29.   Dim jConfig As New JSONCollection
  30.   Dim obj As Object = Me
  31.   Dim MyClass As Class = Object.Class(obj)
  32.   Dim Var As String
  33.   Dim Valor As Variant
  34.   If sFile = "" Then
  35.     sFile = User.Home &/ ConfigFile
  36.   For Each Var In myClass.Symbols
  37.     '' Verifying that it is a property or a variable.
  38.     If (MyClass[var].kind = Class.Variable) Or (MyClass[var].kind = Class.Property) Then
  39.       valor = Object.GetProperty(obj, var)
  40.       jConfig.Add(Valor, var)
  41.     End If
  42.   Next
  43.   If Not Exist(File.Dir(sFile)) Then
  44.     Shell "mkdir -p " & File.Dir(sFile) Wait
  45.   File.Save(sFile, JSON.Encode(jConfig))



Por ejemplo en un formulario...
GAMBAS
  1. Public Sub Form_Open()
  2.   Config.Load()
  3.   Print "Color saved", Config.CurrentColor
  4.   Config.CurrentColor = Rand(0, 255)
  5.   Print "Color to save", Config.CurrentColor
  6.   Config.Save()



Agregado  - 2021.08.20
Este método extiende la clase JSON y lo que hace es codificar el texto Json en una forma mas legible para humanos. Para usarla tienen que crear una clase en su proyecto que se llame JSON (con mayúsculas) y luego poner este código (Encode2) listo luego en vez de usar JSON.Encode en sus proyectos usen JSON.Encode2 y listo.
GAMBAS
  1. ' Gambas class file
  2.  
  3. '
  4. ' Copyright (C) GauchoCAD Team
  5. '
  6. ' This program is free software; you can redistribute it and/or modify
  7. ' it under the terms of the GNU General Public License as published by
  8. ' the Free Software Foundation; either version 2 of the License, or
  9. ' (at your option) any later version.
  10.  
  11.  
  12. '' Encode in JSON format in a human readable way. Based on a Laurent tool
  13.  
  14.  
  15.   Dim sInput As String
  16.   Dim sOutput As String
  17.   Dim iStream As Stream
  18.  
  19.   Dim $sReadChar As String
  20.   Dim $iTab As Integer
  21.   Dim $bQuote, $bBracket As Boolean
  22.  
  23.   sInput = JSON.Encode(vData)
  24.  
  25.   iStream = Open String sInput For Read
  26.  
  27.   While (Not Eof(iStream))
  28.     $sReadChar = Read #iStream, 1
  29.     If ($sReadChar = "{" And Not $bQuote) Then
  30.       $iTab += 1
  31.       $sReadChar &= "\n" & Space$($iTab * 2)
  32.     Else If ($sReadChar = "}" And Not $bQuote) Then
  33.       $iTab -= 1
  34.       $sReadChar = "\n" & Space$($iTab * 2) & $sReadChar
  35.     Else If ($sReadChar = "\"") Then
  36.       $bQuote = Not $bQuote
  37.     Else If ($sReadChar = "[") Then
  38.       $bBracket = True
  39.     Else If ($sReadChar = "]") Then
  40.       $bBracket = False
  41.     Else If ($sReadChar = ":" And Not $bQuote) Then
  42.       $sReadChar &= " "
  43.     Else If ($sReadChar = "," And Not $bQuote) Then
  44.       If (Not $bBracket) Then
  45.         $sReadChar &= "\n" & Space$($iTab * 2)
  46.       Else
  47.         $sReadChar &= " "
  48.       Endif
  49.     Endif
  50.     sOutput &= $sReadChar
  51.   Wend
  52.  
  53.   Close iStream
  54.   ' replace null with ""
  55.   sOutput = Replace(sOutput, " null", " \"\"")
  56.  
  57.   Return sOutput
  58.  



Saludos.

1 Saludo.
[-] Los siguientes 3 usuarios dicen gracias a tincho por este post:
  • Shell, tercoide, vuott
    ¡Gracias!
#2

La principal ventaja con respecto a settings es que a medida que el programa se expande , simplemente agregamos variables Public que luego tenemos a mano escribiendo en cualquier parte del codigo Config y el punto. Asi, no tenemos q estar recordandolas. Y si tenemos diversas configuraciones, simplemente copiamos y renombramos la clase: Config, WindowPositions, UserOptions , etc .
Lo cómico es que la clase pueda inspeccionarse a si misma en busca de variables.

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
    ¡Gracias!
#3

Está chulo. Supera la clase settings, que es lo que yo ahora uso.

No podemos regresar
    ¡Gracias!
#4

(01-06-2021, 17:04)Shordi escribió:  Supera la clase settings

Settings esta bien para unas pocas variables pero tiene dos problemas, uno es que si alguna variable se guarda como, 0, cadena vacía o Null se pierde del archivo de texto, simplemente desaparece, el otro es que la forma de recuperar o escribir datos es  Settings["El_asunto", "default"]  y Settings["El_asunto"] = "123456" y en este sistema hay que recordar el texto exacto, no es posible usar el operador .
Saludos.

1 Saludo.
    ¡Gracias!
#5

Me ha gustado mucho el detalle de la "introspección", algo muy usual en Python.

La base del funcionamiento son los propios objetos declarados dentro de la clase Config, sin embargo sería genial que no hiciera falta hacerlo y que se creasen dinámicamente a partir del fichero que guardamos. Pero eso ya es otro cantar...

Enhorabuena, me ha gustado mucho!

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
    ¡Gracias!
#6

(01-06-2021, 20:25)jguardon escribió:  ...sería genial ... que se creasen dinámicamente a partir del fichero que guardamos. Pero eso ya es otro cantar...

Al así como hConfic.AddSymbol .... ? pero aunque se pudiese hacer, creo que es mejor mantenerlo como esta porque el archivo de configuracion no existe la primera vez que se usa el programa.
Saludos.

1 Saludo.
    ¡Gracias!
#7

Hola Amigos.
Hice una actualización, concretamente una clase que Extiende JSON para mejorar la codificación y hacerla mas legible por humanos.
Puse todo al pincipio.
Saludos.

1 Saludo.
    ¡Gracias!
#8

Estaria bueno extender esta clase pueda guardar otras clases clases que tenga metidas (y tambien arrays de ellas):
Código:
'Clase1.Class
Public var2 as Integer
Public flxData as Float[]
Código:
 
'Clase2.Class
Public Const d1 as Integer = 7
Public inxData as Integer[]  


 
Código:
'Config.Class
Public var1 as Integer
Public arrClass1 as Clase1[]
Public c2 as Clase2

Lo he intentado sin exito. Confused

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
    ¡Gracias!
#9

(18-10-2022, 21:18)tercoide escribió:  Lo he intentado sin exito. Confused

Creo que el problema radica en que vos querés guardar una clase, y me parece que lo que se puede guardar es la instancia de una clase que no es lo mismo.

1 Saludo.
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje
Último mensaje por tincho
06-11-2020, 18:19

Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)