Usando Estructuras de Datos:
ejemplo de insertar/modificar/borrar y
guardar datos en un archivo plano.
Este es un ejemplo de como se puede gestionar datos usando estructuras de datos, podeis encontrar más información en
curso de gambas: estructuras de datos
Las estruturas de datos se definen de la siguiente manera en gambas:
PUBLIC STRUCT Identifier
Field 1 [ Embedded array declaration ] AS [ Datatype ]
Field 2 [ Embedded array declaration ] AS [ Datatype ]
. . .
Field n [ Embedded array declaration ] AS [ Datatype ]
END STRUCT
En el ejemplo vamos a usar este estructura:
Public Struct datos
asunto As String
color As Integer
fecha As Date
descripcion As String
End
Que nos permitirá almacenar los datos de un "recordatorio", osea un asunto , un color (para determinar el nivel de importancia del asunto, una fecha y la descripción del asunto.
El usuario manejará todas las opciónes desde el siguiente formulario:
Haciendo las acciones habituales con los datos: añadir, modificar, borrar, desplazarnos por los registros.
Ademas he añadido la opción de "leer datos" y "guardar datos", para que sea posible tener los datos en el disco duro salvados.
Internamente, la estructura del programa es asi:
Tenemos la clase GestionarDatos, que tiene los métodos para trabajar con los datos
Y luego tenemos el formulario, donde se ha minimizado el código, usando un objeto de la clase "GestionarDatos", para que haga las acciones que elija el usuario.
Código Fuente:
Clase GestionarDatos
-
' Gambas class file
Public RutaDatos As String = User .home & "/Comentarios.dat"
Public Struct datos
asunto As String
color As Integer
fecha As Date
descripcion As String
End Struct
Private lista As Datos[ ]
Private $indice As Integer
Public Sub _new( )
lista = New Datos[ ] ' inicio array de datos de listas
End
Public Sub add( d As Datos)
lista.Add ( d)
Message .Info ( ( "Registro Añadido" ) ) ' lo pongo con doble parentesis para que pueda se traducido a otros idiomas.
End
Public Function rescata( indice As Integer ) As Datos
Dim registro As New Datos
Try registro = lista[ indice]
If Error Then
Message .Error ( "Ha habido un problema al intentar leer el registro indicado" )
Return Null
Else
$indice = indice
Return registro
Endif
End
Public Function erase( indice As Integer ) As Boolean
Try lista.Delete ( indice)
If Error Then
Message .Error ( "Ha habido un problema al intentar Borrar el registro indicado" )
Return False
Else
Return True
Endif
End
Public Sub setIndice( a As Integer )
'comprobación de que a es admisible
If a < 0 Then
Message .Error ( ( "No es posible ir a ese indice, ya hemos llegado al primero" ) )
Return
Endif
If a > lista.max Then
Message .Error ( ( "No es posible ir a ese indice ya hemos llegado al ultimo" ) )
Return
Endif
$indice = a
End
Public Sub getIndice( ) As Integer
Return $indice
End
Public Function getNumeroRegistros( ) As Integer
Return lista.max
End
Public Sub modificar( d As Datos, i As Integer )
Try lista[ i] = d
If Error Then
Message .Error ( ( "Se ha producido un error al intentar actualizar los datos" ) )
Else
Message .Info ( ( "Registro modificado correctamente" ) )
Endif
End
Public Sub guardardatos( )
Dim contenido As String
Dim linearegistro As String
Dim registrotmp As Datos
Dim a As Integer
For a = 0 To lista.max ' tambien vale lista.count-1
registrotmp = lista[ a]
linearegistro = registrotmp.asunto & "|" & registrotmp.color & "|" & registrotmp.descripcion & "|" & registrotmp.fecha
contenido &= linearegistro & gb.Cr 'tambien vale poner "\n"
Next
File .Save ( RutaDatos, contenido)
End
Public Sub leerdatos( )
Dim contenido As String
Dim arrayLineas As String [ ]
Dim DatosLinea As String [ ]
Dim registrotmp As Datos
Dim a As Integer
Dim f As String 'fecha en formato texto
contenido = File .Load ( RutaDatos)
arrayLineas = Split ( contenido, gb.CrLf )
For a = 0 To arrayLineas.Max
If arrayLineas[ a] <> "" Then
DatosLinea = Split ( arrayLineas[ a] , "|" )
registrotmp = New Datos 'esta linea es muy importante ya que reinstancia la variable
registrotmp.asunto = DatosLinea[ 0 ]
registrotmp.color = Val ( DatosLinea[ 1 ] )
registrotmp.descripcion = DatosLinea[ 2 ]
f = DatosLinea[ 3 ]
registrotmp.fecha = Date ( Mid$ ( f, 7 , Len ( f) ) , Mid$ ( f, 1 , 2 ) , Mid$ ( f, 4 , 2 ) )
lista.Add ( registrotmp)
Endif
Next
End
-
-
' Gambas class file
Public Struct datos
asunto As String
color As Integer
fecha As Date
descripcion As String
End Struct
Private ges As New GestionarDatos
Public Sub _new( )
limpio( )
End
Public Sub Form_Open( )
Me .text = "Ejemplo de Estructuras: Programa Recordatorio"
Me .center
End
Public Sub ButtonAdd_Click( )
Dim registroTmp As Datos
registroTmp = New Datos 'instancio
registroTmp.asunto = TextBoxAsunto.Text
registroTmp.color = ColorButtonNivelImportancia.Value
registroTmp.fecha = DateBoxFecha.Value
registroTmp.descripcion = TextAreaDescripcion.Text
'añado el regitro usando el método .add
ges.add ( registroTmp)
'borro datos
limpio( )
'pongo el Id del registro
ValueBoxIndice.value = ges.getNumeroRegistros ( ) + 1
End
'-------------------------------------
Public Sub limpio( )
TextAreaDescripcion.text = ""
TextBoxAsunto.text = ""
ColorButtonNivelImportancia.value = Color.White
DateBoxFecha.value = Now 'fecha actual
End
Public Sub ButtonIr_Click( )
Dim registroTmp As Datos
registroTmp = ges.rescata ( ValueBoxIndice.value )
If IsNull ( registroTmp) Then
'el indice ha sido mal introducido y no puedo hacer nada....
Else
TextBoxAsunto.text = registroTmp.asunto
TextAreaDescripcion.text = registroTmp.descripcion
DateBoxFecha.value = registroTmp.fecha
ColorButtonNivelImportancia.value = registroTmp.color
Endif
End
Public Sub ButtonBorrar_Click( )
'intengo borrar el indice indicado...
ges.erase ( ValueBoxIndice.value )
If ges.erase ( ValueBoxIndice.value ) = True Then
limpio( )
Endif
End
Public Sub ButtonPrimero_Click( )
ValueBoxIndice.value = 0
ges.setIndice ( 0 )
ButtonIr_Click( )
End
Public Sub ButtonUltimo_Click( )
ValueBoxIndice.value = ges.getNumeroRegistros ( )
ges.setIndice ( ges.getNumeroRegistros ( ) )
ButtonIr_Click( )
End
Public Sub ButtonAtras_Click( )
ges.setIndice ( ges.getIndice ( ) - 1 )
ValueBoxIndice.value = ges.getIndice ( )
ButtonIr_Click( )
End
Public Sub ButtonSiguiente_Click( )
ges.setIndice ( ges.getIndice ( ) + 1 )
ValueBoxIndice.value = ges.getIndice ( )
ButtonIr_Click( )
End
Public Sub ButtonModificar_Click( )
'segun el indice donde estoy, lo edito...
'
Dim registroTmp As Datos
registroTmp = New Datos 'instancio
registroTmp.asunto = TextBoxAsunto.Text
registroTmp.color = ColorButtonNivelImportancia.Value
registroTmp.fecha = DateBoxFecha.Value
registroTmp.descripcion = TextAreaDescripcion.Text
'añado el regitro usando el método .add
ges.modificar ( registroTmp, ValueBoxIndice.value )
End
Public Sub ButtonLeerDatos_Click( )
ges.leerdatos ( )
ButtonPrimero_Click( )
End
Public Sub ButtonGuardarDatos_Click( )
ges.guardardatos ( )
End
-
Descargar
No hay comentarios:
Publicar un comentario