archivos de datos vb

53
>> Contenido 1 - introducción 2 - Sentencia Open 3 - Archivos secuenciales 4 - Diferentes tipos de acceso ( Append - Input Output ) 5 - Leer datos de un archivo utilizando Line Input 6 - Ejemplo para leer un archivo de texto con Line Input 7 - Leer el contenido de un archivo de texto con la función Input 8 - Escribir datos en archivos de texto ( Print y Write ) 9 - Archivos de acceso aleatorios o directos 10 - Grabar datos en archivos de acceso aleatorio ( Instrucción Put ) 11 - Leer datos en archivos aleatorios ( instrucción Get ) 12 - Posicionarse en un registro ( Seek ) 13 - Funciones propias de vb para el manejo de ficheros y directorios 14 - Función Dir para buscar archivos y carpetas 15 - Función FileCopy para copiar 16 - Función MkDir para crear directorios 17 - Función kill para eliminar 18 - Función FileLen 19 - Función Name 20 - Función GetAttr y SetAttr para atributos 21 - Función RmDir para renombrar 1 -introducción En esta sección se ve un repaso básico de las tres formas

Upload: iarce20065513

Post on 15-Dec-2014

72 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Archivos de Datos Vb

>> Contenido 1 - introducción 2 - Sentencia Open 3 - Archivos secuenciales 4 - Diferentes tipos de acceso ( Append - Input Output ) 5 - Leer datos de un archivo utilizando Line Input 6 - Ejemplo para leer un archivo de texto con Line Input 7 - Leer el contenido de un archivo de texto con la función Input 8 - Escribir datos en archivos de texto ( Print y Write ) 9 - Archivos de acceso aleatorios o directos 10 - Grabar datos en archivos de acceso aleatorio ( Instrucción Put ) 11 - Leer datos en archivos aleatorios ( instrucción Get ) 12 - Posicionarse en un registro ( Seek ) 13 - Funciones propias de vb para el manejo de ficheros y directorios 14 - Función Dir para buscar archivos y carpetas 15 - Función FileCopy para copiar 16 - Función MkDir para crear directorios 17 - Función kill para eliminar 18 - Función FileLen 19 - Función Name 20 - Función GetAttr y SetAttr para atributos 21 - Función RmDir para renombrar

 

 

 

1 -introducción

En esta sección se ve un repaso básico de las tres formas de trabajar con diferentes tipos de archivos en visual basic: Archivos secuenciales, archivos aleatorios y archivos binarios.

Por último en el final de la sección, se describe como utilizar sentencias y funciones propias de visual basic para trabajar con archivos y directorios del sistema operativo, como por ejemplo la sentencia Dir para buscar ficheros, Filecopy para copiar , ChDir, Mkdir para crear carpetas y algunas otras funciones relacionadas.

 

Page 2: Archivos de Datos Vb

2 - Sentencia Open

Esta sentencia es la encargada de abrir o crear un archivo, ya sea para leer datos del mismo, sobre escribirlos y/o para agregarle datos.

Esta sentencia tiene una serie de parámetros que varían de acuerdo a lo que queramos hacer.

Por ejemplo :

 

Open "c:\prueba.txt" For Input As #1

 

Este ejemplo abre un archivo para poder acceder a los datos que contenga en su interior. cuando decimos abrir, estamos diciendo que se encuentra actualmente abierto y alojado en la memoria ram para poder manipularlo.

En el primer parámetro indicamos el path del archivo en el que queremos trabajar.

Luego la palabra "As #1" indica el número de archivo que estamos utilizando. Este número lo asignamos nosotros y va desde el rango 1 al 511. El "número de archivo" se utiliza para poder diferenciar al archivo en el código. Cada archivo que se encuentra abierto no se puede asignar un número de archivo igual, ya que nos daría un error en tiempo de ejecución.

Por ejemplo no podríamos hacer esto:

 

Open "archivo1.txt" For Input As #1Open "otroarchivo1.txt" For Input As #1

 

Una vez que terminamos de trabajar con un archivo que se encuentra abierto y que no lo vamos a utilizar mas, debemos cerrarlo. para ello se utiliza la sentencia Close seguido del número de archivo que lo identifica.

Por ejemplo:

Close #2

 

Page 3: Archivos de Datos Vb

Esto cerrará al archivo abierto que anteriormente le asignamos el número de archivo 2. También si tengo 3 archivos abiertos podría hacer lo siguiente:

Close #1, #2, #3

 

Si utilizamos la sentencia Close sin ningún parámetro, o mejor dicho ningún número de archivo, se cerrarán todos los archivos cargados en memoria por nuestra aplicación (los que nosotros abrimos con Open).

Por lo general, si trabajamos con varios archivos abiertos simultáneamente, es aconsejable utilizar la sentencia Close sin ningún parámetro, de este modo cuando termine de ejecutarse el procedimiento se cerrarán todos los archivos abiertos.

Hay una función en Visual basic llamada FreeFile. Esta función lo que hace es darnos un número de archivo que esté libre y que se pueda usar, para que de este modo no intentamos abrir uno esté siendo utilizado, y evitar un error en tiempo de ejecución. Para usar la función es muy fácil, por ejemplo:

Dim NumeroArchivo As Integer

NumeroArchivo = FreeFile

Open "La ruta de un archivo" For Input As #NumeroArchivo

 

3 - Archivos secuenciales

Los archivos secuenciales se denominan de esta manera por que la forma de escribir y leer los datos en un archivo es, desde el principio hasta el fin del archivo, es decir, si yo quisiera acceder a un determinado dato del archivo y este dato se encuentra en la mitad del archivo, para llegar a ese dato necesito pasar por todos los demás datos, de forma secuencial.

Por lo general se suelen utilizar los archivos secuenciales, para trabajar con archivos que contengan una estructura de datos no muy compleja. por que por ejemplo, si utilizáramos un archivo para almacenar 50000 nombres con sus respectivos datos (apellido, teléfono, dirección etc...) , este mecanismo resultaría ineficiente, ya que si quisiera recuperar por ejemplo el registro n° 3650, para leer este dato tendría que pasar previamente por los 3649 registros anteriores a este, haciendo mas lento el acceso y por lo tanto desperdiciando recursos del sistema.

 

4 - Diferentes tipos de acceso

Page 4: Archivos de Datos Vb

Append: esta sentencia se utiliza para agregar información a un archivo de texto.

Ejemplo :

Open "c:\miarchivo.txt" For Append As #1

 

Si el archivo ya contiene datos, se le agregarán al mismo al final del archivo, si no contenía datos los agrega igual. Si el archivo no existe, lo crea y le agrega los datos.

Input: la sentencia Input se utiliza para leer datos de un archivo de texto, ejemplo:

Open "c:\miarchivo.txt" For Input As #2

 

Este ejemplo abre un archivo para leer los datos del mismo. En las próximas líneas veremos ejemplos de como leer los datos , escribir y guardar.

Una cosa importante con respecto a leer datos de un archivo con Input es que, si el archivo que queremos abrir, no existe, se producirá un error en tiempo de ejecución al intentar abrir un archivo que no existe, por eso debemos verificar la ruta del mismo siempre que esté bien escrita en la sentencia Open y evitarnos dolores de cabeza, y simpre añadir algún manejador de error para este caso

Output: esta sentencia se utiliaza para crear un archivo de texto y grabar datos. Esta es igual que Append salvo por un gran detalle:

Output crea el archivo y le agrega información, pero si el archivo existía y contenía información previa, sobre escribe todos los datos del archivo por los datos nuevos, perdiendo los anteriores datos.

Si accedemos con Output a un archivo que no existe, no se produce un error, si no que se crea dicho archivo.

Conclusión : si vamos a añadir datos a un archivo existente (para actualizarlo por ejemplo) hay que utilizar la sentencia Append. si vamos a crear un archivo vacío y nuevo para grabar nuevos datos, hay que utilizar la sentencia Output. si vamos a abrir un archivo para leer datos utilizamos la sentencia Input.

 

5 - Leer datos de un archivo utilizando Line Input

C omo se comentó antes , para leer datos de un archivo se utiliza la sentencia Input.pero para leer los datos del archivo y poder utilizarlos en nuestro programa se utilizan 2 sentencias o instrucciones: Line Input e Input.

Page 5: Archivos de Datos Vb

Ejemplo:

 

Dim mivariable As String

Open "c:\nombres.txt" For Input As #1

While Not EOF(1)

Line Input #1, mivariable

Wend

Close #1

 

En el ejemplo anterior aparece una función nueva llamada EOF. Esta función significa End Of File o fin de archivo.

Cuando abrimos un archivo para leer información con Input, debemos saber en que momento llegamos al final del archivo, por que de lo contrario la sentencia Line Input o Input seguiría leyendo líneas donde no existen datos después del fin del archivo, y por lo tanto se produciría un error en tiempo de ejecución por querer leer un dato que no existe.

Mediante la condición Not Eof(1) leeremos los datos hasta que llegue al final del archivo, y en cada pasada del bucle While se almacenará en la variable mivariable, línea por línea los datos del mismo. Es evidente que como está planteado el ejemplo habría que manipular los datos leídos y agregar otras instrucciones, por que en este ejemplo la variable mivariable solo almacenaría los datos de la línea que está leyendo y borrando los datos de las líneas que almacenó anteriormente. Mas adelante veremos como solucionar esto.

conclusión : para leer datos de un archivo se utiliza la sentencia Line Input y luego de la coma debemos poner una variable nuestra para almacenar los datos que se van leyendo de la línea actual

Line Input #1, nuestravariable

 

6 - Ejemplo para leer un archivo de texto utilizando Line Input

 

Page 6: Archivos de Datos Vb

Lo siguiente, lee un archivo de texto línea por línea, y carga el contenido en un control ListBox. colocar un control List1, un Command1 y un Text1 para indicar el path del archivo a leer:

 

 

Option Explicit

Private Sub Command1_Click()On Error GoTo errSub

Dim n_File As IntegerDim Linea As String 'Elimina el contenido del listbox List1.Clear 'Número de archivo libre n_File = FreeFile 'Abre el archivo para leer los datos Open text1.Text For Input As n_File 'Recorre linea a linea el mismo y añade las lineas al control List Do While Not EOF(n_File) 'Lee la linea Line Input #n_File, Linea List1.AddItem Linea Loop Exit SuberrSub:'errorMsgBox "Número de error: " & Err.Number & vbNewLine & _ "Descripción del error: " & Err.Description, vbCriticalEnd Sub

Private Sub Form_Load()

Page 7: Archivos de Datos Vb

Command1.Caption = " Cargar en Listbox "

End Sub

 

 

Este otro ejemplo, lo que hace es leer un archivo de texto para contar las líneas del mismo

Colocar un command1 en el formulario y pegar el siguiente código fuente

  Public Function Contar_Lineas(ByVal strTextFile As String) As Long

Dim F As Integer Dim Lineas As Long Dim str_Linea As String

' Número de archivo libre F = FreeFile

' Abre el archivo de texto Open strTextFile For Input As #F

'Recorre todo el archivo de texto _ linea por linea hasta el final Do 'Lee una línea Line Input #F, str_Linea ' Incrementa la cantidad de lineas leidas Lineas = Lineas + 1 ' Leerá hasta que llegue al fin de archivo Loop While Not EOF(F)

' Cierra el archivo de texto abierto Close #F

' Retorna a la función el número de lineas del fichero Contar_Lineas = Lineas

End Function

Private Sub Command1_Click()

Dim Path As String Path = InputBox(" Ingrese la ruta de un archivo de texto ", _ " Contar líneas ") If Path = vbNullString Then Exit Sub

MsgBox " Cantidad de lineas: " & Contar_Lineas(Path)

Page 8: Archivos de Datos Vb

End Sub

 

 

 

7 - Leer el contenido de un archivo de texto con la función Input

La función input, a diferencia de Line Input que Lee por línea, Input lee todo el contenido del archivo de una sola ves, es decir no necesitamos, como en el ejemplo anterior, utilizar un bucle.

El modo de usarlo es el siguiente:

Primero se abre el archivo con Open, por ejemplo:

Open Path_Archivo For Input As #1

 

Luego se asigna a una variable, el contenido que devolverá la función Input:

Contenido = Input(LOF(1), #1)

Un ejemplo:

Lo siguiente lee el contenido de un archivo txt y lo carga en un textBox multilínea

Colocar un TextBox llamado txt_Path ( para especificar la ruta del archivo ).

El Textbox que mostrará los datos del fichero, colocarle el nombre txt_Contenido

Código en un botón:

On Error GoTo Err_Sub

Dim n_File As IntegerDim Contenido As String

'Número de archivo libre n_File = FreeFile 'Abre el archivo indicado Open txt_Path For Input As n_File 'Lee todo los datos del archivo y lo almacena en la variable Contenido = Input$(LOF(n_File), #n_File)

Page 9: Archivos de Datos Vb

'Cierra el archivo abierto Close n_File 'Carga el contenido de la variable en el TextBox txt_Contenido = Contenido Exit Sub

Err_Sub: MsgBox Err.Description, vbCritical 

 

 

8 - Escribir datos en archivos de texto

Para escribir datos en archivos de texto se utiliza la sentencia Print y Write.

Ejemplo:

 

Dim nombre As String

Dim edad As Integer

Dim telefono As String

Open "c:\miarchivo.txt" For Append As #1

Print #1, "esta es una línea"

Print #1, "esta es otra línea"

Print #1, nombre, edad, telefono

Close #1

 

 

En este ejemplo agregamos datos a un archivo existente llamado miArchivo.txt con la sentencia Print.

Primero abrimos el archivo con Open. luego la sentencia Print lleva 2 parámetros. el primero indica el archivo que estamos manipulando (el archivo n°1, dentro del código), el segundo parámetro indica los datos que se agregarán en el mismo. En el segundo

Page 10: Archivos de Datos Vb

parámetro podemos poner un dato directamente (una cadena, número, etc...),, por último cerramos el archivo.

 

Escribir datos con la sentencia Write

A diferencia de Print, la sentencia Write escribe datos en un archivo separados por comas.

Ejemplo:

 

Dim nombre As StringDim apellido As String

apellido = "Peres"

nombre = "Carlos"

Open App.Path & "\Archivo.txt" For Output As #1

Write #1, nombre, apellido

Close #1

 

 

Como podemos ver la sentencia Write escribe los datos en el archivo separados por coma. En la primera línea escribirá el contenido de las variables nombre y apellido . También se pueden pasar los datos directamente a Write sin usar variables, por ejemplo:

 

Write #1, "Un dato", "Otro dato", "Otro mas"

 

Nota importante: cuando escribimos datos con la sentencia Print se utiliza la sentencia Line Input para leer los datos del archivo. En cambio cuando escribimos datos separados por comas con la sentencia Write debemos utilizar la sencia Input

Para que esta página no sea tan extensa, he armado 10 ejercicios que utilizan todo lo visto hasta aquí, o sea el tema relacionado a los archivos secuenciales. Dentro del código se encuentra detallado cada paso y lo podés descargar al final de esta página.

 

Page 11: Archivos de Datos Vb

9 - Archivos aleatorios o directos

A diferencia de los archivos secuenciales, los archivos aleatorios almacenan datos en forma de registros. Como habíamos dicho en el capítulo anterior para leer datos de un archivo secuencial había que leer todo el archivo, es decir que no podíamos leer por ejemplo los datos que estuviesen en la línea 35 del mismo sin antes pasar por todos los datos anteriores, por eso su nombre de archivo secuencial.

En cambio los archivos aleatorios, también llamados archivos directos, almacenan los datos con una estructura diferente. Los datos se guardan en registros mediante una estructura definida de tipo Type (estructura definida por nosotros) también llamada UDT

Por ejemplo si tuviesemos 25 registros, cada uno con datos (apellido, email, telefono,etc..), y quisiera acceder al registro 17, puedo leer los datos del registro 17 sin tener que leer los 16 registros anteriores, ganando con ello mas velocidad y teniendo una estructura de datos definida.

Para abrir un archivo aleatorio para trabajar con él, se utiliza la sentencia Open con algunos cambios en lo que se refiere a los archivos secuenciales

Ejemplo:

open "elarchivo.dat" for random as #1 len = len(mivariable)

 

Como podemos ver para abrir un archivo de acceso aleatorio se utiliza la palabra Random (aleatorio). Luego debemos indicar el número de archivo para identificarlo, y por último una opción nueva : Len.

cada registro en el archivo, que es una estructura de datos Type, tiene que tener una longitud fija. Mediante la función Len de visual Basic debemos indicar el tamaño de la estructura de datos que vamos a utilizar. para que quede mas claro un ejemplo:

Primero definimos una estructura de datos:

 

Private Type t_clientes

nombre As String * 20apellido As String * 15dirección As String * 30edad As Integer

End Type

Page 12: Archivos de Datos Vb

 

Después creamos una variable llamada clientes de tipo t_clientes

Dim clientes As t_clientes

 

ahora abrimos nuestro archivo, y en el parámetro de la función Len le pasamos la variable para que visual basic calcule el tamaño de la estructura t_clientes

 

Open "datos.dat" For Random As #1 Len = Len(clientes)

 

La estructura de datos debe tener un tamaño fijo, no datos variables como en el caso de los archivos secuenciales, de ahí que se indicara en el Type en las variables mediante el asterisco en el caso de los String.

En cada campo de la estructura de datos debemos indicar el tamaño de la variable. En el caso del campo nombre de tipo string le hemos asignado una longitud fija de 20 bytes, en el apellido 15 y en la dirección 30 bytes. La variable o el campo edad que es de tipo integer, no debemos indicar el tamaño de la variable, ya que sabemos que un número integer ocupa 2 bytes.

En total esta estructura t_clientes tiene una longitud de 67 bytes (30 + 20 + 15 + 2 ).

Si no indicáramos en la sentencia Open el tamaño de la estructura, visual basic, por defecto asumiría la estructura de un tamaño de 128 bytes, y si nuestra estructura tendría mayor tamaño ocurriría un error en tiempo de ejecución, por lo cual siempre debemos utilizar la función len para calcular el tamaño de la misma.

 

10 - Grabar datos en archivos aleatorios

Para grabar datos en un archivo de acceso aleatorio se utiliza la sentencia Put.

Un ejemplo paso a paso:

primero declaramos una estructura de datos que contendrá la información de cada registro:

Private Type t_empleadosnombre As String * 15apellido As String * 15dirección As String * 30

Page 13: Archivos de Datos Vb

edad As IntegerEnd Type

 

Luego creamos una variable que sea de tipo t_empleados.

Dim empleados As t_empleados

Ahora abrimos el archivo e indicamos en la función Len el tamaño de la estructura

Open "datos.dat" For Random As #1 Len = Len(clientes)

 

Ahora le asignamos un valor a cada campo de la estructura de esta forma:

empleados.nombre = "Carlos"empleados.apellido = "Martinez"empleados.dirección = "Avenida 9 de julio n° 2054"empleados.edad = 45

 

Ahora grabamos en el registro n°1 del archivo los datos de esta forma:

Put #1, 1, empleados

 

Si queremos grabar mas datos, por ejemplo en el registro n° 2 del archivo hacemos lo siguiente:

empleados.nombre = "María"empleados.apellido = "Gonzales"empleados.dirección = "Avenida 13 n° 1100"empleados.edad = 35

Put #1, 2, empleados

Close #1

 

como vemos ver la sentencia Put lleva 3 parámetros. El primero indica el numero de archivo abierto en el cual estamos trabajando. en el segundo debemos indicar el número de registro en el que se grabarán los datos. Si no ponemos el número de registro, los datos se grabarán en el último registro. Por último en el tercer parámetro le pasamos la variable asociada con la estructura de datos.

Page 14: Archivos de Datos Vb

 

11 - Leer datos en archivos aleatorios

Para leer los registros o datos de un archivo aleatorio se utiliza la sentencia Get. Esta sentencia es exactamente igual que Put, pero la diferencia es que en vez de grabar los datos los recupera para poder utilizarlos luego en el programa.

 

12 - Posicionarse en un registro determinado

Supongamos que tenemos un archivo aleatorio que contiene 452 registros. Ahora queremos recuperar los datos del registro 258. Para posicionarse en un determinado registro hay una sentencia , hay una sentencia llamada Seek. Ejemplo:

Seek #1, 258Get #1, , mivariable

 

si queremos posicionarnos en un registro determinado, pero en vez de leer, queremos grabar datos, hacemos la misma operación pero con la sentencia Put:

Seek #1, 258Put #1, , mivariable

 

Nota: Desde este enlace podés ver un simple código fuente de una Agenda de contactos utilizando Archivos Directos - Aleatorios

 

13 - Funciones propias de vb para el manejo de ficheros y directorios

Visual basic posee varias funciones para manejar archivos y directorios de nuestro sistema. Las principales son.

 

14 - Función Dir

Page 15: Archivos de Datos Vb

La función Dir se utiliza o para buscar archivos y devuelve una cadena que representa el nombre de un archivo o directorio de acuerdo a un determinado patrón de búsqueda. La sintaxis de la función es:

Dir (ruta, atributos)

 

En el parámetro ruta debemos indicar el path de un archivo, directorio o unidad. Si el path no existe, la función Dir devuelve una cadena vacía.

En el parámetro atributos podemos especificar los siguientes:

vbnormal : cualquier atributo de archivo. vbreadonly : archivos de solo lectura. vbhidden: archivos ocultos vbsystem : archivos de sistema vbvolume : etiqueta de volumen de una unidad vbdirectory : directorios

Ejemplo:

Si el archivo existe Dir devuelve "autoexec.bat"

Archivoabuscar = Dir("c:\autoexec.bat")

 

También podemos utilizar los comodines * y ? para filtrar búsquedas.

En este ejemplo devuelve el primer archivo exe que encuentra, si es que existe.

Archivoabuscar = Dir("c:\windows\*.exe")

 

En este ejemplo la función Dir devuelve directorios además de archivos

Archivoabuscar = Dir("c:\, vbdirectory")

 

El único inconveniente de esta función es que siempre devuelve el primer archivo que encuentra. Para que continúe buscando los demás archivos debemos poner la función sin parámetros. Ejemplo

Dim archivo As String

archivo = Dir("c:\*.exe")

Page 16: Archivos de Datos Vb

While archivo <> ""archivo = DirWend

 

En el ejemplo anterior buscará todos los archivos exe en el directorio c:\. cuando ya no encuentre mas devolverá una cadena vacía y saldrá del bucle While.

 

Este otro ejemplo verifica si un archivo existe:

 

Private Function Verificar_Existe(path) As Boolean If Len(Trim$(Dir$(path))) Then Verificar_Existe = True Else Verificar_Existe = False End If MsgBox Verificar_Existe End Function

Private Sub Form_Load()

Call Verificar_Existe("c:\autoexec.bat")

End Sub 

 

El siguiente enlace muestra un ejemplo de como utilizar la función Dir para buscar archivos y también ordenarlos enforma alfabética y luego agregar la lista en un control Listbox

Este otro enlace muestra como buscar ficheros mediante el Api de windows

 

15 - Función FileCopy

FileCopy nos permite copiar archivos. Esta función es muy fácil de usar. ejemplo:

FileCopy "origen", "destino"

Nota: si el archivo existe la función lo sobre escribe.

Page 17: Archivos de Datos Vb

 

16 - Función MkDir

Esta función se utiliza para crear directorios, pero crea un directorio por vez, es decir que no crea varios niveles al mismo tiempo. La sintaxis es:

MkDir "Ruta directorio"

para poder crear un Directorio que contiene varios subdirectorios, podemos hacer lo siguiente:

El ejemplo despliega un InputBox para ingresar el path a crear:

 

 Private Sub Command1_Click()

Dim i As IntegerDim Array_Dir As VariantDim Sub_Dir As StringDim El_Path As String

El_Path = InputBox("Escriba la ruta del directorio a crear" & _ "con los subdirectorios", " Crear varios niveles de directorios") If El_Path = vbNullString Then Exit Sub 'Desglosa el path Array_Dir = Split(El_Path, "\") El_Path = vbNullString 'Recorre el array anterior para ir creando uno por uno For i = LBound(Array_Dir) To UBound(Array_Dir) Sub_Dir = Array_Dir(i)

If Len(Sub_Dir) > 0 Then El_Path = El_Path & Sub_Dir & "\"

If Right$(Sub_Dir, 1) <> ":" Then ' Verificamos que no exista

Page 18: Archivos de Datos Vb

If Dir$(El_Path, vbDirectory) = vbNullString Then 'Crea la carpeta Call MkDir(El_Path) End If End If End If Next i

End Sub

 

17 - Función kill

La función kill se utiliza para eliminar archivos. También es muy fácil de utilizar, y el único parámetro que lleva es la ruta del archivo que queremos eliminar. Si queremos eliminar varios archivos de un directorio podemos utilizar el comodín"*", y si queremos excluir ciertos archivos utilizamos el comodín "?".

kill "c:\*.txt"

18 - Función FileLen

E sta función nos devuelve el tamaño en bytes de un archivo.

Ejemplo:

Dim tamaño As Long

tamaño = FileLen("c:\windows\system32\control.exe")

MsgBox tamaño & " bytes"

 

FileLen es muy útil para trabajar con archivos aleatorios, ya que si queremos conocer la cantidad de registros que tiene el archivo, debemos dividir el tamaño del archivo por el tamaño de la estructura.

Ejemplo:

Private Type t_personas

nombre As String * 20apellido As String * 20

End Type

Page 19: Archivos de Datos Vb

Dim cant_reg As Long

Private Sub Form_Load()

cant_reg = FileLen("c:\miarchivo.dat") / Len(t_personas)

End Sub

 

 

 

19 - Función Name

Name se utiliza para renombrar archivos y directorios. Esta función no se puede utilizar para renombrar archivos abiertos.

Ejemplo:

Name "path del archivo viejo a renombrar" as "path y nombre nuevo del archivo"

También con esta sentencia podemos mover archivos y directorios a otra ubicación. para ello debemos cambiar en el segundo parámetro la ruta del archivo.

 

20 - Función GetAttr y SetAttr

La función Getattr permite recuperar información sobre los atributos de un archivo o directorio. Ejemplo:

 

GetAttr "ruta del archivo"

 

los valores devueltos por la función pueden ser los siguientes:

0 - normal 1 - solo lectura 2 - oculto 4 - archivo de sistema 16 - directorio

Page 20: Archivos de Datos Vb

32 - archivo modificado

 

El siguiente ejemplo lo que hace es mostrar en un MsgBox los atributos de un archivo. Colocar un TextBox llamado Text1 y un Command1.

 

 

Código en el formulario:

Option Explicit

Private Sub Command1_Click()Dim ret As LongDim Atributos As String ret = GetAttr(Text1.Text) If ret And vbNormal Then Atributos = " Normal = Si" & vbNewLine Else Atributos = " Normal = No" & vbNewLine End If If ret And vbReadOnly Then Atributos = Atributos & " Solo Lectura = Si" & vbNewLine Else Atributos = Atributos & " Solo Lectura = No" & vbNewLine End If If ret And vbHidden Then Atributos = Atributos & " Oculto = Si" & vbNewLine Else Atributos = Atributos & " Oculto = No" & vbNewLine End If If ret And vbSystem Then Atributos = Atributos & " Sitema = Si" & vbNewLine Else Atributos = Atributos & " Sitema = No" & vbNewLine End If If ret And vbDirectory Then

Page 21: Archivos de Datos Vb

Atributos = Atributos & " Directorio = Si" & vbNewLine Else Atributos = Atributos & " Directorio = No" & vbNewLine End If 'Muestra los atributos del archivo elegido MsgBox Atributos, vbInformation, " Atributos " End Sub 

 

La función SetAttr lo que hace es establecer los atributos de un archivo .

Ejemplo:

 

SetAttr "ruta del archivo", valores de los atributos

 

21 - Función RmDir

RmDir elimina directorios o carpetas. Pero antes de eliminar directorios tenemos que estar seguros que la carpeta no contiene archivos, de lo contrario nos dará un error en tiempo de ejecución. Si el directorio contiene archivos debemos eliminarlos previamente con la sentencia kill.

Ejemplo:

RmDir "path del directorio a remover"

Servicios

Inicio Visual Basic Chat Guía de recursos Empleo Descargas Tutoriales Buscador de APIs

Foros

General Visual Basic Visual Basic .NET

Page 22: Archivos de Datos Vb

Bases de datos Crystal reports C/C++ C# C Sharp ASP.NET Java PHP ABAP

Manuales .NET

Manual VB.NET ADO.NET Manual C#

Manuales

Metodología Inicio con Visual Basic Manual Visual Basic Acceso a datos DAO Análisis BBDD Bases de datos POO SQL SQL Server

Descargas

Bases de datos Disco Ficheros Gráficos Juegos Multimedia Controles OCX Manuales

Programación

Guia API Trucos VB TCP/IP Sistemas operativos Redes Delphi Data Warehousing C++ Ensamblador

Page 23: Archivos de Datos Vb

Varios

Blog de literatura Juegos online Camisetas online Series de televisión Noticias de juegos

Software

Blog de software Descargar Microsoft Office Descargar Firefox 3 Descargar eMule Descargar Nero Descargar Ares Descargar Windows Live Messenger Descargar Photoshop Descargar CorelDraw Descargar Virtual DJ Descargar NOD32 Antivirus

Manuales : Acceso a datos Manual Visual Basic Introducción II Elementos del lenguaje Elementos del lenguaje II Elementos de interface Aplicaciones MDI Acceso a datos Comunicar aplicaciones Introducción a gráficos

Page 24: Archivos de Datos Vb

7. 1.- TIPOS DE ACCESO A FICHEROS EN VISUAL BASIC.

Los archivos proporcionan una manera de almacenar información a largo plazo. Visual Basic ofrece tres formas de acceder a los datos:

Archivo secuencial. Archivo de texto plano. Se lee una línea cada vez. Cada línea podrá ser tan larga como quiera. Cuando se empieza a leer un archivo secuencial, se empieza por la primera línea y se continúa con la siguiente hasta llegar al final. Este tipo de datos no suele ser el adecuado para almacenar grandes series de números porque se almacenan en forma de cadena de caracteres. Ejemplos: archivos TXT

Archivo aleatorio. Su contenido puede ser leído y escrito en el orden que se necesite. Todas las líneas deben ser del mismo tamaño. Asumiremos que está formado por un conjunto de registros de la misma longitud. Cada registro individual se identifica con un único número y puede ser leído, escrito o actualizado. Ejemplos: archivos que simulen bases de datos.

Archivo binario. Es una colección de bytes o secuencia numerada de caracteres, independientemente de la estructura del mismo. Ofrecen la posibilidad de almacenar los datos como se quiera, aunque para poder acceder a ellos, es necesario conocer cómo fueron escritos. Ejemplos: archivos EXE

7.2.- ARCHIVOS DE ACCESO SECUENCIAL.

ABRIR ARCHIVOS SECUENCIALES

La instrucción Open (abrir) le dice a Visual Basic a qué archivo debe acceder. La sintaxis es:

Open NombreDeArchivo For {Input | Output| Append} As #NúmeroDeArchivo

donde Input indica si se quiere leer del archivo, Output si se quiere escribir de él, Append si se quiere añadir información al final del fichero y, NumeroDeArchivo es un número entre 1 y 255. Si se trata de abrir para lectura un archivo que no existe, se producirá un error. Si se abre para escritura Visual Basic creará un nuevo archivo, reemplazando cualquier archivo con ese nombre. Si no se sabe qué número de archivo está libre, se utilizará el siguiente código:

NumArchivo = FreeFile

Open NomArch For {Input | Output} As #NumArchivo

CERRAR ARCHIVOS SECUENCIALES

Después de trabajar con un archivo, se debe cerrar con la instrucción Close, cuya sintaxis es:

Page 25: Archivos de Datos Vb

Close #NúmeroDeArchivo

Si la intrucción Close se utiliza sin poner NumeroDeArchivo, se cerrarán todos los ficheros abiertos.

LEER DE ARCHIVOS SECUENCIALES

Para leer de un archivo secuencial se utilizará la instrucción Line Input que permite leer una línea cada vez y que tiene la sintaxis:

Line Input #NúmeroDeArchivo, VariableDeCadena

o bien se utilizarán las órdenes:

Input #NúmeroDeArchivo, VariableDeCadena

VariableDeCadena = Input(NúmCaracteres, #NúmeroDeArchivo)

donde la última instrucción, permite leer un número determinado de caracteres y, está limitado a ficheros de 32.767 bytes máximo.

La función EOF (Fin De Fichero) indica cuándo se acaba un archivo. A esta función hay que facilitarle el número de archivo correspondiente y, devolverá True si se ha leído toda la información del archivo. La función LOF (Longitud De Archivo) indica la longitud de un archivo.

Por tanto, para leer de un archivo de acceso secuencial se seguirán los pasos:

1. Abrir el fichero para lectura con: Open NombreDeArchivo For Input As #NúmeroDeArchivo

1. Leer los datos del fichero utilizando las sentencias: Line Input #NúmeroDeArchivo, VariableDeCadena; o bien Input #NúmeroDeArchivo, VariableDeCadena; o bien VariableDeCadena = Input$ NúmCaracteres, #NúmeroDeArchivo

1. Cerrar el archivo con la sentencia: Close #NúmeroDeArchivo

ESCRIBIR EN ARCHIVOS SECUENCIALES

Para escribir en un archivo secuencial, utilizaremos las instrucciones Print o Write con la sintaxis:

Print #NúmeroDeArchivo [, expresión [{ , | ; } expresión] ...] [{ , | ; }]

Write #NúmeroDeArchivo [, expresión [{ , | ; } expresión] ...] [{ , | ; }]

Write y Print son diferentes. Write inserta comas entre los distintos items a escribir en el fichero. Si se desean conservar los valores de un archivo abierto para escritura, se tendrá que abrir en modo Append y no Output.

Por tanto, para escribir en un archivo de acceso secuencial se seguirán los pasos:

Page 26: Archivos de Datos Vb

1. Abrir el fichero para escritura con: Open NombreDeArchivo For Output As #NúmeroDeArchivo

1. Escribir los datos en el fichero utilizando la sentencia: Print #NúmeroDeArchivo, expresiones

1. Cerrar el archivo con la sentencia: Close #NúmeroDeArchivo

EJERCICIOS:

1. Modificar el ejercicio del Editor para que se pueda grabar o recuperar el texto de un archivo. debe aparecer un nuevo formulario en el que el usuario introducirá el nombre del fichero a grabar o recuperar, incluida la ruta. Se deben controlar los posiblers errores que aparezcan al intentar acceder a un archivo que no exista.

1. Modificar el ejercicio anterior para que el usuario pueda escoger la unidad, directorio y nombre del fichero a recuperar.

7.3.- ARCHIVOS DE ACCESO ALEATORIO.

ABRIR Y CERRAR ARCHIVOS ALEATORIOS

Modificaremos la instrucción Open (abrir) con la sintaxis:

Open NombreDeArchivo For Random As #NúmeroDeArchivo Len = LongitudDelRegistro

En un archivo de acceso aleatorio, se puede leer o escribir sin tener que cerrar cada vez.. Se debe facilitar el número de bytes que se deben leer o escribir. Para cerrar un archivo aleatorio, se utilizará Close como si fuera un archivo secuencial.

LEER Y ESCRIBIR DE ARCHIVOS ALEATORIOS

Para leer y escribir de un archivo aleatorio, utilizaremos las instrucciones Get y Put respectivamentes, con las sintaxis:

Get #NúmeroDeArchivo, [NúmeroDeRegistro] , Variable

Put #NúmeroDeArchivo, [NúmeroDeRegistro] , Variable

Get lee del archivo y almacena los datos en la variable, mientras que Put escribe el contenido de la variable en el archivo.

Por tanto, para leer / escribir en un archivo de acceso aleatorio, se seguirán los pasos:

1. Abrir el fichero para acceso aleatorio con: Open NombreDeArchivo For Random As #NúmeroDeArchivo Len = LongitudRegistro

1. Escribir los datos en el fichero utilizando la sentencia: Put #NúmeroDeArchivo, [NúmeroDeRegistro] , Variable o bien leer los datos del archivo con la sentencia: Get #NúmeroDeArchivo, [NúmeroDeRegistro] , Variable

1. Cerrar el archivo con la sentencia: Close #NúmeroDeArchivo

UTILIZAR LA INSTRUCCIÓN SEEK #

La intrucción Seek puede ser extremadamente útil porque indica la siguiente posición a leer o escribir de un fichero abierto. La sintaxis es la siguiente:

Seek #NúmeroDeArchivo, posicion

Page 27: Archivos de Datos Vb

donde posicion indica el siguiente registro a leer o escribir. Por ejemplo la sentencia:

Get #1, QueRegistro, Datos(QueRegistro)

es equivalente a las sentencias:

Seek #1, QueRegistro

Get #1,, Datos(QueRegistro)

7.4.- ARCHIVOS DE ACCESO BINARIO.

ABRIR Y CERRAR ARCHIVOS BINARIOS

En este tipo de ficheros los datos no siguen ningún orden, por lo que acceder a ellos es complejo. Los pasos que se deberán seguir para escribir en un archivo binario son:

1. Abrir el fichero para acceso binario con: Open NombreDeArchivo For Binary As #NúmeroDeArchivo

1. Escribir los datos en el fichero utilizando la sentencia: Put #NúmeroDeArchivo, [posición] , Variable o bien leer los datos del archivo con la sentencia: Get #NúmeroDeArchivo, [NúmeroDeRegistro] , Variable

1. Cerrar el archivo con la sentencia: Close #NúmeroDeArchivo

7.5.- ACCESO A UNA BASE DE DATOS.

EL CONTROL DATOS

Utilizando un control Data, podremos comunicarnos con una base de datos para editar, visualizar y actualizar uno o más registros. Visual Basic permite comunicarse con bases de datos creadas con Microsoft Access, Microsoft Fox Pro, Borland Paradox, Borland dBase.

Los métodos que se pueden utilizar con un control de datos son: MoveFirst, para posicionarse en el primer registro. MovePrevious, para posicionarse en el registro anterior. MoveLast, para posicionarse en el último registro. MoveNext, para posicionarse en el registro siguiente. Refresh, la base de datos se abre para ser utilizada o, se cierra y se vuelve a abrir si ya estaba abierta. AddNew, añadir un nuevo registro. Update, se escriben todos los campos editados en la base de datos. Delete, elimina el registro actual.

Las propiedades importantes de este control son: Connect (conexión). Esta propiedad especifica el formato de la base de datos. Los valores que se pueden utilizar son: cadena vacía para formato Access, "foxpro 2.5;", "paradox;", y "dbase iv;". DatabaseName (nombre de la base de datos) Sirve para identificar al archivo de base de datos. RecordSource (fuente del registro). Indica de dónde se obtienen los datos. Exclusive (exclusiva). Determina el tipo de acceso, monousuario (True) o multiusuario (False). ReadOnly (solo lectura). Determina el modo de acceso.

Cada vez que se cambie el valor de una propiedad, debe ejecutarse el método Refresh. Otras propiedades que se podrán consultar son: BOF (comienzo del archivo) esta propiedad es True si el registro actual es el primero. EOF (final del archivo) que estará a True cuando el registro actual sea el último.

Un objeto Dynaset es un conjunto dinámico de registros. Cada conjunto de registros tiene asignado una colección Fields por defecto (conjunto de objetos Field, cada uno de los cuales define un campo de la base de datos). La propiedad por defecto para un objeto Field, es Value, que contiene el valor del campo que representa para el registro actual.para acceder a un miembro individual de una colección, puede hacerlo a través de un índice o utilizando el nombre del campo. P.e. la sentencia Print Data1.RecordSet(0) es equivalente, suponiendo que el campo 0 es Título, a las sentencias:

Page 28: Archivos de Datos Vb

Print Data1.RecordSet.Fields(0)

Print Data1.RecordSet.Fields("Título")

Print Data1.RecordSet.Fields("Título").Value

También tiene asociada una propiedad Count que dice cuántos objetos están contenidos en el objeto Dynaset.

Para poder realizar modificaciones en una base de datos, ésta tiene que ser actualizable, es decir, la propiedad ReadOnly tiene que estar establecida a False y la propiedad Updatable a True. Para saber si una base de datos es actualizable, escribiremos el código:

Actualizable = True

‘Verificar si la base de datos es actualizable

If (Data1.ReadOnly = True Or Data1.Recordset.Updatable = False) Then

Actualizable = False ‘Base de datos no actualizable

End If

Para verificar si un determinado campo es actualizable, el código necesario es:

‘Verificar si el campo(0) es actualizable

If (Data1.Recordset.Fields(0).Attributes And DB_UPDATABLEFIELD) = 0 Then

Actualizable = False ‘Campo de datos no actualizable

End If

La propiedad Attributes indica los atributos de un campo. Para saber si un campo tiene un determinado atributo, se hará un And con el valor del atributo a verificar. Las constantes DB_... están definidas en el fichero ...vbdataconstant.txt

Algunos eventos que se producen en un control de datos son:

Reposition. Se produce después de que un determinado registro pase a ser el registro actual. Su sintaxis es Sub Data1_Reposition()

Validate. Se produce justo antes de que un determinado registro pase a ser el registro actual. Ocurre antes de una operación Update, Delete o Close. Su sintaxis es Sub Data1_Validate(Action As Integer, Save As Integer). Para saber la causa que originó el suceso Validate, habrá que examinar el parámetro Action. Este parámetro se corresponde con el tipo de operación que causó este suceso. Los valores que puede tomar se pueden localizar en el fichero ...vbconstant.txt y empiezan por DATA_ACTION... El parámetro Save toma el valor True si cualquier control ligado al control de datos cambia. Para saber qué control ha cambiado, habrá que evaluar la propiedad DataChanged de cada uno de ellos. Durante este suceso, no se podrán utilizar los métodos Move.... En su lugar se utilizará el parámetro Action.

UTILIZADES ADICIONALES

Las utilidades adicionales que se pueden utilizar en aplicaiones complejas son:

Page 29: Archivos de Datos Vb

Control de transacciones. Una transacción es una serie de cambios que se quieren hacer sobre una base de datos con la posibilidad de deshacerlos. Las tres sentencias de Visual Basic para realizar transacciones son: BeginTrans, CommitTrans y RollBack. La forma de utilizarlas lo veremos en un ejemplo.

BeginTrans

Criterio = "Título Like ‘*1ª Edición*’"

Data1.Recorset.FindFirst Criterio

Do While Not Data1.Recordset.NoMatch

If Not Data1.Recordset.NoMatch Then

Data1.Recordset.Delete ‘Borrar registro

RegsBorrados = RegsBorrados + 1

End If

Data1.Recorset.FindNext Criterio

Loop

If RegsBorrados = 0 Then

RollBack

Exit Sub

End If

Msg = "¿Está seguro que desea borrar " & RegsBorrados & " registros?"

If MsgBox(Msg, 17, "¿Borrar registros?") <>1 Then

RollBack ‘Deshacer los cambios

Else

CommitTrans ‘Borrar Registros

End If

Métodos UpdateRecord, que guarda valores contenidos en los controles ligados correspondientes al registro actual. Su ejecución no provoca el suceso Update. Y UpdateControls, que actualiza los controles ligados con los valores del registro actual. Ambos métodos ejecutan sus acciones sin cambiar de registro actual.

Suceso Error, que se produce si ocurre un error en tiempo de ejecución. Útil para controlar los errores. Su sintaxis es: Sub Data1_Error(DataErr As Integer, Response As Integer), donde DataErr es el nº de error y Response es la respuesta que se desea tomar: 0 continuar, 1 visualizar mensaje (valor por defecto)

Page 30: Archivos de Datos Vb

 

 

7.6.- UTILIZACIÓN DE LOS FICHEROS .INI

Muchas veces cuando se escribe una aplicación, se desearía recordar algunas variables de la última vez que se ejecutó la aplicación. Este tipo de información se almacena en los ficheros ini. Afortunadamente, Windows proporciona un editor de texto ASCII para leer y escribir ficheros de este tipo. Existen dos clases de cadenas de perfil: públicas y privadas. Las públicas se almacenan en el archivo Win.ini. las cadenas privadas se incluyen en ficheros con un nombre dado por el programador, con extensión .ini. Nosotros deberíamos introducir cadenas de perfil de tipo privado. Por ejemplo: si escribimos una aplicación MiEjemplo.Exe, podríamos utilizar un archivo privado C:WINDOWSMIEJEMPLO.INI.

Para leer y escribir en ficheros ini, se necesita conocer tres cosas:

1. El nombre del fichero.1. El nombre de la sección donde aparece.1. La palabra de acceso para el valor.

Por ejemplo, el fichero MiEjemplo.ini se parecerá a:

[Nombre del usuario] ‘Esta es la sección

UltimoNombre = Lopez ‘UltimoNombre es la palabra de acceso

Existen tres funciones que se pueden utilizar en ficheros .ini privados:

GetPrivateProfileString GetPrivateProfileInt WritePrivateProfileString

Estas funciones son parte de la API de Windows. Son fucniones externas a Visual Basic, por lo que deben ser declaradas en la sección general de declaraciones de un formulario del proyecto Visual, o en la sección de declaraciones de un módulo y declaradas como públicos.

Sistema de coordenadas

Se utilizan coordenadas para definir la posición de cualquier objeto presentado en la pantalla. Para algunos objetos, el sistema de coordenadas también se utiliza para definir el tamaño del objeto (su altura y anchura). La posición de un objeto siempre se expresa como la distancia entre su esquina superior izquierda y la esquina superior izquierda de su objeto contenedor.

El contenedor de un formulario es siempre el objeto Screen (pantalla). La única excepción de esta regla es lo que se denomina formularios hijos MDI (Interfaz de Documentos Múltiples), cuyo contenedor es el formulario padre MDI. El contenedor de un control es siempre el formulario sobre el que está, salvo que el control esté colocado en un Picture Box o Frame, en cuyo caso el Picture Box o Frame es el contenedor. El único otro posible contenedor es el objeto Printer, que se utiliza para imprimir.

El sistema de coordenadas de Visual Basic funciona como el sistema gráfico de coordenadas cartesianas habitual. Cualquier punto se representa con dos números. Uno

Page 31: Archivos de Datos Vb

de ellos (tradicionalmente llamado X) indica la posición horizontal del punto, mientras que el otro número (Y) indica la posición vertical del punto. Por supuesto, un sistema de coordenadas debe tener un punto cero, u origen (el punto donde tanto X como Y es 0). También debe tener una escala que relaciona las unidades de las coordenadas con las unidades de medida. Un valor X de dos, puede significar dos centímetros, dos metros o dos kilómetros.

En todos los sistemas de coordenadas de Visual Basic, el origen por omisión se localiza en la esquina superior izquierda del contenedor. Los valores X positivos se mueven a la derecha, y los valores Y positivos hacia abajo. Las coordenadas negativas son posibles y representan posiciones por encima o a la izquierda del origen por omisión. El origen puede situarse en cualquier sitio (al menos para algunos objetos contenedores).

Una unidad lógica imprime al tamaño correcto. Por ejemplo, una línea que mide una pulgada lógica mide una pulgada cuando se imprime. Establecemos una escala del objeto contenedor utilizando la propiedad ScaleMode; sin embargo, los únicos objetos que tienen una propiedad ScaleMode son Form, Picture Box y Printer. Los otros objetos que pueden ser contenedores (el objeto Screen y el control Frame) siempre usan twips para las medidas.

Podemos usar varias escalas diferentes en las coordenadas de Visual Basic. Aunque muchos programas Visual Basic están escritos utilizando únicamente la escala por omisión, necesitamos saber las opciones.

Especificaciones de escalas en Visual Basic. (ScaleMode)

Valor  Unidades de escala

0  Personalizado

1  Twip (por defecto); hay 1.440 twips por pulgada lógica, y 567 twips por centímetro lógico

2  Punto; hay 72 puntos por pulgada lógica

3  Pixel; ésta es la unidad más pequeña de resolución de pantalla o impresora

4  Carácter; una unidad carácter es igual a 120 twips horizontales, y 240 twips verticales

5  Pulgada

6  Milímetro

7  Centímetro

Page 32: Archivos de Datos Vb

El objeto Screen

El objeto Screen es la representación lógica de Visual Basic de toda la pantalla de visualización. Las coordenadas de pantalla siempre se miden en twips, y la esquina superior izquierda siempre se localiza en (0, 0). El tamaño físico de la pantalla varía de un sistema a otro. Podemos obtener el tamaño de la pantalla mediante dos propiedades del objeto Screen, Width y Height.

ScreenWidthInTwips = Screen.widthScreenHeightInTwips = Screen.Height

Aunque no podemos cambiar estas propiedades, conocer sus valores nos ayudará a determinar la posición y tamaño correctos de nuestros formularios. El objeto Screen tiene algunas otras propiedades que necesitamos conocer.

Las propiedades TwipsPerPixelX y TwipsPerPixelY devuelven el número de twips por pixel de pantalla. Un pixel es el punto más pequeño de luz que puede visualizarse en la pantalla, y la resolución física de una visualización concreta se expresa en términos de pixeles horizontales y verticales. Cuando un programa está en ejecución, el número de twips por pixel dependerá de la configuración del hardware del sistema, así como de los ajustes del controlador de visualización de Windows. Podernos usar estas propiedades para acoplar los gráficos del programa con las características de la pantalla. Por ejemplo, para dibujar la línea horizontal más fina posible, estableceríamos el grosor de la línea igual a Screen.TwipsPerPixelY twips. El resultado es una línea que tiene precisamente un grosor de un pixel. También podemos calcular la resolución actual de la pantalla:

Xres = Screen.Width / Screen.TwipsPerPixelXYres = Screen.Height / Screen.TwipsPerPixelY

La propiedad MousePointer especifica el aspecto del puntero del ratón mientras está sobre un elemento de pantalla de Visual Basic. Con la especificación por defecto de 0, el puntero está controlado por la propiedad MousePointer de los objetos del programa (formulario, control, etc.). Otras posibles especificaciones para la propiedad MousePointer del objeto Screen:

Especificaciones de la propiedad MousePointer.

Especificación Descripción

0 Forma determinada por el objeto (por omisión)

1 Flecha

2 Cruz (puntero en forma de cruz)

3 Barra |

Page 33: Archivos de Datos Vb

4 Icono (cuadradito dentro de un rectángulo)

5 Tamaño (flecha de cuatro puntas señalando el norte, sur, este y oeste)

6 Tamaño NE SW (flecha doble que señala los cuatro puntos cardinales)

7 Tamaño N S (flecha doble que señala el norte y el sur)

8 Tamaño NW SE (flecha doble que señala el noroeste y el sureste)

9 Tamaño W E (flecha doble señalando el oeste y este)

10 Flecha arriba

11 Reloj de arena (espera)

12 No soltar

13 Flecha y reloj de arena

14 Flecha y signo de interrogación

15Dimensionar todo (puede personalizarse bajo Microsoft Windows NT 3.51 y 4.0)

99 Icono personal especificado con la propiedad MouseIcon

Una propiedad MousePointer de 99 nos permite definir nuestro propio cursor utilizando la propiedad MouseIcon. En la sentencia:

Screen.MouseIcon = picture

picture especifica el nombre y ruta del archivo del icono o cursor que debe utilizarse como cursor del ratón cuando la propiedad MousePointer se establece a 99.

La propiedad ActiveForm devuelve el formulario que está actualmente activo. Esta propiedad es útil en un programa de múltiples formularios para escribir una sección de código que siempre referenciará al formulario activo.

Propiedades de posición y tamaño

Las propiedades Top y Left especifican la posición de la esquina superior izquierda del objeto dentro de su contenedor, y las propiedades Height y Width especifican su tamaño. Estas cuatro propiedades utilizan las unidades de coordenadas especificadas por

Page 34: Archivos de Datos Vb

la propiedad ScaleMode del contenedor. Si cambiamos la propiedad ScaleMode de un contenedor, bien durante el diseño del programa o en ejecución, las propiedades de cualquier objeto del contenedor cambian automáticamente a las nuevas unidades.

Otras dos propiedades, ScaleHeight y ScaleWidth, sólo se aplican a objetos Form, Picture Box y Printer. Estas propiedades proveen las dimensiones del interior del objeto (es decir, el área disponible para operar con gráficos). Estas especificaciones son diferentes de las que proveen las propiedades Height y Width, que indican el tamaño global del objeto, incluyendo los bordes, barra de título y otros componentes del objeto. El uso más frecuente para las propiedades ScaleHeight y ScaleWidth es en tiempo de ejecución: el programa las lee para determinar el tamaño del interior del objeto contenedor y luego utiliza los valores para situar objetos o realizar operaciones gráficas dentro del contenedor.

Todos los controles Visual Basic tienen una propiedad Container, que devuelve la identidad del objeto contenedor del control. También podemos establecer esta propiedad, que tendría el efecto de mover un control de un contenedor a otro.

Carga y presentación de formularios

Cada formulario de un proyecto Visual Basic existe en su propio archivo en disco. Presentar un formulario en la pantalla requiere dos pasos:

1. Cargar el formulario del disco a la memoria.2. Presentar el formulario.

En un proyecto de formulario único, el formulario se carga y se presenta cuando arranca el programa. Para un proyecto de múltiples formularios, el formulario de arranque designado se carga y se presenta cuando el programa se inicia. El resto de formularios se cargan y se presentan bajo el control del programa.

Podemos usar la sentencia Load para cargar un formulario sin presentarlo:

Load nombreformulario

Un formulario también se cargará si el programa se refiere a alguna de sus propiedades. Cargar un formulario y visualizarlo son dos cosas diferentes, por ejemplo, el método Show, se utiliza para visualizar un formulario. Si el formulario todavía no ha sido cargado, Show lo carga automáticamente.

nombreformulario.Show

Dos casos, en que Load es útil son:

Si queremos que el procedimiento de evento Load del formulario se ejecute sin que se presente, utilizar la sentencia Load.

Si el formulario es complejo (es decir, si tiene muchos controles y/o realiza procesamientos complejos en su procedimiento de evento Load), usar la sentencia Load para cargar el formulario antes de que se necesite visualizarlo.

Page 35: Archivos de Datos Vb

Los formularios complejos se visualizan más deprisa si han sido cargados con anticipación.

Para descargar un formulario que no necesitamos cuando queremos liberar memoria o inicializar todas las propiedades del formulario a sus valores originales se usa la sentencia Unload:

Unload nombreformulario

Para quitar un formulario de la pantalla sin descargarlo, usar el método Hide:

nombreformulario.Hide

Ejemplo

En un formulario nuevo, insertar un Picture Box y un botón. Establecer que el formulario se presente en centro de la pantalla ocupando la mitad del tamaño de la misma y que se redimensionen todos los objetos al cambiar el tamaño del formulario. (Procedimiento de evento Form_Resize). Llamarlo Ejemplo01.

Ejemplo de elementos gráficos

Nota: La primera tarea que debemos abordar es colocar el formulario en medio de la pantalla, para ello acudiremos en diseño a la propiedad StartUpPosition y elegiremos el valor 2 -  CenterScreen. Para especificar el tamaño del formulario tendremos que escribir el siguiente código en su evento Load:

De esta forma, nos aseguramos que tanto la altura como la anchura del formulario (al que hemos llamado Proporcional) sean justo la mitad de las que tenga la pantalla.

Teniendo en cuenta que hemos llamado caja al PictureBox y Salir al botón de comando, deberemos escribir el siguiente código en el evento resize. Ya sólo faltará escribir el código respuesta a la pulsación del botón Salir.

Page 36: Archivos de Datos Vb

El control Picture Box

Las posibilidades de este control pertenecen a tres campos:

Presentar imágenes que fueron creadas en cualquier otra parte y existen en archivos en disco, como fotografías escaneadas y dibujos creados con un programa gráfico.

Presentar gráficos que son creados con sentencias de programa, como el método Circle.

Servir como un contenedor para agrupar otros controles.

Carga de una imagen durante el diseño del programa

Podemos cargar una imagen en un Picture Box durante el diseño del programa, con el objetivo de incrustar la imagen en el archivo ejecutable del proyecto. (Las imágenes a veces se guardan como archivos FRX.) Este método es apropiado si un Picture Box siempre va a mostrar la misma imagen o cuando no queremos distribuir un archivo de imagen separado del programa. Cargar una imagen durante el diseño del programa no impide que podamos cargar otra imagen en el Picture Box mientras el programa está en ejecución.

Formatos de imagen para un Picture Box.

Formato Extensión Descripción

Bitmap   BMP o DIB

Bitmap Windows. Define una imagen como una cuadrícula de puntos (pixeles).

Icono    ICO   Un tipo especial de bitmap, normalmente 32 por 32 o 16 por 16 pixeles de tamaño.

Page 37: Archivos de Datos Vb

Cursor    CUR   Similar a un icono, aunque también contiene un hotspot (zona caliente) definido, que sigue con precisión la posición del cursor. Se utiliza para el puntero del ratón.

Metaarchivo   WMF o EMF

Metaarchivo Windows. Define una imagen en términos de líneas y formas.

JPEG   JPG o JPEG

formato Joint Photographic Expert Group. Un formato de imagen comprimida que admite color de 8 y 24 bits. Habitualmente utilizado en Internet.

GIF    GIFGraphical Interchange Format. Un formato comprimido que sólo admite color de 8 bits. También popular en Internet.

Para cargar una imagen en tiempo de diseño, seleccionar la propiedad Picture del Picture Box en la ventana Propiedades. Visual Basic presenta un panel de diálogo Cargar Imagen, que permite seleccionar el archivo gráfico. La imagen seleccionada se presenta en el control durante el diseño, así como cuando el programa se ejecuta.

Una imagen se carga en un control Picture Box con la esquina superior izquierda de la imagen situada en la esquina superior izquierda del Picture Box. Si la imagen es menor que el Picture Box, el área exterior de la imagen presenta el color especificado por la propiedad BackColor del Picture Box. Si la imagen es mayor que el control, la porción que sale fuera del Picture Box es recortada si la propiedad AutoSize se establece como False (por defecto). Podemos establecer la propiedad AutoSize del Picture Box como True, lo que hace que el Picture Box se agrande o encoja para acoger el tamaño exacto de la imagen.

También podemos cargar una imagen en un Picture Box desde el Portapapeles de Windows. Abrimos la imagen en la aplicación con la que la creamos o editamos, luego copiamos la imagen al Portapapeles utilizando el comando Edición / Copiar. Volvemos a Visual Basic, seleccionarnos el control Picture Box, y seleccionarnos Edición / Pegar.

Carga de una imagen durante la ejecución del programa

Hay varios métodos hay disponibles para visualizar una imagen en un Picture Box en tiempo de ejecución. Un método podría ser seleccionar la propiedad Picture del control. Pero no funciona directamente. Debemos usar la función LoadPicture:

MiPictureBox.Picture = LoadPicture(nombrearchivo)

Donde nombrearchivo es el nombre de un archivo en uno de los formatos de imagen admitidos, incluyendo la ruta completa, si es necesario. La posición de la imagen y el efecto de la propiedad AutoSize del control son los mismos que cuando cargamos una imagen en tiempo de diseño. Podemos borrar un Picture Box utilizando LoadPicture sin argumento:

Page 38: Archivos de Datos Vb

MiPictureBox.Picture = LoadPicture()

También podemos copiar una imagen de un Picture Box a otro accediendo a la propiedad Picture del control:

MiPictureBox1.Picture = MiPictureBox2.Picture

Cargar una imagen en un Picture Box con estos métodos es correcto en la mayoría de las ocasiones, pero tiene algunas limitaciones:

La imagen siempre se coloca en la esquina superior izquierda del Picture Box. El tamaño de la imagen no puede cambiarse, es decir, la imagen siempre se

presenta con su tamaño original.

Sólo puede presentarse una imagen cada vez en un control dado.

El método PaintPicture

Este método permite eludir las limitaciones de los anteriores métodos utilizados para cargar una imagen durante la ejecución del programa. Se comienza con una imagen fuente, bien en un control Picture Box o en un formulario. Luego se puede tomar toda la imagen o parte de ella (cualquier región rectangular) y colocarla en cualquier sitio, en otro Picture Box o formulario, o en el Picture Box o formulario fuente. Se puede estirar o encoger la imagen "copiada".

La sintaxis del método PaintPicture:

Objeto.PaintPicture gráfico, x1, y1, w1, h1, x2, y2, w2, h2, código

donde los argumentos son como sigue:

Objeto. El nombre del objeto Picture Box, Form o Printer donde la imagen va a colocarse. Este argumento es opcional. Si se omite, se asume el formulario que tiene el foco.

gráfico. La fuente del gráfico. Debe ser la propiedad Picture de un objeto Form, Picture o Picture Box.

x1, y1. Los valores que indican las coordenadas destino (es decir, la posición del objeto destino donde la esquina superior izquierda de la imagen va a dibujarse). La propiedad ScaleMode del objeto determina la unidad de medida utilizada.

w1, h1. Los valores que indican la anchura y altura destinos de la imagen, utilizando las unidades especificadas por la propiedad ScaleMode del objeto destino. Si la anchura y/o altura destino es mayor o menor que la anchura (w2) o altura (h2) fuente, la imagen se estira o se encoge para encajar. Estos argumentos son opcionales; si se omiten, la anchura (w1) y la altura (h1) fuente se utilizan sin estiramiento ni compresión.

x2, y2. Los valores que indican las coordenadas fuente de la región que va a ser copiada en el objeto fuente (en unidades especificadas por la propiedad ScaleMode del objeto fuente). Estos argumentos son opcionales; si se omiten, se asume 0 (indicando la esquina superior izquierda de la imagen fuente).

Page 39: Archivos de Datos Vb

w2, h2. Los valores que indican la anchura y altura de la región dentro de la fuente que va a copiarse (en unidades especificadas por la propiedad ScaleMode del objeto fuente). Estos argumentos son opcionales; si se omiten, se utiliza toda la anchura y altura de la fuente.

código. Un valor de tipo Long que define la operación en modo de bit realizada entre los pixeles de la imagen fuente y los pixeles de cualquier imagen existente sobre el destino. Este argumento, que es opcional y es útil únicamente con bitmaps. Si el argumento se omite, la fuente se copia en el destino, reemplazando cualquier cosa que hubiera allí.

Una imagen bitmap puede estar ya allí, pero aunque el destino esté en blanco, algo hay allí, tal vez sólo pixeles blancos. Sobre la extensión de la región copiada, por tanto, cada pixel de la imagen copiada tiene el correspondiente pixel en la misma localización en el destino. El argumento código determina como se combinan estos pixeles.

La operación más simple y frecuente es dejar que cada nuevo pixel reemplace el pixel original. El argumento código para esto es la constante predefinida vbSrcCopy. Otros dos argumentos código útiles son vbBlackness y vbWhiteness, que cambian el rectángulo destino a todo negro o todo blanco. Esto en realidad no es una copia de la imagen fuente, pero aún así hay que especificar una fuente en la sentencia PaintPicture. Otros argumentos código realizan diversas combinaciones lógicas de la imagen fuente con la imagen destino. Se puede usar para crear ciertos tipos de efectos visuales, para ahondar en este tema ir al sistema de ayuda de Visual Basic.

Ejemplo

En un formulario nuevo insertar dos Picture Box. Cargar en uno de ellos una imagen (por ejemplo guardia.jpg). Utilizar el otro como ventana de zoom para pulsaciones del botón izquierdo del ratón sobre la imagen. Llamarlo Ejemplo02.  

Ejemplo del método PaintPicture

Descargar guardia.jpg

Nota: Eventos relacionados con el ratón: Visual Basic tiene cuatro eventos relacionados con el clic del ratón. El evento MouseDown se produce cuando el usuario pulsa un botón del ratón. El objeto sobre el que se encuentra el puntero del ratón captura el ratón. Esto significa que el objeto recibe todos los eventos de ratón, incluyendo el evento MouseUp cuando el botón del ratón es liberado (aun cuando el ratón se haya apartado del objeto mientras el ratón estaba pulsado). El evento Click, sin embargo, es generado sólo si los eventos MouseDown y MouseUp se producen sobre el objeto. Si el ratón es apartado del objeto antes de liberar el botón, el objeto recibe un evento MouseDown y MouseUp, pero no un evento Click. Si el botón es liberado sobre el objeto, entonces el evento ocurre en el orden MouseDown, MouseUp, Click. Si hacemos doble clic sobre un objeto, el orden de eventos es MouseDown, MouseUp, DblClick, MouseUp.

Page 40: Archivos de Datos Vb

Nota: Una vez insertados los dos picture box y cargado uno de ellos con una imagen, suponer que el que tiene la imagen se llama caja1 y el otro caja2. Conviene que en el Load del formulario ajustemos los tamaños y posiciones de los objetos.

Observar que se definen dos constantes (Alto y Ancho) que utilizaremos más adelante para definir el tamaño del recuadro a visualizar aumentado de tamaño.

Para interceptar la pulsación del botón izquierdo del ratón, usaremos el evento Mouse_Up que nos permite seleccionar el botón pulsado.

Page 41: Archivos de Datos Vb

Una vez que disponemos de las coordenadas X e Y pulsadas por el usuario, tenemos que crear un cuadrado virtual cuyo centro sean esas coordenadas, de forma que sea el que enviemos al otro picture box, como en el destino ocupará todo el control, habremos conseguido el efecto zoom deseado.

Antes de programar el método PaintPicture, debemos pasar las coordenadas del cuadrado virtual por cuatro comprobaciones, de forma que nos aseguremos que el mismo no se "sale" del contenedor.