• Domingo 22 de Diciembre de 2024, 23:13

Autor Tema:  Tipos De Archivo  (Leído 1245 veces)

pollogti

  • Miembro activo
  • **
  • Mensajes: 36
    • Ver Perfil
Tipos De Archivo
« en: Domingo 25 de Noviembre de 2007, 18:18 »
0
Me gustaria saber si aqui en vb hay tipos de archivos como en pascal que son archivos de tipo como por ejemplo tipo archivo de struct y que cuando yo lea el archivo lea la structura no un archivo de texto

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Tipos De Archivo
« Respuesta #1 en: Domingo 25 de Noviembre de 2007, 23:35 »
0
No conozco ninguna instrucción en VB que permita hacer lo que dices.

Si alguien más lo sabe, espero nos lo diga.

 :comp:

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Tipos De Archivo
« Respuesta #2 en: Miércoles 12 de Diciembre de 2007, 03:25 »
0
En Visual Basic hay instrucciones para manejar estructuras, como no...
Pero no en la forma que indicas, sino prefijándolas tú en el código.
En teoría hacer lo que deseas lo más parecido que se puede hacer en VB6 es usando recursos de usuario en dicho caso cuando tus programas cambiaran sólo tendrías que editar el fichero de recursos, pero se me antoja que es un modo un poco engorroso. Siempre podrás usar el objeto collection para mantener estructuras dinámicas.

Para estructuras estáticas se usa el 'type' como definición de structuras ayudado por las 'enum' eraciones, para limitar valores... te describo con ejemplos su declaración y utilización.

En un módulo describes tu estructura (ver el code 1 de ejemplo) y luego con ella puedes usarla para leer o escribir en ficheros así como usarla internamente en el programa.

Declarar una estructura: un ejemplo que ilustra la diversidad y el anidado de estructuras...
Código: Text
  1.  
  2. public enum enumCategoria     ' defino contantes fijas para usar como un tipo de datos.
  3.     especial=0
  4.     primera =1
  5.     segunda=2
  6.     tercera=3
  7. end enum
  8.  
  9. public type infoCoordenadas  ' ó private, si no se indica nada se entiende pública.
  10.     latitud as single
  11.     longitud as single
  12. end type
  13.  
  14. public type infoLocalidad
  15.     población as string * 20
  16.     provincia as string * 20
  17.     coordenadas as infoCoordenadas
  18. end type
  19.  
  20. public type infoEstrucutura   ' se puede usar cualquier tipo de datos...
  21.     jamones as integer
  22.     chorizos as integer
  23.     paletas as integer
  24.     categoria as enumCategoria   ' debe declararse previamente un tipo de usuario.
  25.     telefono as string * 9
  26.     origen as string * 16
  27.     localidad as infoLocalidad
  28. end type
  29.  
  30. public type infoAño
  31.     estructura as infoEstructura
  32.     año as integer
  33. end type
  34.  
  35. dim miEstructura as infoEstructura  ' en el código se usará esta variable como una herencia de dicho tipo.
  36. dim anuarioEstructura(0 to 99) as infoAño  ' puede también ser creada una variable de estructura como una matriz de una o varias dimensiones....
  37.  
  38. ' en este ejemplo puede verse la estructura final en infoaño,  luego se ha creado una variable para utilizar sólo una estructura completa, típicamente para manejar estructuras sueltas y con carácter temporal, y luego la diemnsionada para llevar una cuenta basada en los años....
  39.  
  40. ' Nota: las estructuras no precisan llamarse empezando por info... sólo es capricho mío, (que me permite recordar con mayor facilidad luego al usar una variable con el mismo nombre sin el 'info') puede usarse un nombre cualquiera de acuerdo a las reglas convenicionales de nombres de variables (no ser palabras reservadas, no empezar por números, etc...)
  41.  
  42.  
  43.  

Luego de ser declaradas las estructuras y de ccrearse una variable que permita manejarla, ya podremos usarla, empezaremos por un ejemplo que toma los datos de controles de un formulario... que suponemos han sido rellenados por el usuario...

Código: Text
  1.  
  2. ' nota: se omiten las supuestas líneas de control para claridad en el uso de las estructuras (que tendrían por objeto comprobar que los datos introducidos son correctos y dentro de los límites esperados, por ejemplo si se usara un campo para fecha se debería controlar que efectivamente es una fecha y que no refiere al año 3077... se entiende no ? )
  3.  
  4. public function recogeEstructuraDelFormulario() as infoEstructura ' debe devolver por tanto una estructura de infoEstructura, si en vez de una función usáramos una subrutina (sub), podríamos usar una variable global para la asignación de datos, usando la función aseguramos cierta encapsulación.
  5. dim cerditos as infoEstructura
  6.     cerditos .jamones= sliderJamones.value
  7.     cerditos .chorizos=sliderChorizos.value
  8.     cerditos .paletas=sliderPaletas.value
  9.     with cerditos ' también puede usarse el 'with' para no teclear tanto.
  10.          .paletas=sliderPaletas.value  ' esta línea es equivalente a la anterior (usando with)
  11.         .categoria = sliderCategoria.value
  12.         .telefono = textTelefono.text
  13.         .origen = textOrigen.text
  14.         .localidad.poblacion = textPoblacion.text
  15.     end with
  16.     with cerditos .localidad  ' puedes usar with para ahondar en más niveles
  17.         .poblacion = textPoblacion.text  ' esta línea es equivalente a la última
  18.         .provincia = textProvincia.text
  19.         .coordenadas.latitud = sliderLatitud.value /100 ' hemos supuesto un rango de 1-36000 de modo que al diviidir entre 100 tendremos 2 decimales
  20.         .coordenadas.longitud = sliderLongitud.value /100
  21.     end with
  22.     recogeEstructuraDelFormulario=cerditos  ' es el valor de retorno...
  23. end sub
  24.  
  25.  

este ha sido un ejemplo sencillo de recogida de datos de la misma estructura usada en la declaracion. Ahora simulamos que ha sido llamada para ser introducida en un año concreto... y guardar a un fichero.. eso sería otra función..

Código: Text
  1.  
  2. public sub buttonAñadirAño_click()
  3.     static añosCompletados as integer
  4.     dim añoActual as infoEstructura
  5.     dim guardado as boolean
  6.  
  7.     if añosCompletados <> ubound(anuarioEstrucutra) then
  8.         añoActual = recogeEstructuraDelFormulario   ' recogemos los datos del form
  9.         añoscompletados = añosCompletados +1
  10.         anuarioEstructura(añoscompletados ).estructura=añoActual     ' se los asignamos
  11.         anuarioEstructura(añosCompletados ).año=añosCompletados
  12.       
  13.         guardado = guardarEstructuraEnFichero(anuarioEstructura(añosCompletados),añosCompletados, "c:\cerdoIbericoSA.dat")
  14.         if guardado= true then
  15.             call resetEstructuraDelFormulario  ' tomado los datos y verificados y metidos en la estructura final y guardado en fichero, se resetea el formulario
  16.         else
  17.             msgbox "No se pudo guardar la estrucutra del año correspondiente: " & añosCompletados & " en el fichero ocurrió algún tipo de error...", vbcritical, "Error al guardar en fichero..."  
  18.         end if  
  19.     end if
  20.  
  21.  

Código: Text
  1.  
  2.     public function guardarEstructuraEnFichero(j as infoEstructura,año as integer, ruta as string) as boolean
  3.         dim n as integer
  4.         dim puntero as long
  5.  
  6.         n=freefile
  7.         puntero= (len(j) * año) - len(j) +1  ' apunta al final del fichero o no, esto es, si queremos añadir al final deberá ser el último año metido y el puntero sería la longitud del fichero, pero siqueremos modificar un año concreto habrá que sobrescribir exactamente esa zona y no otra..esa pequeña fórmula lo permite.
  8.         on local error goto errorGuardar
  9.         open ruta for binary as #n
  10.             put #n, puntero, j  ' pegar en: fichero, en posición, la estructura dada
  11.         close #n
  12.         guardarEstructuraEnFichero = true
  13.         exit function
  14. errorGuardar:  
  15.     end function
  16.  
  17.  


leer desde un fichero es similar a escribir... y podríamos usarlo para rellenar un reporte de un año cualquiera....
Código: Text
  1.  
  2.     public function leerEstructuraDesdeFichero(año as integer) as boolean
  3.         dim n as integer
  4.         dim puntero as long
  5.  
  6.         if año> ubound(anuarioEstructura then
  7.             call errorLeer(añoNoexiste) ' control de error de año, igaulmente debería usarse similar para valores fuera del rango inferior... se supone hecha la función errorLeer que devuelve un mensaje de acuerdo al error producido
  8.             exit function
  9.         end if
  10.         n=freefile
  11.         puntero= (len(infoEstructura) * año) - len(infoEstructura) +1
  12.  
  13.         on local error goto errorLectura
  14.             open ruta for binary as #n
  15.                 get #n, puntero, miEstructura ' usamos la estructura pública, para almacenar los datos, ya que la función la usamos para devolver si correcto o error, también podríamos usar un byref para devolverlo como parámetro desde la llamada...
  16.         close #n
  17.         leerEstructuraDesdeFichero= true
  18.         
  19.         exit function
  20. errorLectura:  ' será si hay problemas al abrir el archivo o al leerlo
  21.     end function
  22.  
  23.  

evidentemente es posible leer o escribir cualquier parte de la estructura no es necesario que sea entera, en ese caso se debe calcular la posición absoluta de comienzo de la estructura y luego la posición relativa del campo ó campos...
Calcular la posición relativa es algo que resulta conveniente hacerlo como comentario directamente en la estructura (en su declaración), siguiendo la convención del tamaño de los datos... single= 4 bytes, integer=2 bytes, etc... de hecho quizás resulte más cómodo escribir o leer semiestructuras completas en vez de sólo un campo, así se simplifica el uso de cálculo de punteros relativos. Por ejemplo podemos crear una variable para contener datos de la localidad y actualizar sólo ese dato cuando cambie o haya error

dim direccion as infolocalidad
const punteroLocalidad =34

Ahora ya puede usarse funciones similares a las usadas hasta aquí para actualizar solo el registro de localidad (población provincia,etc...)  al puntero del registro del año, habrá que sumarle entonces siempre el desplazamiento relativo hasta localidad que hemos acordado que es 34 (usando ANSI).
«Ma non troppo»
----> ModoVacaciones = False<----