tincho 01-06-2021, 10:37
[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
Código:
' 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

Por ejemplo en un formulario...
Código:
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

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.
Código:
' Gambas class file

'
' Copyright (C) GauchoCAD Team
'
' This program is free software; you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation; either version 2 of the License, or
' (at your option) any later version.

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

Agregado  - 2023.05.04 - Proyecto de estudio que utiliza la clase Config. Hay un nuevo control, una clase llamada ListMaker, que permite la edición de lista de datos.

Saludos.
Archivos adjuntos
.gz
json-config-0.0.3.tar.gz (Tamaño: 44.64 KB Descargas: 5)
Shordi 30-05-2021, 10:08
A raíz de otro tema donde Tincho referencia un viejo post del foro antiguo donde presentaba una serie de controles propios para manejo de bases de datos, compruebo que el gusanillo del foro sigue vivo en mi vieja cabeza y no me resisto a traeros el programa en el que estoy trabajando y que es una nueva versión de uno que los foreros antiguos conocerán: el Soprano (Sólo Otro Programa de Recursos y Ayuda al NOvelista).

Ante todo permitidme daros la paliza con un poco de historia (es como funcionamos los viejos):

De toda la vida he aspirado a escribir ficción pero la vida laboral no me daba ni tiempo ni estado mental suficiente para ello. No recuerdo el año, pero hace ya mucho, cayó en mis manos un programa (IWriter, creo que se llamaba, aunque lo he googleado y así se llama hoy una plataforma de no sé qué servicio web) enfocado a escribir ficción. Era para windows, pero me encantó. No encontré entonces un equivalente en Linux por lo que, para eso soy programador, decidí hacer un clon y lo llamé Soprano.

Aquél clon (no recuerdo si llegué a subirlo al foro) nunca llegó a funcionar bien, pero me dejó la espinita clavada para siempre. Luego aparecieron otros programas, como scribener también para windows y considerado el mejor en su clase, bibisco, y manusKript (versión linux de scribener). El enfoque que le daban al tema me gustó mucho más que el del viejo iWriter, y abandoné mi querido Soprano para utilizar manusKript. Sin embargo, aún siendo mucho mejor que mi Soprano, tenía los problemas que todo software que no es tuyo tiene: las actualizaciones eran muy lentas y las modificaciones sugeridas se perdían en colas de espera eternas. Dos soluciones tenía, o aprendía Python para hacer mi propia versión, cosa inaceptable, o me hacía mi programa en gambas imitando manusKript que a su vez imitaba a scribener.

Con eso nació la siguiente versión de Soprano, que inicié en mis últimos años de vida laboral y que terminé nada más jubilarme y con el que escribí mis primeros proyectos de ficción. Pero no todo el monte es orégano. El uso del nuevo programa y el desarrollo de mis hábitos y maneras de escribir me demostró que había un montón de "features" que le había añadido al programa sólo porque otros programas lo tenías y quedaba chulo, además, pero que luego nunca llegué a utilizar.

Jubilado como estoy me dije: Estoy jubilado. Tengo tiempo. Hago otro. (Nadie dijo que mis conversaciones conmigo mismo sean inteligentes) y así nació el que ahora os traigo.
Es mucho más simple, tanto en su apariencia como en su funcionamiento. No maneja bases de datos, no utiliza controles propios, salvo el editor de texto basado en richText, que es lo mismo que decir html y que he mantenido como control independiente por si algún día quiero utilizarlo en algún otro sitio (este editor puede ser la única parte que os interese como programadores, supongo).

Este era el Soprano anterior:
[Imagen: sBXcadS.png]
y este es el nuevo:
[Imagen: sMtjdz5.png]
Como veis, nada de iconitos, montones de opciones desaparecidas, nada de barras de desplazamientos de colorines ni iconos en las listas, etc. etc. El aspecto del nuevo es absolutamente sobrio porque tanta cosita puesta en lugar de ayudarme me distraía. De casi 11.000 líneas de código lo he dejado en menos de 5.000

No está terminado. Aún me surgen fallos y cuelgues... pero bueno, supongo que ya está presentable en sociedad.

Las características básicas son:

Abandono por primera vez mi querido control de workspaces y utilizo las ventanas independientes.

No utilizo controles propios (salvo el editor) y no utilizo bases de datos, sólo la clase Settings, de la que se maneja un archivo de propiedades generales del programa y otro archivo propio de cada proyecto con sus propiedades específicas.

No utilizo json ni webview para las estadísticas. Sólo la clase gb.chart de gambas, que es algo limitada pero me vale para lo que quiero. Tenía diseñados unos logos pero me cansé de ellos y he puesto un icono muy naif (pillado en la web) y una foto de mi antigua máquina de escribir, con la que aprendí a teclear hace más de cuarenta años.

No os cuento más para no hacer ésto eterno. Luego pondré otro post específico sobre el control rtEditor, que es quizá lo único que os pueda interesar.

Saludos

P.D.: En principio había colgado aquí el código fuente, pero dados todos los cambios que podéis ir siguiendo en este hilo, mejor que  aquél que tenga algún interés, se pase por https://gitlab.com/shordi/soprano Ahí siempre tendréis a mano la última versión... y por supuesto se aceptan colaboraciones y mejoras.
tercoide 29-05-2021, 13:33
He descubierto que Gambas, desde no-se-cual versión, permite enlaces simbólicos en sus archivos. Esto es una gran ventaja para los que tenemos módulos o clases con funciones que utilizamos en todos nuestros programas, porque solo basta con hacer las mejoras en un solo archivo y se propagan al resto. La única contra que le he visto a esta nueva posibilidad es que cuando trabajamos en equipo en Git, el repositorio guarda el enlace simbolico y no el código, con lo que nuestros compañeros no lo verán.
Que solución se les ocurre a esto?

ejemplo en GitHub
Páginas (553):    1 424 425 426 427 428 553   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 280
Último miembro: herbert
Temas del foro: 1,705
Mensajes del foro: 8,848
Últimos temas
Error de sistema "Demasia...
Foro: General
Último mensaje por: Shordi, Ayer, 19:42
Respuestas: 3 - Vistas: 85
controlar el Activado/Des...
Foro: General
Último mensaje por: Shordi, 10-05-2025, 08:08
Respuestas: 1 - Vistas: 65
Conexión Bluetooth: RFCOM...
Foro: Hardware & IoT
Último mensaje por: jguardon, 06-05-2025, 16:57
Respuestas: 5 - Vistas: 211
gb.db2: columnas calculad...
Foro: Bases de Datos
Último mensaje por: guizans, 04-05-2025, 21:02
Respuestas: 14 - Vistas: 569
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.