Shordi   18-04-2024, 18:31
#1
Acabo de subir la primera parte, la presentación, de una serie de video-tutoriales que tengo planeada sobre "Cómo hacer una aplicación "profesional" desde cero con Gambas3".
La idea es dar un ejemplo de cómo se pueden integrar todas esas cosas que vemos en los tutoriales esparcidos por esos mundos de dios en un sólo programa coherente.
El programa se supone que sirve para controlar un pequeño restaurante y la idea es aplicar todo lo que se ha hablado por ahí pero que nunca se ha visto junto, a saber:

-Configuraciones con gbSettings
-Creación y manejo de Bases de datos (sqlite en este caso)
-Controles auto-adaptables a los tamaños de pantalla
-Copias de seguridad
-Y muchas cosas más que la mnemo-decadencia no me deja escribir ahora.

Las siguientes entregas de la serie las iré comunicando en éste hilo para no hacerme tan pesado.
La primera es sólo la declaración de intenciones.



Saludos
Última modificación: 20-04-2024, 13:21 por Shordi.

No podemos regresar
guizans   18-04-2024, 22:11
#2
Vídeos como el tuyo es lo que hace falta. Esperando el segundo vídeo.

Un saludo.
tincho   19-04-2024, 10:15
#3
Siempre es enriquecedor ver tus videos, así que muchas gracias por preparar este material y compartirlo.
Te paso algo de feedback.
Configuraciones: Si bien la clase Settings hace su trabajo bastante bien, esta adolece de algunos problemas, por ejemplo si una variable es cero o nula la borra del archivo de configuraciones que es de tipo .ini (bastante obsoleto ya) luego no permite el uso del operador punto para recuperar o alterar los parámetros. En su lugar sugiero que usar la clase Config que usa un archivo tipo JSON, mas moderno y que permite que se construyan formularios de edición de la configuración de forma sencilla.
Clase config
Código:
' Gambas class file

Create Static
Export

'' Ejemplo de variables usadas en EditorForm
Public EditorTheme As String  '' Text editor theme
Public EditorWrap As Boolean  '' Wrap text in editor
Public EditorSwap As Boolean  '' Swap between image or web
Public EditorTextHeight As Integer
Public EditorLineNumber As Boolean
Public EditorIcon As Boolean
Public EditorPreview As Boolean
Public EditorLayout As Integer[]
Public EditorLearning As New Collection

Public Sub Load(sFile As String)

  Dim cConfig As Collection
  Dim sSymbol As String
  Dim obj As Object = Me
  Dim MyClass As Class = Object.Class(obj)

  If Exist(sFile) Then
    cConfig = JSON.FromString(File.Load(sFile))
    For Each sSymbol In myClass.Symbols
      If cConfig.Exist(sSymbol) Then
        Object.SetProperty(obj, sSymbol, cConfig[sSymbol])
      Endif
    Next
  Endif

End

Static Public Sub Save(sFile As String, Optional j As JSONCollection)

  Dim jConfig As New JSONCollection
  Dim obj As Object = Me
  Dim MyClass As Class = Object.Class(obj)
  Dim sSymbol As String
  Dim Var As String
  Dim Valor As Variant

  If Not Exist(File.Dir(sFile)) Then
    Shell "mkdir -p " & File.Dir(sFile) Wait
  Endif

  If j Then
    jConfig = j.Copy()
    For Each sSymbol In myClass.Symbols
      If jConfig.Exist(sSymbol) Then
        Object.SetProperty(obj, sSymbol, jConfig[sSymbol])
      Endif
    Next
  Else
    For Each Var In myClass.Symbols
      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
  Endif

  File.Save(sFile, JSON.Encode2(jConfig))

End

Luego en el formulario principal hay que iniciar la clase y cargar la configuración del archivo.
Código:
'' Startup the config environment data
  Config.AppDir = User.Home &/ ".config/rad"
  Config.Depot = Config.AppDir &/ "config.json"

'' Uploading and setting up the configuration
  Config.Load(Config.Depot)
Luego cada vez que algún parámetro es alterado en cualquier parte
Código:
    Config.Save(Config.Depot) ' Config.Depot es la ruta al arcuvo cargada al inicio, reconozco que esto podría mejorarse y ser un parametro opcional que este definido al pincipio y luego no sea necesario especificarlo cada vez. o tal vez que la misma clase guarde cada cambio instantáneamente.
Para recuperar el valor de una variable solo basta con poner, en cualquier parte del programa:
Código:
Config.NombreDeLaVariable
'Por ejemplo
Config.EditorIcon
' Esto devolverá un booleano
' para alterar el valor de la variable
Config.EditorIcon = False
' No se por que no hice que se guarde inmediatamente. revisare el tema

1 Saludo.
Shordi   19-04-2024, 12:41
#4
Cita:Configuraciones: Si bien la clase Settings hace su trabajo bastante bien, esta adolece de algunos problemas, por ejemplo si una variable es cero o nula la borra del archivo de configuraciones que es de tipo .ini
Cierto, pero eso se suple vía código dándole el parámetro por defecto. Supón un campo booleano

[code]

vBool tomará el valor que haya en el el archivo settings o True si es que no existe en él.
La única desventaja es que Settings no sirve como archivo de intercambio entre aplicaciones distintas, cosa que json sí, pero ese no es el objetivo de la clase y para los efectos de almacenar configuraciones es perfecto.

Por otra parte, Settings se integra en nuestro programa "silenciosamente" es decir, si tengo que seguir el código línea a línea y soy un novato, ese código avanzado que añades es un lío. De todas formas esa clase que adjunta, y que ya conocía, es genial y la uso en algún que otro programita mío. Muchas gracias por el interés.

Saludos

No podemos regresar
tincho   19-04-2024, 16:36
#5
(19-04-2024, 12:41)Shordi escribió: Por otra parte, Settings se integra en nuestro programa "silenciosamente" es decir, si tengo que seguir el código línea a línea y soy un novato, ese código avanzado que añades es un lío. De todas formas esa clase que adjunta, y que ya conocía, es genial y la uso en algún que otro programita mío. Muchas gracias por el interés.

No estoy de acuerdo en que la clase  config agregue complejidad que el usuario "novato" no sepa manejar. Porque justamente la clase oculta toda la complejidad dentro de la clase y permite acceder a las variables que esta contiene con el operador punto.
De verdad esto es mas complejo

Código:
vBool = Config.valBool

Que esto otro ?

Código:
vBool = Setting["General/valBool",True]

Al usar el operador punto, el programador (novato y el experimentado también) no cometerá ningún error al escribir, ya que la selecciona de una lista, en cambio en Settings puede escribir mal el nombre de la entrada y el código ni se entera.
Por ejemplo si luego de varios meses ese programador retoma el código y escribe "general/valBool" en lugar de "General/valBool" existirán dos valores revoloteando por el código  haciendo que este se comporte de forma impredecible.

Coincido en que Settings es mas fácil de implementar pero es para programas sencillitos y pequeños. Si quieres hacer un programa "Profesional" lo adecuado es usar JSON es decir la clase Config, que es mejorable por supuesto pero mejor y mas segura en cuanto al tratamiento de los datos.
Otra ventaja de Config es que todas las variables están en un solo lugar y no desperdigadas por todo el Código.

1 Saludo.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.