Curso básico de programación en Visual Basic

  Lección 44

Solución, guardar y leer Cconfig

 

Realizamos programas para la gestión de empresas. Empresas medianas y pequeñas. Programas de contabilidad, cartera de pedidos clientes proveedores, facturación control de albaranes, tesorería cartera de cobros y pagos y estadísticas.

Nuestro agradecimiento a todos los que por unas causas o por otras visitan nuestra web. Gestión de empresas PYMES. Curso de programación de Visual Basic.


 

Las soluciones de la entrega 44

Empezaremos viendo las soluciones al ejercicio propuesto en la entrega (44) anterior, además de algo que no estaba explícitamente propuesto, pero que si no lo has hecho, no te funcionaría bien.

Este sería el código a usar en los métodos Guardar y Leer de la clase cConfig.
Empezaremos por el método Guardar que es el más simple y después veremos el método Leer en el que habrá que hacer algunas comprobaciones extras:

Public Sub Guardar(ByVal fichero As String)
    ' guardar en el fichero indicado los valores de las propiedades de la clase
    '
    ' el código está omitido para que lo hagas como ejercicio
    ' SOLUCIÓN:
    Dim nFic As Long
    '
    On Error Resume Next

    ' asignar un "canal" libre
    nFic = FreeFile
    ' abrir el fichero para escritura en el canal indicado
    Open fichero For Output As nFic
    ' guardar las cuatro propiedades de esta clase
    Print #nFic, Me.Valor1
    Print #nFic, Me.Valor2
    Print #nFic, Me.Valor3
    Print #nFic, Me.Opcion1
    ' cerrar el canal abierto
    Close nFic
    '
End Sub

Como puedes comprobar, el código es de lo más simple. Una vez abierto el fichero indicado, se guardan los valores de las cuatro propiedades de la clase. Usamos On Error Resume Next, por si el disco estuviera lleno o no disponible...

Veamos ahora el código de Leer.

Public Sub Leer(ByVal fichero As String)
    ' leer del fichero indicado los valores de las propiedades de la clase
    '
    ' el código está omitido para que lo hagas como ejercicio
    ' SOLUCIÓN:
    Dim nFic As Long
    Dim s As String
    '
    ' comprobar si existe el fichero
    ' si no existe, se sale del procedimiento y no se hace nada
'    If Dir$(fichero) = "" Then
'        Exit Sub
'    End If
    '
    ' NOTA:
    '   Es posible, que si el nombre del fichero está mal formado
    '   (no es un nombre válido), se produzca un error.
    '   En ese caso se podría usar el siguiente código,
    '   o usar una función ExistFile como se ha mostrado en entregas anteriores.
    Dim i As Long
    '
    On Error Resume Next

    i = Len(Dir$(fichero))
    ' Si se produce un error en la línea anterior, es que no existe.
    ' Además de que si i vale cero, es que no existe.
    If Err.Number <> 0 Or i = 0 Then
        Exit Sub
    End If
    '
    '
    ' asignar un "canal" libre
    nFic = FreeFile
    ' abrir el fichero para lectura en el canal indicado
    Open fichero For Input As nFic
    ' leer los cuatro valores en el mismo orden en el que se guardaron
    Line Input #nFic, s
    Me.Valor1 = s
    Line Input #nFic, s
    Me.Valor2 = s
    Line Input #nFic, s
    Me.Valor3 = s
    Line Input #nFic, s
    ' Nota:
    '   Esta asignación también puede dar error si se ha manipulado el fichero,
    '   para evitar ese error, podemos usar On Error Resume Next para evitar
    '   que el programa se detenga.
    '
    '   Como resulta que ya tenemos un On Error activo, no será necesario
    '   indicarlo nuevamente, pero si la comprobación de que el fichero existe
    '   se hace desde una función, habría que quitar el comentario.
    'On Error Resume Next
    Me.Opcion1 = CBool(s)
    ' cerrar el canal abierto
    Close nFic
    '
End Sub

Este tampoco es complicado, aunque algo más "largo" que el anterior, entre otras cosas porque se hace una comprobación de que el fichero indicado existe y otra de que el valor asignado a la propiedad Opcion1 es el correcto. En teoría no habría que hacer estas comparaciones, o al menos no habría porqué usar On Error, ya que se supone que el nombre del fichero es correcto, independientemente de que dicho fichero exista o no y por otro lado, cuando se lea ese fichero los datos estarán guardados de forma correcta. Pero siempre es preferible prevenir.

Ahora veamos el código del formulario principal, tanto del evento producido al guardar como al leer:

Private Sub cmdGuardar_Click()
    ' guardar los datos en un fichero
    '
    ' SOLUCIÓN:
    ' (aunque no estaba como ejercicio, si no se hace, no se guarda correctamente)
    '
    ' Asignamos los valores a la clase y guardarlos
    mConfig.Valor1 = Text1
    mConfig.Valor2 = Text2
    mConfig.Valor3 = Text3
    If Check1.Value = vbChecked Then
        mConfig.Opcion1 = True
    Else
        mConfig.Opcion1 = False
    End If
    '
    mConfig.Guardar sFic
End Sub

Private Sub cmdLeer_Click()
    ' leer los datos del fichero indicado
    mConfig.Leer sFic
    '
    '
    '$POR HACER: actualizar los controles con los valores de mConfig
    ' SOLUCIÓN:
    asignarConfig mConfig
    '
    '
End Sub

En el caso del evento producido al pulsar en el botón Guardar, antes de llamar al método correspondiente de la clase, hay que asignar los valores a las propiedades de dicha clase.
Para el evento del botón Leer lo tenemos más fácil ya que todo el trabajo de asignar el contenido de la clase en los controles del formulario se hace por medio del procedimiento asignarConfig.

Espero y confío en que lo hayas hecho bien... y si no es así... pues tampoco pasa nada, ya que por eso te doy la solución... je, je.