Guardar Archivos
Hola TodoExpertos, estoy realizando una aplicación en VBasic6.0, mi pregunta es como se crea y guarda archivos dentro de la aplicación, ya aprendí a guardar un msflexgrid(archivo de tipo aleatorio), pero necesito guardar varios de diferentes tamaños.
Ayuda.
Ayuda.
Respuesta de juancg
1
1
juancg, Lenguajes: ASP HTML/DHTML JavaScript Visual Basic C++ Java (no...
Me gustaría que precisaras un poco más que tipo de información quieres guardar para poder ayudarte con más detalle.
Sin embargo, a titulo general, si usaste un archivo aleatorio para guardar la información de un msflexgrid, imagino que ya conoces la mecánica de FreeFile, Open, Close, Print#, Input#, Put, Get y Seek (en caso contrario, dímelo y te lo detallo).
Otro modo de abrir y manipular archivos es a través de un TextStream, que es parte del objeto FileSystemObject de la librería MS Scripting Runtime, que puedes encontrar en Proyecto->Referencias.
El sistema es muy sencillo:
dim FSO as new Scripting.FileSystemObject
dim TS as Scripting.TextStream
set TS=FSO.CreateTextStream (FileName as Striung,OverWrite as Boolean)
TS.Write String ' Escribe caracteres
TS.WriteLine String ' Escribe caracteres, y añade un vbCrLf al final
TS.WriteBlankLines ' Añade una línea en blanco
String=TS.Read ' Lee caracteres
String=TS.ReadLine ' Lee una línea
String=TS.ReadAll ' Lee el archivo entero
TS.AtEndOfStream ' True=EOF
En la MSDN puedes encontrar toda la información adicional de este objeto, que es realmente útil, incluso para tipos de archivo que no sean de texto.
Sin embargo, a titulo general, si usaste un archivo aleatorio para guardar la información de un msflexgrid, imagino que ya conoces la mecánica de FreeFile, Open, Close, Print#, Input#, Put, Get y Seek (en caso contrario, dímelo y te lo detallo).
Otro modo de abrir y manipular archivos es a través de un TextStream, que es parte del objeto FileSystemObject de la librería MS Scripting Runtime, que puedes encontrar en Proyecto->Referencias.
El sistema es muy sencillo:
dim FSO as new Scripting.FileSystemObject
dim TS as Scripting.TextStream
set TS=FSO.CreateTextStream (FileName as Striung,OverWrite as Boolean)
TS.Write String ' Escribe caracteres
TS.WriteLine String ' Escribe caracteres, y añade un vbCrLf al final
TS.WriteBlankLines ' Añade una línea en blanco
String=TS.Read ' Lee caracteres
String=TS.ReadLine ' Lee una línea
String=TS.ReadAll ' Lee el archivo entero
TS.AtEndOfStream ' True=EOF
En la MSDN puedes encontrar toda la información adicional de este objeto, que es realmente útil, incluso para tipos de archivo que no sean de texto.
Es decir tengo 3 planillas (podrían ser guardadas como matrices) ademas de algunos vectores. Manejo + o - la mecánica que mencionas, desearía más detalle al respecto. Lo que deseo es poder guardar 3 o 4 matrices de diferentes tamaños, a demás de textos.
Por lo que aprendí se guardar un arreglo (matriz) pero, no se como guardar varias (en un mismo archivo)
Por lo que aprendí se guardar un arreglo (matriz) pero, no se como guardar varias (en un mismo archivo)
Guardar matrices en archivos no tiene ningún problema, el problema es recuperarlas. Si usas matrices de longitud variable, VB guarda descriptores sobre la longitud de cada una de las dimensiones en el archivo, por lo que al recuperarlas se redimensiona al tamaño adecuado la matriz que usas para cargar (que también tiene que ser de longitud variable). Pero si usas matrices de longitud fija, no guarda ningún descriptor, por lo que la matriz que tienes que usar para recuperar los datos ha de ser idéntica a la que usaste para guardarlos.
De modo genérico, usando el modo de trabajo con archivos clásico de VB, yo suelo preferir añadir un encabezado propio a los archivos, que me de la información que necesito sobre lo que me voy a encontrar dentro.
Imaginemos que quiero guardar tres matrices de enteros con las siguientes dimensiones:
A(3,3)
B(10)
C(5,12)
Entonces escribiría, al principio del archivo, los siguientes valores:
2,3,3,18
1,10,20
2,5,12,120
Esto es, para cada matriz: nº de dimensiones, dimension 1, dimension 2,..., dimension n, tamaño en bytes
Así puedo saber, por un lado, la posición en la que empieza cada matriz, con la siguiente fórmula:
P=(Tamaño encabezado)+(Suma tamaños matrices anteriores)
Seek Fich, P
Puedo crear las matrices con los tamaños necesarios para cada valor, porque los he leído en el encabezado, ir al sitio exacto donde comienza la matriz que quiero, y cargarla en otra matriz preparada para eso.
Si quieres algún ejemplo, o más datos, dímelo
De modo genérico, usando el modo de trabajo con archivos clásico de VB, yo suelo preferir añadir un encabezado propio a los archivos, que me de la información que necesito sobre lo que me voy a encontrar dentro.
Imaginemos que quiero guardar tres matrices de enteros con las siguientes dimensiones:
A(3,3)
B(10)
C(5,12)
Entonces escribiría, al principio del archivo, los siguientes valores:
2,3,3,18
1,10,20
2,5,12,120
Esto es, para cada matriz: nº de dimensiones, dimension 1, dimension 2,..., dimension n, tamaño en bytes
Así puedo saber, por un lado, la posición en la que empieza cada matriz, con la siguiente fórmula:
P=(Tamaño encabezado)+(Suma tamaños matrices anteriores)
Seek Fich, P
Puedo crear las matrices con los tamaños necesarios para cada valor, porque los he leído en el encabezado, ir al sitio exacto donde comienza la matriz que quiero, y cargarla en otra matriz preparada para eso.
Si quieres algún ejemplo, o más datos, dímelo
Pero desearía más detalles (Estoy aprendiendo el abc de la programación en VB6.0)
Por ejemplo: Si tengo un formulario con 3 textbox y 2 msflexgrid (Todos de diferentes tamaños, especialmente los msflexgrid asumamos que son 20 * 8 y 50 * 6 ).
¿Cómo debo proceder para poder guardar el contenido de los mismos? (¿En qué tipo de archivos es más conveniente? ¿Aleatorio o binario?)
Desearía enviarte el ejemplo mismo en VB pero no se como enviar un archivo de Vb6.0.
Saludos.
P.D. Si esposible desearia un manual detallado respecto al manejo de archivos (aleatorios y secuenciales, especialmetne ejemplos)
Por ejemplo: Si tengo un formulario con 3 textbox y 2 msflexgrid (Todos de diferentes tamaños, especialmente los msflexgrid asumamos que son 20 * 8 y 50 * 6 ).
¿Cómo debo proceder para poder guardar el contenido de los mismos? (¿En qué tipo de archivos es más conveniente? ¿Aleatorio o binario?)
Desearía enviarte el ejemplo mismo en VB pero no se como enviar un archivo de Vb6.0.
Saludos.
P.D. Si esposible desearia un manual detallado respecto al manejo de archivos (aleatorios y secuenciales, especialmetne ejemplos)
Los TextBox es más natural guardarlos en ficheros de tipo texto, guardando con Print# y leyendo con Input#
Si quieres guardar todo en un mismo archivo, será mejor que uses Put y Get.
En cuanto al tipo de acceso más conveniente, depende del tipo de datos que guardes. En general, para datos homogéneos (todos de la misma longitud y tipo) deberás usar aleatorios, y para datos heterogéneos (como es el caso actual), binarios.
Si quieres guardar los tres textbox y los dos flexgrid en un mismo archivo, y tienes la seguridad de que los flexgrid van a tener siempre el mismo número de columnas (las filas no importan tanto), el código para escribir en el archivo podría ser este:
dim s as string
dim x as integer, y as integer
Open "archivo" For Binary Access Write As #1
s=Chr(0)
' Como en los archivos binarios, VB no
' añade ningún descriptor que
' me indique la longitud del
' string, voy a separarlos con
' el caracter 0, al estilo C
put #1,,textbox1.text
put #1,,s
put #1,,textbox2.text
put #1,,s
put #1,,textbox3.text
put #1,,s
' Voy a suponer que las columnas son
' fijas, pero las filas variables
' por lo que añado un descriptor
' que me indica el nº de filas
put #1,,MSFlex1.Rows
for y=1 to MSFlex1.Rows
for x=1 to MSFlex1.Cols
put #1,,MSFlex1.TextMatrix(y,x)
put #1,,s
next
next
put #1,,MSFlex2.Rows
for y=1 to MSFlex2.Rows
for x=1 to MSFlex2.Cols
put #1,,MSFlex2.TextMatrix(y,x)
put #1,,s
next
next
Close #1
Puede que tengas que usar una variable intermedia para guardar los miembros de los controles, sobre todo si alguno es de solo lectura (creo que no es este el caso, pero puede que alguna vez te pase).
Para leer el archivo es algo diferente:
dim s as string*1
dim txb(3) as TextBox
dim msf(2) as MSFlexGrid
dim x as integer, y as integer
dim idx as integer
Open "archivo" For Binary Access Read As #1
' Esto lo hago por comodidad
set txb(1)=TextBox1
set txb(2)=TextBox2
set txb(3)=TextBox3
set msf(1)=MSFlex1
set msf(2)=MSFlex2
y=1
for x=1 to 3
' Leo un caracter
get #1,,s
' ¿Acabó el string?
if asc(s)=0 then
'Cambio de textbox
if y<3 then y=y+1 else exit for
else
txb(y).TExt=txb(y).TExt & s
end if
next
for idx=1 to 2
' Leo el nº de filas
get #1,,y
msf(idx).Rows=y
' Las columnas ya sé que son 8 ó 6
msf(idx).Cols=iif(idx=1,8,6)
for y=1 to msf(idx).Rows
for x=1 to msf(idx).Cols
s=" "
do while not asc(s)=0
get #1,,s
msf(idx).TextMatrix(y,x)=msf(idx).TextMatrix(y,x) & s
loop
next
next
Close #1
for x=1 to 3
set txb(x)=nothing
next
for y=1 to 2
set msf(x)=nothing
next
Respecto al manual que me dices, no conozco ninguno que trate específicamente los archivos. Supongo que cualquier manual un poco detallado te valdrá. Si quieres que te recomiende alguno, aunque sea de VB en general, dímelo.
Si quieres guardar todo en un mismo archivo, será mejor que uses Put y Get.
En cuanto al tipo de acceso más conveniente, depende del tipo de datos que guardes. En general, para datos homogéneos (todos de la misma longitud y tipo) deberás usar aleatorios, y para datos heterogéneos (como es el caso actual), binarios.
Si quieres guardar los tres textbox y los dos flexgrid en un mismo archivo, y tienes la seguridad de que los flexgrid van a tener siempre el mismo número de columnas (las filas no importan tanto), el código para escribir en el archivo podría ser este:
dim s as string
dim x as integer, y as integer
Open "archivo" For Binary Access Write As #1
s=Chr(0)
' Como en los archivos binarios, VB no
' añade ningún descriptor que
' me indique la longitud del
' string, voy a separarlos con
' el caracter 0, al estilo C
put #1,,textbox1.text
put #1,,s
put #1,,textbox2.text
put #1,,s
put #1,,textbox3.text
put #1,,s
' Voy a suponer que las columnas son
' fijas, pero las filas variables
' por lo que añado un descriptor
' que me indica el nº de filas
put #1,,MSFlex1.Rows
for y=1 to MSFlex1.Rows
for x=1 to MSFlex1.Cols
put #1,,MSFlex1.TextMatrix(y,x)
put #1,,s
next
next
put #1,,MSFlex2.Rows
for y=1 to MSFlex2.Rows
for x=1 to MSFlex2.Cols
put #1,,MSFlex2.TextMatrix(y,x)
put #1,,s
next
next
Close #1
Puede que tengas que usar una variable intermedia para guardar los miembros de los controles, sobre todo si alguno es de solo lectura (creo que no es este el caso, pero puede que alguna vez te pase).
Para leer el archivo es algo diferente:
dim s as string*1
dim txb(3) as TextBox
dim msf(2) as MSFlexGrid
dim x as integer, y as integer
dim idx as integer
Open "archivo" For Binary Access Read As #1
' Esto lo hago por comodidad
set txb(1)=TextBox1
set txb(2)=TextBox2
set txb(3)=TextBox3
set msf(1)=MSFlex1
set msf(2)=MSFlex2
y=1
for x=1 to 3
' Leo un caracter
get #1,,s
' ¿Acabó el string?
if asc(s)=0 then
'Cambio de textbox
if y<3 then y=y+1 else exit for
else
txb(y).TExt=txb(y).TExt & s
end if
next
for idx=1 to 2
' Leo el nº de filas
get #1,,y
msf(idx).Rows=y
' Las columnas ya sé que son 8 ó 6
msf(idx).Cols=iif(idx=1,8,6)
for y=1 to msf(idx).Rows
for x=1 to msf(idx).Cols
s=" "
do while not asc(s)=0
get #1,,s
msf(idx).TextMatrix(y,x)=msf(idx).TextMatrix(y,x) & s
loop
next
next
Close #1
for x=1 to 3
set txb(x)=nothing
next
for y=1 to 2
set msf(x)=nothing
next
Respecto al manual que me dices, no conozco ninguno que trate específicamente los archivos. Supongo que cualquier manual un poco detallado te valdrá. Si quieres que te recomiende alguno, aunque sea de VB en general, dímelo.
- Compartir respuesta
- Anónimo
ahora mismo