Visual Basic Anoche

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 112

Hacer que un Textbox solo reciba números:

Podemos utilizar el siguiente condicional en el evento Validate que no nos permitirá salir
del control si lo escrito en él no son números:

Pero para que las teclas "de letras" o "símbolos" no se puedan escribir es necesario:

Formatear un Textbox

Esto se utiliza para que un Textbox muestre un numero separados por unidades y
decimales.
Para realizar operaciones matemáticas con un Textbox formateado se debes cambiar la
función Val por CDbl, ejemplo:

 CommandButton (Botón de Comando):

Este control permite encapsular procedimientos para que sean utilizados por el usuario con
solo hacer click sobre él.

Algunas Propiedades

Cancel: Permite ejecutar el código escrito en el control presionando "Esc"

Default: Permite ejecutar el código escrito en el control presionando "Enter"

Style: Puede ser Graphical o Standard. Si es Graphical permite cambio de color entre otras.

Picture: Carga una imagen para el CommandButton si su propiedad Style es Graphical.

 Label (Etiqueta):

Muestra la información, los títulos o los subtítulos que deseemos.

Algunas Propiedades

Alignment: Permite alinear el texto hacia la izquierda, derecha o centro.

BackStyle: Permite hacer que el fondo de la etiqueta sea transparente o solidó.

AutoSize: Ajusta el tamaño del control a la longitud del texto.

WordWrap: Muestra el texto (cuando es mucho) en varias líneas.

DataField y DataSorce: son iguales en todos los controles que las tengan.
Hacer que una etiqueta cambie de color cuando se pasa el mouse sobre ella

 CheckBox (Casilla de verificación)

Permite que se ejecute un procedimiento dependiendo de la verificación del Checkbox

Algunas Propiedades

Style: Si es Graphical convierte el control en un botón de chequeo.

Value: Activa o desactiva el valor de verificación. Cheked (Verifica), Uncheked


(Desverifica) o Grayed (Inhabilitado)

Cambiar una etiqueta dependiendo del valor del ChekBox

 OptionButton (Botón de opción)

Permite que un código se ejecute teniendo en cuenta el valor de este control.

Algunas Propiedades

Value: Puede ser (True) mostrando un punto negro o (False) quitándolo.

Mostrar la opción elegida


 ComboBox (Caja Combo)

Permite escoger de una lista de opciones creadas un elemento.

Algunas Propiedades

List: Permite crear uno a uno los elementos de la lista del ComboBox

Style: Permite cambiar a un combo simple o lista.

Sorted: Si es (True) organiza los elementos de su lista alfabéticamente.

Agregar elementos mediante código

Realizar procedimientos dependiendo el elemento seleccionado

 ListBox (Lista)

Muestra datos o campos en forma de lista.

Algunas Propiedades

Style: Standard (Normal) o CheckBox (Una lista con casillas de verificación)

Agregar campos de base de datos a un ListBox


 Timer (Temporizador)

Realiza un procedimiento en un intervalo o intervalos de tiempo determinados.

Algunas Propiedades

Interval: Permite ingresar el valor del intervalo de tiempo. Un intervalo de 1000 equivale a
1 segundo.

Enabled: Si es (False) pausa al temporizador, si es (True) lo activa.

Hacer una etiqueta parpadeante

Colocar 50 como valor en la propiedad Interval.

Check1.FontBold = True
1 - Arreglos y vectores

1.1 - Declaración de los arreglos en el código

1.2 - Acceder a los datos de un arreglo

1.3 - Arreglos y estructuras (UDT)

2 - Matrices

2.1 - Ejemplo de matriz de 2 dimensiones

3 - Arreglos y vectores dinámicos

3.1 - Ejemplo para crear un Vector dinámico

4 - Funciones de VB para trabajar con Arreglos - LBound y UBound

4.1 - Ejemplos de Lbound y Ubound

4.2 - Función Join, Split y Filter

5 - Los arreglos de controles

5.1 - Ejemplo para crear un arreglo de controles

5.2 - Pasar arreglo de controles como parámetro a un procedimento

1 - Arreglos y vectores

Los Arreglos se utilizan para almacenar un conjunto de variables, que sean del
mismo tipo de dato, y todas estas bajo un mismo nombre.

Por ejemplo imaginemos que tenemos 20 variables de tipo String que almacenan
nombres (nombre1, nombre2, etc..). si yo ahora quisiera pasar todas estas
cadenas a minúsculas tendría que utilizar la función Lcase con cada variable:
nombre1 = Lcase(nombre1), nombre2 = Lcase(nombre2), etc..

En cambio si utilizara un arreglo solucionaría mi problema solo a esto

Dim nombres(30) As String

For x = 0 To 30
nombres(x) = LCase(nombres(x))

Next

Siguiendo el ejemplo anterior: en vez de escribir la sentencia Lcase 30 veces para


cada variable, hemos utilizado un arreglo llamado nombres con un número de
índice 30 , es decir que almacena 30 datos de tipo String

1.1 - Declaración de los arreglos en el código

Para crear un arreglo se debe en primer lugar declararlo como cualquier otra
variable, la única diferencia es que debemos indicar la cantidad de elementos que
contendrá el arreglo, colocando el número de índice entre paréntesis. Por ejemplo

Lo siguiente crea un arreglo de 15 elementos o datos de tipo integer

Dim miArreglo (1 to 15) as integer

Esto crea un arreglo de 11 elementos o datos de tipo String

Dim empleados (10) as String

Como podemos ver en el primer ejemplo hemos declarado un arreglo llamado


miArreglo y entre paréntesis hemos declarado el rango de capacidad del mismo,
es decir la cantidad de datos que podrá contener

El primer número , el 1 , indica el límite inferior del mismo, y el número 15 indica el


límite máximo del arreglo, conformando de esta manera un arreglo que podrá
almacenar 15 datos de tipo string.

En el segundo ejemplo, declaramos un arreglo de 11 elementos de tipo string.


Como puedes ver hemos indicado solo un número que representa el valor máximo
del mismo. Cabe aclarar que hemos puesto de índice el número 10, pero en
realidad el arreglo contiene 11 elementos ya que cuando NO indicamos el limite
inferior , se asume que el mismo comienza desde el 0.

Importante: los arreglos se dividen en 2 grupos, los vectores y las matrices. Los
vectores son arreglos que contienen una sola dimensión y las matrices 2 o mas
dimensiones.

1.2 - Acceder a los datos de un arreglo

Para acceder a los datos de un arreglo o vector, debemos hacerlo mediante el


índice o número del elemento del mismo. Por ejemplo:
Dim alumnos(1 To 4) As String

alumnos(1) = "juan"
alumnos(2) = "micaela"
alumnos(3) = "maría"
alumnos(4) = "ignacio"

Primero declaramos un arreglo llamado alumnos, de tipo string y que contendrá 4


elementos. Luego le asignamos un valor de cadena como a cualquier otra variable
de tipo string, pero con la diferencia que para referirnos al elemento utilizamos el
n° de índice del mismo.

Otro ejemplo

Dim paises(2) As String

' Llena el vector con datos


paises(0) = "Argentina"
paises(1) = "Perú"
paises(2) = "Brasil"

' Recorre los elementos del vector


For x = 0 To 2

MsgBox "Nombre del país : " & paises(x)

Next x

En este último ejemplo, declaramos y creamos un vector de 3 elementos que


contendrá el nombre de 3 países. Luego en un bucle For utilizamos la función
MsgBox para mostrar los elementos del arreglo, pasándole como parámetro del
índice la variable x del bucle For

1.3 - Utilizar una estructura Type o UDT en un arreglo

Como vimos, en un arreglo podemos almacenar datos de cualquier tipo pero no


mezclarlos, es decir podemos crear arreglos de tipo string, de tipo Integer etc,,,
pero sin duda que lo mas importante y de mas utilidad a la hora de programar es
la utilización de datos definidos por nosotros mediante una estructura Type

Por ejemplo:

Option Explicit

' Estructura de dato para el vector


Private Type agenda
nombre As String
apellido As String
cpostal As Integer

End Type

' Declaramos el vector


Dim personas(1 To 3) As agenda

Private Sub Form_Load()

' Llenamos con datos para el elemento 1 del arreglo

personas(1).nombre = "carlos"
personas(1).apellido = "Martínez"
personas(1).cpostal = 1900

' Llenamos con datos para el elemento 2 del arreglo

personas(2).nombre = "Héctor"
personas(2).apellido = "rosales"
personas(2).cpostal = 1898

' Llenamos con datos para el elemento 3 del arreglo

personas(3).nombre = "Albert"
personas(3).apellido = "Einstein"
personas(3).cpostal = 1324

End Sub

Para utilizar una estructura definida por nosotros en vectores o matrices, se hace
de la forma habitual, con la diferencia que debemos declarar el arreglo utilizando
el tipo de dato Type que hayamos creado, en este caso Dim personas(1 to 3) as
agenda

2 - Las matrices

Como se dijo anteriormente, las matrices son arreglos de mas de 1 dimensión (2 o


mas), a diferencia de los vectores que poseen una sola dimensión.

Podemos imaginar una matriz bidimensional ( 2 dimensiones) , como una


cuadrícula con filas y columnas, donde las filas representarían las coordenadas x y
las columnas las coordenadas y.
A una matriz de 3 dimensiones o tridimensional se la puede imaginar con las
coordenadas x, y, z, y esta es ideal para representar figuras en el espacio por
ejemplo.

Las matrices se declaran en el código de manera igual que los vectores, con la
diferencia que debemos indicar mas subíndices de acuerdo a la cantidad de
dimensiones que posea la matriz.

por lo general no se suele utilizar matrices de mas de 3 dimensiones..

2.1 - Ejemplo de matriz de 2 dimensiones

Matriz bidimensionales de 6 x 8 (de 2 dimensiones).

Dim personas (1 to 6, 1 to 8) as string

Si luego quisiera acceder a los datos de la misma basta con referirnos a los
subíndices

Por ejemplo:

personas (1, 1) = "Natalia"


personas (2, 1) = "pedro"
personas (1, 7) = "valeria"
personas (1, 8) = "josé"
personas (2, 2) = "carolina"
personas (4, 1) = "raquel"
personas (6, 2) = "eustaquio"
personas (6, 5) = "maria"
personas (6, 8) = "mariana"

El total de índices posibles para almacenar datos o valores en el ejemplo anterior


es de 48 datos, ya que si multiplicamos 6 x 8 nos da como total 48 valores
posibles para utilizar en la matriz bidimensional.

En este ejemplo creamos una matriz de 3 dimensiones de 3 x 3 x 3

Dim cubo (1 to 3, 1 to 3, 1 to 3) as integer

para acceder a los datos sería exactamente de la misma manera pero debemos
utilizar un índice mas.

Ejemplo:

cubo (1, 1 , 1) = 50
cubo (1, 1 , 2) = 50
cubo (1, 1 , 3) = 50
cubo (1, 2 , 1) = 50
cubo (1, 2 , 2) = 50
cubo (1, 2 , 3) = 50
cubo (1, 3 , 1) = 50
cubo (1, 3 , 2) = 50
cubo (1, 3 , 3) = 50
cubo (2, 1 , 1) = 50
cubo (2, 1 , 2) = 50
cubo (2, 1 , 3) = 50
cubo (2, 2 , 1) = 50
cubo (2, 2 , 2) = 50
cubo (2, 2 , 3) = 50
cubo (2, 3 , 1) = 50
cubo (2, 3 , 2) = 50
cubo (2, 3 , 3) = 50
cubo (3, 1 , 1) = 50
cubo (3, 1 , 2) = 50
cubo (3, 1 , 3) = 50
cubo (3, 2 , 1) = 50
cubo (3, 2 , 2) = 50
cubo (3, 2 , 3) = 50
cubo (3, 3 , 1) = 50
cubo (3, 3 , 2) = 50
cubo (3, 3 , 3) = 50

En el ejemplo anterior, que es un poco extenso, es para que veas todos los
posibles valores que puedes almacenar en una matriz de 3 x 3 x 3, y que da como
resultado un arreglo de 27 valores posibles.

3 - Vectores dinámicos

Hasta ahora habíamos visto solo vectores o arreglos de tamaño fijo, ¿ pero qué
pasa cuando no sabemos el tamaño o el largo de un vector y queremos que sea
variable ?.

Visual basic posee una sentencia o función que nos permite cambiar el largo de un
vector en tiempo de ejecución, dándonos así mas flexibilidad, y de esta manera no
desperdiciar memoria y recursos de la pc creando vectores mas largos de lo que
realmente necesitamos.

Esta función se llama ReDim y ReDim Preserve , y un ejemplo de como aplicarla


sería de la siguiente manera:
3.1 - Ejemplo de vectores y arreglos dinámicos

En lo siguiente, primero declaramos un vector de la forma como lo hacemos


siempre con la diferencia de que en vez de colocar un tamaño declaramos el
vector solo con los paréntesis :

Dim alumnos () as string

Ahora le establecemos un tamaño, por ejemplo de 4 elementos y le agregamos


valores:

ReDim alumnos(1 To 4) As String

alumnos(1) = "Luciano"
alumnos(2) = "Esteban"
alumnos(3) = "Mariano"
alumnos(4) = "Pedro"

Ahora para redimensionar el tamaño del vector por ejemplo a 7 elementos,


utilizamos la función ReDim Preserve, para preservar los 4 valores anteriores y le
agregamos 3 valores mas:

ReDim Preserve alumnos(1 To 7)

alumnos(5) = "Karina"
alumnos(6) = "Raúl"
alumnos(7) = "Romina"

Nota: si utilizamos la sentencia ReDim, o mejor dicho si redimensionamos el


vector sin utilizar la sentencia ReDim preserve, los valores que contenía el vector
anteriormente se perderán

Eliminar o vaciar un vector

Para eliminar un array, arreglo o vector, podemos utilizar Erase, por ejemplo:

Erase Nombre_Del_Vector

4 - Funciones de VB para trabajar con Arreglos - LBound y UBound

Estas funciones son ideales para trabajar con vectores y matrices que han sido
declaradas dinámicamente

Lbound y Ubound nos devuelve un número de tipo Long que nos permite saber el
límite superior e inferior de un vector o una matriz.
4.1 - Ejemplo de Ubound y Bound

Private Sub Form_Load()

'Variables Para almacenar los límites superior e inferior


Dim LimiteInferior As Long
Dim LimiteSuperior As Long

'Declaramos 3 matrices, de una dimensión, _


de dos dimensiones y de 3
Dim UnVector(1 To 520) As Integer
Dim UnaMatriz(20, 5 To 100) As String
Dim OtraMatriz(10, 20, 30) As Long

' Devuelve 1
LimiteInferior = LBound(UnVector)
' Devuelve 520
LimiteSuperior = UBound(UnVector)
' Devuelve 0
LimiteInferior = LBound(UnaMatriz, 1)
' Devuelve 20
LimiteSuperior = UBound(UnaMatriz, 1)
' Devuelve 5
LimiteInferior = LBound(UnaMatriz, 2)
' Devuelve 100
LimiteSuperior = UBound(UnaMatriz, 2)
' Devuelve 0
LimiteInferior = LBound(OtraMatriz, 1)
' Devuelve 10
LimiteSuperior = UBound(OtraMatriz, 1)
' Devuelve 0
LimiteInferior = LBound(OtraMatriz, 2)
' Devuelve 20
LimiteSuperior = UBound(OtraMatriz, 2)

' Devuelve 0
LimiteInferior = LBound(OtraMatriz, 3)
' Devuelve 30
LimiteSuperior = UBound(OtraMatriz, 3)

End Sub
Como habrás visto en los ejemplos anteriores, para conocer los limites superiores
e inferiores en los vectores, solo se debe pasar como parámetro a las funciones
Lbound y Ubound, el nombre del vector con el cual queremos trabajar.

En cambio en las matrices se añade un segundo parámetro en el cual debemos


indicar el número de la dimensión en la cual queremos recuperar los valores.

Ejemplo 2 de LBound y UBound:

Si deseamos recorrer todos los elementos de un vector o una matriz podemos


hacerlo mediante un bucle For de la siguiente manera:

For x = LBound(vector) To UBound(vector)


MsgBox vector(x)
Next i

4.2 - Función Join, Split y Filter :

Visual basic en su sexta versión incorpora estas 3 funciones para trabajar solo
con vectores. Estas funciones están relacionadas con el tratamiento de las
cadenas de caracteres.

Función Join

Esta función se utiliza para unir en una sola variable el conjunto de subcadenas de
un vector. Esta función tiene solo 2 parámetros y es muy fácil de usar. Ejemplo:

Dim micadena as string


Dim vector(1 To 3) As String

vector(1) = "Carlos"
vector(2) = "Pedro"
vector(3) = "Juan"

Ahora ejecutando Join, la variable micadena pasaría a valer "Carlos-Pedro-Juan"

micadena = join (vector, "-")

Nota: En el primer parámetro de la función debemos indicar el vector en el cual


trabajar, y en el segundo se debe indicar un delimitador de caracter para separar
las cadenas. Si no especificamos ninguno, visual basic utilizará por defecto un
espacio vacío o en blanco (" ") para separar cada subcadena .

Función Split:

Esta función hace el trabajo inverso de la función Join.

Split se utiliza para rellenar un vector dinámico que contiene un número de


subcadenas a partir de una cadena que le pasamos como parámetro a la función.

Para aclarar un poco un ejemplo

Private Sub Form_Load()

'Una variable para almacenar una cadena


Dim Micadena As String 'Vector dinámico
Dim Vector() As String

'Le damos un valor a la variable


Micadena = "maria/natalia/romina"

'Ejecutamos la función Split


Vector = Split(Micadena, "/")

'Ahora el vector dinámico pasaría a _


contener los siguientes valores:

Vector(0) = "maría"
Vector(1) = "natalia"
Vector(2) = "Romina"

End Sub

Nota: una cosa importante es que en el vector anterior no se ha declarado un


rango , ya que la función devuelve un vector cuya cantidad de elementos se
ignora, es decir no se conoce.

Enlaces relacionados a split

Pasar un archivo de texto a un array o matriz usando split


Función Filter :

La función Filter se utiliza para filtrar subcadenas de un vector dependiendo de un


determinado criterio de búsqueda. Los parámetros que lleva la función son los
siguientes:

Filter (vector donde buscar, cadena a buscar, valor booleano que indica si
incluir o excluir la cadena)

Ejemplo:

' Vector
Dim Alumnos(1 To 4) As String

' Vector dinámico para almacenar el resultado


Dim Resultado() As String

Alumnos(1) = "Luciano"
Alumnos(2) = "Lucas"
Alumnos(3) = "juan"
Alumnos(4) = "Natalia"

' Ejecutamos Filter

Resultado = Filter(Alumnos, "Lu", True)

' Ahora el vector dinámico "resultado" pasa a contener

MsgBox Resultado(0), vbInformation ' Luciano


MsgBox Resultado(1), vbInformation ' Lucas

5 - Arreglos de controles en visual basic

Hasta acá se vió los aspectos de los vectores y matrices como estructuras que
nos permiten almacenar datos y resolver problemas lógicos en nuestros
programas. Ahora veremos los Arreglos de controles o vectores de controles

Un arreglo de controles es un conjunto de controles, todos de la misma clase


(todos TextBox, todos Label, etc...) que poseen un mismo nombre y cada uno
posee un número de índice que los identifica y los hace únicos con respecto a los
demás, y conformando entonces un vector de controles. por ejemplo en vez de
tener 3 Command, llamados command1, command2 y command3, puedo crear un
arreglo de 3 botones. Estos 3 botones comparten el mismo nombre pero cada
botón se distingue del resto por un número de índice, es decir si por ejemplo
nuestro botón de comando se llama cmd pasaría a tener un cmd(1), un cmd (2) y
un cmd(3).

En un arreglo de controles todos los controles deben ser del mismo tipo y además
no puede haber un control dentro del arreglo que tenga el mismo número de
índice, ya que sería imposible identificarlo en el conjunto, además VB no lo
permitiría y nos mostraría un error.

Las ventajas principales que tenemos cuando trabajamos con un vector de


controles son las siguientes:

1. Todos los controles que forman el arreglo comparten el mismo


procedimiento de código, con lo cual si tenemos muchos controles que
tienen que ejecutar la misma instrucción no debemos escribir código de
más en cada control.
2. Tener 20 cajas de texto, por ejemplo, consumen mucha mas memoria que
utilizar un vector de 20 cajas de texto.
3. Es posible crear controles en tiempo de ejecución, a partir de un arreglo de
controles ya creado.
4. Es mas fácil manipular y establecer las propiedades en un vector de
controles refiriendonos al subíndice de los mismos.

5.1 - Ejemplo para crear un arreglo de controles

Para crear un arreglo de controles podemos hacerlo de 2 maneras.

La primera opción es copiar un control ya dibujado y pegarlo en el formulario.


Luego visual basic nos mostrará un diálogo preguntándonos si queremos crear
una matriz de controles. Al contestar que si, ya se ha creado un arreglo con 2
controles, en este caso el primer control tendrá el índice 0 y el que pegamos el
índice 1. Si queremos seguir agregando mas controles cuando peguemos
nuevamente otro control visual basic no nos preguntará nuevamente si
deseamos crear una matriz del control ya que esta ya está creada, y por lo tanto
agregará un nuevo control y le agregará el número de índice correspondiente
para diferenciarlo del resto, en este caso el 2. Ahora si observas en la
propiedad index de los controles que forman el arreglo verás que estos tienen
un número de índice que antes no tenían al no formar parte de un arreglo de
controles

Nota: cualquier control de visual basic que no tenga un arreglo creado, la


propiedad index de los mismos no tendrá ningún número o valor, ya que esta
propiedad está reservada para los controles que formen parte de un vector o
arreglo.
La otra opción para crear un arreglo, es ingresar directamente el número de
índice en la propiedad index del control del cual queremos crear un arreglo.

Ejemplo:

El ejemplo consiste en crear 10 Arreglos de TextBox y lo que se va a hacer es


mediante un bucle poner la propiedad Enabled de los controles en False, es
decir los vamos a deshabilitar a todos.

Como te darás cuenta, si tuvieses que hacer esto manualmente, es decir


deshabilitar cada TextBox individualmente tendrías que escribir

text1.enabled = False

y así para cada uno de los controles. en cambio haciendo un arreglo de controles,
recorremos mediante un For todos los controles refiriendonos al índice y
estableciéndole la propiedad Enabled en False para deshabilitarlos.

Create un arreglo de 10 TextBox Para eso coloca un text1 en el formulario.


después copialo y pegalo, vb te va a preguntará si quieres hacer un arreglo, decile
que si, hasta que tengas 10 o los que quieras.

Si te fijás ahora en la ventana de propiedades, cuando seleccionas un textBox en


la propiedad index te vas a dar cuenta que poseen un número, ese es el índice
que los identifica, y por medio de ese índice nos vamos a referir en el bucle For

El código de este ejemplo bien simple quedaría así:

Dim i As Integer

For i = 0 To 9

text1(i).Enabled = False

Next

Como puedes ver, le pasamos en el parámetro índice el valor de la variable i para


referirnos a ese text1 en particular y asignarle la propiedad Enabled en False

5.2 - Pasar un arreglo de controles como parámetro


Una tarea habitual es la de poder pasar un arreglo o vector de controles como
parámetro a una Sub o function.

Por ejemplo supongamos que tenemos un programa que tiene muchos


formularios. y varios de esos formularios tienen una función que se encarga de
limpiar todas los textBox y eliminar el contenido de los mismos

Para solucionar esto, y no tener que repetir código, podríamos crear en un módulo
de código, una SubRutina para que la puedan utilizar y acceder desde todos los
formularios.

Para poder pasar un vector como parámetro a una rutina, la variable o argumento
en la Subrutina, debe estar declarada como de tipo Object

Ejemplo

Colocar en un formulario un arreglo de textBox, por ejemplo TextBox1(0),


TextBox1(1) y TextBox1(2)

Colocar un CommandButton para limpiar el contenido de las cajas de texto

Código fuente en el formulario

Option Explicit

Private Sub Command1_Click()


Call Limpiar_TextBox(Text1)
End Sub

' Recibe el vector como parámetro


Sub Limpiar_TextBox(El_TextBox As Object)

Dim i As Integer

For i = 0 To El_TextBox.Count - 1
El_TextBox(i).Text = vbNullString
Next

End Sub

 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.
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 #1


Open "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
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

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.

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

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 Integer


Dim 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 Sub
errSub:
'error
MsgBox "Número de error: " & Err.Number & vbNewLine & _
"Descripción del error: " & Err.Description, vbCritical
End Sub

Private Sub Form_Load()

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)

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 Integer


Dim 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)

'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 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 String

Dim 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 puedes descargar al final
de esta página.

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 * 20
apellido As String * 15
dirección As String * 30
edad As Integer

End Type

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_empleados


nombre As String * 15
apellido As String * 15
dirección As String * 30
edad As Integer
End 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.

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, 258


Get #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, 258


Put #1, , mivariable

Nota: Desde este enlace puedes 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

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")
While archivo <> ""
archivo = Dir
Wend

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.

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 Integer
Dim Array_Dir As Variant
Dim Sub_Dir As String
Dim 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
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 * 20
apellido As String * 20

End Type

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
 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 Long
Dim 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
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"

En esta sección 8 se describen algunos de los principales objetos de visual basic


que permiten trabajar por ejemplo con el portapapeles , datos de nuestra
aplicación, información de la pantalla y fuentes del sistema También se ve el uso
de los menues y menues contextuales

Contenido

 1 - Introducción
 2 - El objeto App
 3 - El objeto screen
 4 - El objeto ClipBoard
 5 - Menues en visual basic
 6 - Los menues de cabecera y submenues
 7 - Agregar elementos en un menú
 8 - Menues contextuales o popup menú
 9 - Ejemplo para crear un menú PopUp
 10 - Enlaces relacionados
1 - Introducción

Estos objetos que tienen sus propiedades y métodos definidos como cualquier otro
objeto, son fundamentales para utilizarlos en tiempo de ejecución, y nos permiten
obtener información y realizar tareas específicas y variadas como por ejemplo:

Trabajar con la pantalla (objeto Screen), obtener datos referentes a nuestra


aplicación ( objeto App), el objeto Clipboard ( para trabajar con el portapapeles de
windows) y algunos otros

2 - El objeto App

El objeto App posee una serie de propiedades para obtener información de


nuestra aplicación

Propiedad Path

Esta propiedad nos devuelve una cadena con la ruta donde se encuentra el
ejecutable de nuestro programa. Esta propiedad es de suma importancia, ya que
nosotros siempre debemos "programar las rutas" de nuestra aplicación de forma
relativa, es decir en donde realmente se encuentre nuestra aplicación, ya que el
usuario puede instalar nuestro programa en un directorio cualquiera y de este
modo si nosotros hemos puesto, por ejemplo de un archivo externo en una ruta
absoluta (por ejemplo "c:\Archivos de programa", puede darse el caso de que la
aplicación no encuentre dicho archivo ya que se ha instalado en otro directorio,
ejecutarse en otra plataforma, etc..

Para resolver estos problemas sobre las referencias a las rutas de archivos,
podemos utilizar el objeto App.path, y lo que hace esta propiedad es devolvernos
el path de nuestra aplicación.

Ejemplo

ruta = App.Path & "\config.dat"


En el ejemplo anterior, si nuestra aplicación contiene un archivo de configuración
del programa, un gráfico o cualquier otro fichero, para poder localizarlo lo hacemos
mediante el objeto App.path mas el archivo que deseamos e interponiéndole la
barra invertida.

Nota: lo que hay que tener en cuenta para que no se produzca un error en tiempo
de ejecución, es que el objeto App.path nos devuelve solo el nombre de directorio
de nuestra aplicación pero sin la barra invertida al final, es decir que si
deseamos por ejemplo hacer referencia a un archivo de nuestra aplicación para
trabajar con él, debemos agregarlo nosotros.

Otro ejemplo podría ser el siguiente, supongamos que tenemos un programa que
carga una imagen en un formulario. Si nosotros hacemos una referencia al archivo
de imagen mediante una ruta absoluta estaremos cometiendo un error, lo correcto
sería

Dim Ruta As String

Ruta = App.Path & "\imagen.gif"

Me.Picture = LoadPicture(Ruta)

Propiedad PrevInstance del objeto App

Esta propiedad se utiliza para comprobar si nuestro programa ya está cargado en


memoria devolviéndonos un valor de tipo boolean, True en caso correcto o False
si no está abierto o cargado en memoria.

La propiedad PervInstance es importante ya que un usuario, por error, puede


abrir mas de una instancia de la aplicación, algo que no tendría mucho sentido
en la mayoría de los casos.

De este modo si se intenta abrir el programa mas de una vez, podemos mostrar un
mensaje informativo y descargar la aplicación mediante la sentencia End, o no
mostrar nada y terminar la ejecución. Este ejemplo muestra un mensaje cuando se
intenta abrir mas de una ves, y luego de aceptar el mensaje se cierra con End
Private Sub Form_Initialize()

If App.PrevInstance = True Then

MsgBox " La aplicación ya se encuentra cargada en memoria", vbInformation

' Finaliza el programa


End

End If

End Sub

Otras propiedades del objeto App

 ExeName: Con ExeName podemos recuperar el nombre del ejecutable de


la aplicación en tiempo de ejecución
 Hinstance: Esta propiedad nos retorna el handle o manipulador de nuestra
aplicación. Mediante esta propiedad y algunas Apis relacionadas con este
tema podemos controlar nuestra algunas cosas
 Taskvisible: es una propiedad de tipo boolean que se utiliza para
determinar si nuestra aplicación aparecerá en la lista de tareas. Esta
propiedad solo funciona si nuestra aplicación tiene la propiedad visible en
false

3 - Objeto Screen

Con el objeto Screen se puede determinar y obtener información sobre las


fuentes instaladas en el sistema operativo, la resolución actual de la pantalla, el
formulario y/o control que está activo,

Un ejemplo para poder obtener la resolución del monitor:


Dim Ancho As Integer
Dim Alto As Integer

Ancho = (Screen.Width / Screen.TwipsPerPixelX)


Alto = (Screen.Height / Screen.TwipsPerPixelY)

MsgBox "La resolución en Pixeles del monitor es de: " & vbNewLine & _
"Ancho: " & Ancho & vbNewLine & _
"Alto: " & Alto, vbInformation

Para obtener el alto y el ancho en pixeles debemos hacer una simple conversión
ya que mediante las propiedades width y height obtenemos el ancho y el alto del
monitor pero expresado en twips, para obtener ese valor en pixeles hay que
dividirlo por la propiedad TwipsPerPixelX y TwipsPerPixelY, que son propiedades
que las podemos acceder desde el objeto Screen

Ejemplo para poder obtener una lista de las fuentes instaladas en el sistema

El objeto screen posee un objeto o colección llamado Fonts que es un vector que
contiene las fuentes del sistema y una propiedad llamada FontCount para saber la
cantidad de fuentes.

Ejemplo para cargar las fuentes del sistema en un control ListBox

Dim La_Fuente As Integer

'Recorre las fuentes


For La_Fuente = 0 To Screen.FontCount - 1

'Añade el nombre de la fuente al control


List1.AddItem Screen.Fonts(La_Fuente)

Next La_Fuente
Mediante 4 líneas de código tenemos un control ListBox que muestra el nombre de
todas las fuentes del sistema.

Nota: Para poder obntener las fuentes pero de una impersora, se realiza igual que
en el paso anterior , con la diferencia que en ves de usar el Objeto Screen, se usa
el Objeto Printer.

Por ejemplo

Colocar un ComboBox en el formulario donde se listarán las impresoras


instaladas, y en agregar un Control ListBox donde agregarán las fuentes

Código fuente en el formulario

Option Explicit
Private Sub Combo1_Click()
Ver_fuentes Combo1.ListIndex
End Sub

Private Sub Form_Load()

Dim ObjPrinter As Printer

' Recorre la lista de impresoras instaladas _


en el sistema y agrega el nombre en el combo
For Each ObjPrinter In Printers
Combo1.AddItem ObjPrinter.DeviceName
Next

End Sub

' Enumera las fuentes en el ListBox de la _


impresora seleccionada en el Combo
Sub Ver_fuentes(Impresora As String)

' Referencia a la impersora


Set Printer = Printers(Impresora)

Dim i As Integer
List1.Clear

' Lista las fuentes soportadas de la impresora


For i = 0 To Printer.FontCount - 1
List1.AddItem Printer.Fonts(i)
Next

End Sub

Enlaces relacionados

Listar las fuentes de windows y previsualizarlas

4 - El objeto ClipBoard

Con ClipBoard podemos trabajar con el portapapeles de windows, ya sea para


establecer o recuperar datos del mismo.

Ejemplo:

Para recuperar el texto guardado en el portapapeles:


Dim cadena As String

cadena = Clipboard.GetText

MsgBox cadena

Con este otro ejemplo podemos grabar o asignar un texto en el portapapeles

Clipboard.SetText "cadena de texto a grabar o variable string"

Con el método Clear del objeto ClipBoard podemos borrar el contenido del
portapapeles (no requiere ningún parámetro)

Clipboard.clear

Con la siguiente línea podemos copiar una imagen del portapapeles a un control
picture, si es que la hay, usando el método Getdata del objeto Clipboard

Picture1.Picture = Clipboard.GetData

Lo siguiente copia una imagen cargada en un control de imagen al portapapeles,


es decir hacer lo contrario:

Clipboard.SetData Picture1.Picture

5 - Menues en visual basic


Ejemplo para crear menúes y menúes contextuales o también llamados menú
PopUp, que son aquellos que se despliegan con el botón derecho del mouse.

Casi todas las aplicaciones por mas pequeñas que sean, poseen un acceso a
determinadas o casi todas las opciones de un programa por medio de un menú.

Si bien las opciones las podemos encontrar en la interface misma de la aplicación,


ya sea por medio de botones, barras de herramientas etc.., nunca está demás que
estén a mano por medio de un menú.

Visual Basic incorpora una herramienta llamada editor de menúes para poder
crearlos

Nota: El editor de Manúes se encuentra en el menú herramientas y solo está


disponible desde la vista diseño del formulario, es decir que si estás visualizando
la ventana de código o un módulo de código deberás cerrarlas y dejar visible el
formulario que estés diseñando para que la opción esté habilitada.

6 - Los menues de cabecera y submenues

Los menúes de cabecera son los menúes principales que contienen otros
submenues. Por ejemplo en el menú del internet explorer, el menú archivo es el
menú de cabecera o de primer nivel, y las opciones internas de este (abrir,
guardar, imprimir, cerrar, etc...) son los submenues que están en un nivel por
debajo del menú archivo.

Crear un menú

1. El primer paso es diseñar un buen diagrama que incluya la mayoría de las


opciones, para que el usuario las pueda tener a mano también en el menú.
2. Si observas otras aplicaciones, estas respetan el orden y ubicación de sus
menues, es decir que si estás creando un programa que tiene opciones
para imprimir una hoja, esta se encontrarán en la sección del menú archivo,
si tienes opciones de edición del documento como cortar copiar, pegar ,
seleccionar todo, etc..., las encontrarás en el menú "edición", si deseas
crear un formulario "acerca de..", lo ubicarás en el menú ayuda con el
"nombre acerca de...". esta forma de diseño y diagramación es fundamental
para que el programa sea estándar y aceptado por todos, por llamarlo de
alguna manera, ya que si bien nosotros recordamos el nombre y donde se
encuentra ubicada cada opción, un usuario o tercero debe resultarle lo mas
sencillo posible el acceso a las opciones del mismo.

7 - Agregar elementos en un menú

El siguiente ejemplo consiste en un formulario que contiene solo un control label


que nos mostrará una leyenda con el texto del menú que seleccionamos o
presionamos.

El menú estará compuesto por 3 menues de cabecera, el primero llamado


"Archivo", el segundo "Edición" y el último "Ayuda". A su vez cada menú tendrá los
siguientes submenues:

1. Archivo : Este menú contendrá los submenues " Abrir ", " Guardar ", "
Imprimir " y " Cerrar "
2. Edición: Contendrá los submenues " Cortar ", " Copiar ", " Pegar ", "
Seleccionar todo "
3. Ayuda : Tendrá los submenues " Ayuda " y " Acerca de.. "
El cuadro de diálogo del editor de menú de visual basic posee los siguientes
campos para rellenar. Algunos son opcionales y otros son obligatorios, como la
propiedad Caption y Name:

 Caption: en este campo debemos colocar la leyenda que mostrará el


menú, es decir el texto que mostrará el mismo.
 Name: en este campo debemos introducir un nombre para cada menú. Este
es obligatorio y no puede estar duplicado ya que por medio de este nombre
identificaremos al menú en el código.
 Index: en este campo que es opcional podemos introducir un número para
formar vectores de menues o arreglos de menues, en este ejemplo no se
usa, por ejemplo para crear menues en forma dinámica en tiempo de
ejecución
 helpcontextid: este campo opcional podemos introducir un n° para el
tópico de ayuda, por si el usuario presiona la tecla F1 justo cuando está
posicionado en el menú.
 Shortcut: Podemos ingresar una tecla de acceso rápido al menú para que
se despliegue el mismo automáticamente, como por ejemplo Ctrl + a, Ctrl +
b, etc...
 Checked: este campo indica si el menú tendrá un tilde a la izquierda o no.
Si está en true lo muestra si está en False no. El campo es de tipo opcional.
 Enabled : propiedad booleana que determina si el menú está habilitado o
no. Esta propiedad es exactamente igual a la propiedad Enabled de
cualquier control de visual basic. El campo por defecto, mejor dicho la
propiedad está en True
 Visible : propiedad opcional y de tipo booleana que determina si el menú
estará visible o no. Esta propiedad es ideal para crear los menues
contextuales o PopUp (mas adelante hay un ejemplo de como crear uno).

Pasos a seguir:

1. Una vez abierto el editor de menú, hay que ingreasar los elementos que
componen el mismo. Para crear el menú "Archivo" que es un menú de
cabecera o de nivel superior, debemos ingresar en la propiedad Caption la
cadena &Archivo.
Ahora le asignaremos un nombre en el campo Name.
G Generalmente se suele utilizar en este campo el mismo nombre del menú
pero con el prefijo mnu para luego poder distinguirlo fácilmente en el
código. Entonces ingresamos en este campo mnuarchivo
2. El segundo paso será ingresar los submenues que están por debajo del
menu archivo. Para ello presionamos el botón "siguiente" donde
ingresaremos el menú "Abrir". como este es un submenú debemos indicarlo
con el botón que tiene una flecha hacia la Derecha. Al presionarlo ahora el
mismo se marca con una doble comilla (""""), para indicarnos que este
menú deriva o está contenido en el menú de cabecera "Archivo". Ahora
pasamos a ingresarle el nombre y la leyenda del menú. En la propiedad
Caption ingresamos &Abrir y en el campo Name : mnuabrir.
3. Ahora repetimos los pasos anteriores para ingresar los submenues
restantes del menú Archivo.
4. Si habrás observado los clásicos menues de las aplicaciones, los
submenues se agrupan en secciones. Por ejemplo en el menú archivo del
internet explorer, el submenú Salir está separado del resto por una línea.
para lograr esto se debe crear un submenú como cualquier otro justo arriba
del menú que queremos que aparezca la línea divisoria, y en la propiedad
caption del mismo le colocamos el caracter menos -
5. Ahora ingresaremos el código para que muestre la leyenda en el control
Label cada vez que presionemos un menú.
6. Como habrás notado, el menú se va incorporando al formulario en tiempo
de diseño como cualquier otro control de visual basic. Para ingresar el
código necesario diremos que cada menú responde a un evento llamado
click y que se dispara cuando presionamos el menú con el mouse o cuando
le damos un enter, para ingresar el código en el menú "Abrir" le damos un
click en el mismo menú desde la ventana de diseño. Una vez abierta la
ventana de código aparecerá una rutina como la siguiente:
Private Sub mnuabrir_click()

End Sub

Ahora dentro del evento Click del menú colocamos lo siguiente para que la
etiqueta muestre la propiedad caption del menu abrir al pulsar sobre el menú

Label1.Caption = mnuarchivo.Caption

Nota: cabe aclarar que estas rutinas las podemos invocar o llamar como cualquier
otra rutina de código , por ejemplo en el caso anterior, por ejemplo si coloco esto
en un botón se llamaría al procedimiento Click del menú y se ejecutaría el código.

Call mnuabrir_click

Esto es útil si tenemos una barra de herramientas, ya que no tendremos que


escribir código 2 veces, y podemos usar un solo procedimiento haciendo una
simple llamada al mismo

8 - Menues contextuales o popup menú

Los menues contextuales, esos que se despliegan cuando presionamos el botón


derecho del mouse, son simples menues pero con la diferencia de que los mismos
poseen la propiedad Visible en False, y luego se visualizan utilizando el método
PopUpMenu

El método PopUpMenu , se encuentra disponible solo para los formularios.

Los parámetros de este método son los siguientes:


Nombreformulario.PopUpMenu "Elmenu", "flags", x , y, opcion

 Menu: este es el menú popup que debe estar en el formulario, es decir el


nombre
 Flags: este parámetro indica la apariencia del menú en el formulario. Acá
podemos utilizar las siguientes constantes para ubicar el menú:
vbpopupmenuleftalign ubica el menú en el lado izquierdo con respecto a
x.
vbpopupmenucentertalign alinea en el centro de la coordenada x.
vbpopupmenurightalign lo alinea en el lado izquierdo. En la mayoría de
los casos este parámetro no se utiliza.
 X e Y: podemos indicar, aunque no se suele utilizar, las posiciones x e y
donde debe desplegarce el menú.
 opcion: en este parámetro opcional , podemos indicar el nombre de un
submenú para que aparezca resaltado en negrita.

Si bien el menú PopUp lo podemos llamar en cualquier momento, lo mas común


es utilizarlo y desplegarlo cuando el usuario presiona el botón derecho sobre un
control, formulario etc...

Sabiendo esto , para desplegarlo por ejemplo cuando el usuario presiona el botón
sobre un área del formulario, podemos utilizar el evento MouseUp o MouseDown
del mismo y consultar la variable Button del procedimiento y mediante una
estructura IF - Then comprobar si el botón que presionamos es el derecho ,
utilizando las constantes VbRightButton, vbLeftButton

9 - Ejemplo para crear un menú PopUp

Crear un menú llamado mnuContextual con la propiedad visible en False y pegar


esta rutina en el formulario:

Private Sub form_mouseup(button As Integer, shift As Integer, x As Single, y As


Single)

' Consultamos si el botón presionado es el derecho


If button = vbRightButton Then
' Depliega el menú PopUP
Me.PopupMenu mnucontextual
End If

End Sub

El siguiente ejemplo es un editor de texto muy simple utilizando un formulario Mdi,


y formularios secundarios o hijos para cada archivo de texto, es decir similar a
como lo hace el Word u otras aplicaciones que utilizan múltiples documentos

 Crear un editor de texto simple utilizando forms mdi


 Enalces relacionados con Mdi

1 - Pasos para crear el ejemplo:

Iniciar un nuevo proyecto Exe, añadir un formulario MDI y dejarlo por defecto con
el nombre Mdi Form1. También agregar un formulario y renombrarlo a
FrmDocumento

Las opciones que tendrá el editor serán:

1. En el menú Archivo: Abrir, Nuevo, guardar , guardar como y salir


2. El menú Edición : Copiar, Cortar, Pegar y seleccionar Todo.

La vista de los menúes quedará similar a los siguientes gráficos:


El menú Archivo:

El menú Edición:

Los nombres de los menues deberán ser los siguientes:

Menú Archivo:

1. Abrir: mnuAbrir
2. Nuevo: mnuNuevo
3. Guardar: mnuGuardar
4. Guardar Como: mnuGuardarComo
5. Salir: mnuSalir

Menú edición

1. Copiar: mnuCopiar
2. Cortar: mnuCortar
3. Pegar: mnuPegar
4. Seleccionar todo: mnuSeleccionar
Nota: si no sabés como crear los menúes con el editor de visual basic, puedes
chequear este enlace que explica resumidamente como crear uno:

Crear menúes en visual basic

Ahora hay que especificar en el formulario Mdi, en la propiedad MdiChild, que se


encuentre en True, para que de esta manera los formularios se abran dentro de
este.

Ahora indicar en el menú Proyectos > Propiedades de proyecto, que el formulario


de inicio sea el MDI, en la opción Objecto inicial.

Luego agregar un control CommonDialog llamado CommonDialog1 en el


formulario Mdi y también otro en el formulario frmDocumento para poder utilizar
los Cuadros de diálogo Abrir Archivo y Guardar como. ( El control
CommonDialog lo accedés desde el menú proyecto, Componentes > Microsoft
Common Dialog Control ).

En el formulario frmDocumento, colocar un control RichTextBox llamado


RichTextBox1 y establecerle a este desde la ventana de propiedades, la
propiedad Multiline en True, La propiedad Scrollbars en 3. ( opara que muestre
Ambas barras de desplazamiento)

Por último colocar un módulo bas al proyecto

Agregar el código fuente a los formularios y al módulo bas

Código fuente a colocar en el Formulario Mdi

Option Explicit

Private Sub MDIForm_Initialize()


CommonDialog1.Filter = "Documento de texto|*.txt|Todos los Archivos|*.*"
End Sub

'Menú abrir
Private Sub mnuAbrir_Click()

On Error GoTo errSub

CommonDialog1.ShowOpen

If CommonDialog1.FileName <> "" Then


Set FrmDoc = New frmDocumento

FrmDoc.Show

ActiveForm.Caption = CommonDialog1.FileName

ActiveForm.RichTextBox1.LoadFile CommonDialog1.FileName

End If
Exit Sub
errSub:

Select Case Err.Number


Case 70
ActiveForm.RichTextBox1.LoadFile CommonDialog1.FileName
Resume Next
End Select

End Sub

'Menu Guardar Como


Private Sub mnuGuarcomo_Click()

On Error GoTo errSub

If Forms.Count = 1 Then
MsgBox "No hay documentos para guardar", vbInformation
Exit Sub
End If

CommonDialog1.ShowSave

If CommonDialog1.FileName = "" Then Exit Sub


ActiveForm.RichTextBox1.SaveFile CommonDialog1.FileName

Exit Sub
errSub:

Select Case Err.Number


Case 91
Resume Next
End Select

End Sub

'Menú para guardar el archivo


Private Sub mnuGuardar_Click()
On Error GoTo errSub

If Forms.Count = 1 Then
MsgBox "No hay documentos para guardar", vbInformation
Exit Sub
End If
If InStr(1, ActiveForm.Caption, sCaption) Then
CommonDialog1.ShowSave
If CommonDialog1.FileName = "" Then Exit Sub
ActiveForm.RichTextBox1.SaveFile CommonDialog1.FileName
Else
ActiveForm.RichTextBox1.SaveFile ActiveForm.Caption

End If

Exit Sub
errSub:

Select Case Err.Number


Case 91
Resume Next
End Select

End Sub

'Menú nuevo archivo


Private Sub mnuNuevo_Click()
Set FrmDoc = New frmDocumento
nForms = nForms + 1
FrmDoc.Caption = sCaption & nForms
FrmDoc.Show
End Sub

'Menú pegar
Private Sub mnuPegar_Click()
On Local Error Resume Next
ActiveForm.RichTextBox1.SelText = Clipboard.GetText
End Sub

'Menú salir
Private Sub mnuSalir_Click()
Set FrmDoc = Nothing
End
End Sub

'Menu para seleccionar todo el texto


Private Sub mnuSeleccionar_Click()
On Local Error Resume Next

ActiveForm.RichTextBox1.SelStart = 0
ActiveForm.RichTextBox1.SelLength = Len(ActiveForm.RichTextBox1.Text)

End Sub

'Menú Copiar texto


Private Sub mnuCopiar_Click()
On Local Error Resume Next
Clipboard.SetText ActiveForm.RichTextBox1.SelText
End Sub

'Menú cortar texto


Private Sub mnuCortar_Click()
On Local Error Resume Next
Clipboard.SetText ActiveForm.RichTextBox1.SelText
ActiveForm.RichTextBox1.SelText = ""
End Sub

Código fuente a colocar en el formulario frmDocumento

Option Explicit

Public flagGuardar As Boolean

Private Sub Form_Resize()


'Redimensionamos el control RichtextBox al ancho y alto del formulario
RichTextBox1.Move ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight
If WindowState = vbMaximized Then
'mdiform1.Caption = Me.Caption
Else
mdiform1.Caption = ""
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)

On Error GoTo errSub


Dim ret As Integer

If flagGuardar Then
ret = MsgBox(" Guardar cambios", vbYesNoCancel)
End If

Select Case ret


Case vbYes:

If InStr(1, Me.Caption, sCaption) Then


CommonDialog1.ShowSave
RichTextBox1.SaveFile CommonDialog1.FileName
Else
RichTextBox1.SaveFile Me.Caption
End If
Case vbCancel:
Exit Sub
End Select

Set FrmDoc = Nothing

Exit sub
errSub:

Select Case Err.Number


Case 75
Resume Next

End Select

End Sub

Private Sub RichTextBox1_Change()


flagGuardar = True
End Sub

Código fuente a colocar en el Módulo bas

Public FrmDoc As frmDocumento


Public nForms As Integer
Public Const sCaption = "Nuevo documento sin título "

En este enlace está el código fuente para descargar del proyecto anterior, que
incluye una barra de herramientas para las opciones ( abrir, guardar etc.. ) y un
cuadro de buscar y reemplazar para los documentos

vista previa del mdi

Descargar notepad con mdi


Nota. Si quieres poder añadir en el menú archivo del formulario Mdi, la lista de los
archivos abiertos recientemente por el programa ( como lo hacen muchas
aplicaciones que utilizan formularios MDI, como por ejemplo el Word, o inicluso el
Visual basic ), puedes ver este ejemplo que graba en el registro de windows las
rutas de los ficheros, y al cargar crea en forma dinámica los menúes en tiempo de
ejecución. Luego al hacer click en el elemento del menú se ejecuta el archivo

Por ejemplo como muestra esta imagen:

Crear lista de archivos recientes en un menú

Relacionados - Recursos vb6

 Ejemplo para minimizar, vista en cascada, Mosaico etc..


 Ocx para colocar una imagen o gráfico en un formulario Mdi
 Tener solo un formulario abierto en un MDI
 Interceptar una tecla con el Api
 Mdi con fichas o pestañas

Sección que explica los aspectos básicos del uso del los métodos gráficos
de Visual basic.

En la parte 1 se explica el uso de Line, para dibujar líneas y rectángulos, el


método Circle para dibujar círculos, y el método Pset y Point para puntos.
En la segunda página: los métodos LoadPicture, PaintPicture, SavePicture y
algunas otras.

 Método Line - líneas y rectángulos


 Método Circle - Círculos, arcos y elipses
 Método Pset y Point
 Función QbColor

1 - Método Line :

Con este método podemos dibujar Líneas y rectángulos en un objeto donde se


permita utilizar dicho método, como por ejemplo en los Formularios, los controles
PictureBox, el objeto Printer.

Los parámetros de Line son:

El_Objeto.Line (X1, Y1) - ( X2, Y2), El_Color, BF

Donde El_Objeto es donde vamos a dibujar.

Los primeros dos parámetros son las coordenadas para X e Y, luego el color de la
línea y por último el parámetro BF al igual que el color, es un parámetro de tipo
opcional, y aquí podemos pasar como valor: B o BF o ningún valor

Si pasamos B, se dibujará un rectángulo sin relleno. Si pasamos BF el rectángulo


tendrá de relleno el color especificado en el parámetro Color. Si no pasamos nada
se dibuja una línea

Ejemplos:
Lo siguiente dibuja una línea de color Azul en el formulario:

Me.ScaleMode = vbPixels
Me.Line (10, 10)-(100, 100), vbBlue

Como se ve en el ejemplo anterior, los valores que tomará y utilizará LINE para las
coordenadas X e Y, serán los establecidos en el ScaleMode del Objeto donde
dibujar, en este caso se colocó en Pixeles ( vbPixels )

Este otro dibuja una línea horizontal y otra vertical a lo ancho y alto del Formulario,
al mover el puntero del mouse. A la primer línea se le aplica el color verde, a la la
línea horizontal el color Rojo, utilizando las constantes de color de vb. ( VbgGreen
y VbRed )
Option Explicit

Private Sub Form_MouseMove(Button As Integer, _


Shift As Integer, _
X As Single, _
Y As Single)

' Limpia el Form


Cls

'Dibuja la línea vertical


Line (X, ScaleTop)-(X, ScaleHeight), vbGreen

'Dibuja la línea Horizontal


Line (Me.ScaleLeft, Y)-(Me.ScaleWidth, Y), vbRed

End Sub

En este otro ejemplo, se dibuja en el formulario, una cantidad x de lineas con


colores aleatorios, utilizando la función Rnd de visual basic para generar el color
aleatorio y para la cantidad de lineas :
colocar un control timer

Código fuente en el formulario

Option Explicit

Private Sub Form_Load()

Form1.BackColor = vbBlack
Form1.ScaleHeight = 100
Form1.ScaleWidth = 100
Timer1.Interval = 500

End Sub

Private Sub Timer1_Timer()


Dim x As Long
Dim x1 As Long, x2 As Long
Dim y1 As Long, y2 As Long

Dim Color As Long

' si el form está minimizado sale


If Form1.WindowState = vbMinimized Then
Exit Sub
End If

' limpia el formulario


Me.Cls
' Int(Rnd * 50) + 1, es la cantidad de lineas
For x = 0 To Int(Rnd * 50) + 1
DoEvents
' valores x e y para la linea actual
x1 = Int(Rnd * 101)
x2 = Int(Rnd * 101)
y1 = Int(Rnd * 101)
y2 = Int(Rnd * 101)
' color aleatorio de 1 a 15 que luego se usa con Qbcolor
Color = Int(Rnd * 15)
' dibuja la linea
Form1.Line (x1, y1)-(x2, y2), QBColor(Color)
Form1.Line (x1, y2)-(x2, y1), QBColor(Color)
Form1.Line (x2, y1)-(x1, y2), QBColor(Color)
Form1.Line (y1, y2)-(x1, x2), QBColor(Color)
Next x
End Sub

Este código dibuja lineas, como si fuese un lapiz, es deicir al mantener presionado
el mouse en el formulario:

Option Explicit

Dim Flag As Boolean

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _


X As Single, Y As Single)
'Establece el CurrentX y el CurrentY
CurrentX = X
CurrentY = Y

Flag = True
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _


X As Single, Y As Single)
If Flag = False Then
Exit Sub
End If
'Dibuja la linea
Line -(X, Y)
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, _


X As Single, Y As Single)
Flag = False
End Sub

Lo siguiente dibuja un rectángulo sin relleno de color Rojo, pasándole la B como


parámetro al método Line

Me.ScaleMode = vbPixels

Me.Line (10, 10)-(100, 100), vbRed, B

Ahora, en ves de especificar B, se indica el valor BF para rellenar el rectángulo :

Me.ScaleMode = vbPixels

Me.Line (10, 10)-(100, 100), vbRed, BF


Cuando se dibujan rectángulos, es decir se utiliza B o BF, X1 , Y1, X2 e Y2 sería
equivalente a :

El_Objeto.Line (Izquierda, Arriba) - (Ancho, Alto).

El siguiente ejemplo dibuja una línea vertical de color verde una al lado de la otra
en todo el ancho del formulario, en un bucle:

Private Sub Form_Paint()


Me.ScaleMode = vbPixels

For i = 0 To Me.ScaleWidth Step 10

Line (i, 10)-(i, Me.ScaleHeight - 10), vbGreen

Next

End Sub

Propiedad CurrentX y CurrentY


CurrentX devuelve o establece las coordenadas horizontales para el siguiente
método de dibujo. CurrentY devuelve o establece las coordenadas verticales para
el siguiente método de dibujo, en este caso para el método Line.

Lo siguiente, dibuja al presionar un Command1, un rectángulo de 25 pixeles de


ancho por 50 pixeles de alto. Y la posición izquierda y la posición superior (x1 e
y1), es decir el CurrentX y el CurrentY, se puede ver como no cambian su valor, y
se mantienen igual. Es decir, la primera ves que se presiona para dibujar el primer
rectángulo, Currentx y Currenty valen 0. Luego la segunda ves, Currentx tiene el
valor 25 y Currenty el valor 50. si se sigue presionando el Command1, mientras no
se cambie explicitamente el valor , currentx y Currenty mantendrán dichos valores,
x2 e y2.

Private Sub Command1_Click()

Me.Line (CurrentX, CurrentY)-(25, 50), vbRed, B


MsgBox "Pos x: " & CurrentX
MsgBox "Pos y: " & CurrentY

End Sub

Private Sub Form_Load()


Me.ScaleMode = vbPixels
End Sub

Siguiendo el ejemplo anterior, si quisieramos que las coordenadas x2 e y2 sean


relativas a x1 e y1, podemos utilizar la palabra reservada Step.

Este código es exactamente igual al anterior, con la diferencia de que se utiliza


Step para especificar el Currentx y el Currenty para que x2 e y2 sea relativo a x1 e
y1, el resultado sería esto:
Este es igual al anterior pero la posición Superior (y1) es fija, y lo que se desplaza
es la posición horizontal, es decir el CurrentX, y cada ves que se presione el
Command1 , el Currentx (la posición izq ) se incrementará de 25 en 25 pixeles.

Private Sub Command1_Click()

Me.Line (CurrentX, 20)-Step(25, 50), vbRed, B

End Sub

Private Sub Form_Load()


Me.ScaleMode = vbPixels

End Sub

También se podría haber hecho lo mismo sin utilizar Step:

Private Sub Command1_Click()

Me.Line (CurrentX, 0)-(CurrentX + 25, 50), vbRed, B

End Sub

Private Sub Form_Load()

ScaleMode = vbPixels

End Sub

Este otro ejemplo, dibuja un cuadrado uno al lado del otro , a lo ancho del
formulario, el rectángulo es de 10 pixeles de ancho por 10 pixeles de alto, y cada
cuadrado está separado por 5 pixeles ente uno y otro.

Private Sub Form_Load()


Dim Izquierda As Single

Me.ScaleMode = vbPixels
Me.AutoRedraw = True
For Izquierda = 0 To Me.ScaleWidth Step 15
Me.Line (Izquierda, 10)-Step(10, 10), vbBlue, B
Next

End Sub

Este otro dibuja rectángulos de 25 x 25 pixeles uno al lado del otro, en todo el
formulario mediante dos bucles For. El primer bucle es para los rectángulos
horizontales y el otro para los verticales.

Private Sub Command1_Click()

Me.Cls

For Horizontal = 0 To ScaleWidth Step 30

For vertical = 0 To ScaleHeight Step 30


Line (Horizontal, vertical)-Step(25, 25), &H808080, B

Next

Next

End Sub

Private Sub Form_Load()

Me.ScaleMode = vbPixels

End Sub

Dibujar cuadrícula

Lo siguiente dibuja una cuadríacula mediante el método Line en el objeto indicado,


puede ser un picturebox o formulario, indicando la cantidad de cuadros para la
forma horizontal y la cantidad para el vertical.

Código fuente en el formulario

Option Explicit

Sub Dibujar_cuadricula( _
Objeto As Object, _
CountX As Single, _
CountY As Single, _
Optional x_Color As Long = vbBlack, _
Optional y_Color As Long = vbBlack)
Dim i As Integer
Dim mx As Long
Dim my As Long

' limpiar objeto


Objeto.Cls

mx = CLng(Objeto.ScaleWidth / CountX)
my = CLng(Objeto.ScaleHeight / CountY)

' cambiar color del lápiz


Objeto.ForeColor = x_Color

' dibujar las líneas verticales de la cuadricula


For i = 0 To CountX
Objeto.Line (i * mx, 0)-(i * mx, Objeto.ScaleHeight)
Next i

Objeto.ForeColor = y_Color

' dibujar las líneas horizontales de la cuadricula


For i = 0 To CountY
Objeto.Line (0, i * my)-(Objeto.ScaleWidth, i * my)
Next i

End Sub

Private Sub Form_Load()

With Me
.BackColor = vbWhite
.ForeColor = vbBlue
.FontSize = 12

.AutoRedraw = True

End With

Call Dibujar_cuadricula(Me, 25, 25, vbBlue, vbRed)


'Call Dibujar_cuadricula(Me, 5, 10, vbBlue, vbRed)
'Call Dibujar_cuadricula(Me, 25, 50, vbBlue, vbRed)

End Sub
Propiedad DrawWidth

Para establecer el grosor de la línea de dibujo se utiliza la propiedad DrawWidth.

Este ejemplo dibuja líneas una al lado de la otra, separadas por 20 pixeles,
mediante un bucle y va incrementando el DrawWidth en 1 en cada pasada. El
dibujo se realiza en un control PictureBox llamado Picture1

Private Sub Command1_Click()

Picture1.Cls
Picture1.ScaleMode = vbPixels

For i = 0 To ScaleWidth Step 25

Picture1.Line (i, 10)-(i, Picture1.ScaleHeight - 10), vbGreen

Picture1.DrawWidth = Picture1.DrawWidth + 1

Next

Picture1.DrawWidth = 1

End Sub
Este otro ejemplo dibuja un borde y un degradado en un formulario utilizando el
método Line, como muestra la siguiente captura:

Para crear le ejemlo colocar la propiedad BorderStyle del formulario en 0 - None, y


pegar el siguiente código:

Private Sub Form_Load()


With Me

'Algunas propiedades del formulario


.AutoRedraw = True
.ScaleMode = 3
.FontSize = 16
.ForeColor = &HC0FFFF

End With
End Sub

Private Sub Form_Resize()

'Esto dibuja el degradado al formulario


Degradado Me

'Esto dibuja el borde al formulario


Call Dibujar_Borde
End Sub

Sub Dibujar_Borde()
Me.DrawStyle = 0
Me.DrawWidth = 10
Line (0, 0)-(ScaleWidth - 1, ScaleHeight - 1), &HFFC0C0, B
End Sub

Sub Degradado(vForm As Form)

Dim intContador As Integer

vForm.DrawStyle = vbInsideSolid
vForm.DrawWidth = 2
'vForm.ScaleHeight = 256

For intContador = 0 To 255


vForm.Line (0, intContador)-(Screen.Width, _
intContador - 1), _
RGB(0, 0, 255 - intContador), B
Next

Me.CurrentX = 20
Me.CurrentY = 20
Me.Print " Ejemplo para dibujar un borde a un formulario "

End Sub

2 - Método Circle

El método Circle permite dibujar un círculo, una elipse o un arco sobre un objeto.

La sintaxis del método es la siguiente:

EL_Objeto.Circle (Step As Integer, X As Single, Y As Single, Radius As Single,


Color As Long, Start As Single, End As Single, Aspect As Single)
Los valores para X e Y especifican el punto donde estará el centro del círculo a
dibujar.

Radius es el valor del radio del mismo. El parámetro es obligatorio.

Color: Valor que indica el color que tendrá el círculo o elipse para su contorno. Se
puede pasar cualquier valor admitido en visual basic, por ejemplo un Long, un
valor Rgb etc..

Los parámetros Start y End son opcionales , y se utilizan para dibujar parte de una
elipse o círculo

Por último el parámetro Aspect, se utiliza para definir el aspecto del círculo. Este
valor es opcional. Ver ejemplos mas abajo.

El siguiente ejemplo crea un círculo en el centro de un control PictureBox, con un


radio de 50 pixeles.

Private Sub Command1_Click()

Picture1.Cls

With Picture1

Picture1.Circle (.ScaleWidth / 2, .ScaleHeight / 2), _


50, _
vbBlue

End With

End Sub

Private Sub Form_Load()

Picture1.ScaleMode = vbPixels

End Sub
Este ejemplo dibuja un círculo con un radio aleatorio entre 10 y 100 pixeles, al
hacer click en el formulario, es decir el centro del círculo ( x1 e y1 ), son los
valores x e y del evento MouseDown del Form:

Private Sub Form_Load()

ScaleMode = vbPixels
Me.DrawWidth = 2

End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _


X As Single, Y As Single)

Circle (X, Y), Int((100 - 10 + 1) * Rnd + 10), vbRed

End Sub

Rellenar las circunferencias

Para esto se utiliza las propiedades FillColor y FillStyle. FillColor es el color de


relleno, para FillStyle ver las opciones de estilos para los rellenos: 0 - Sólido, 1 -
transparente, 2 - Línea Horizontal, 3 - Línea Vertical etc..

Un ejemplo: este es igual al anterior, pero rellena el círculo de un color aleatorio,


siempre y cuando la propiedad FillStyle no sea transparente:

Colocar un Command1 y un Combo1 en el formulario:


Private Sub Combo1_Click()
Me.FillStyle = Combo1.ListIndex
End Sub

Private Sub Command1_Click()


Me.Cls
End Sub

Private Sub Form_Load()

ScaleMode = vbPixels
'Grosor de la línea
Me.DrawWidth = 2

'Opciones de estilo de relleno


With Combo1
.AddItem " 0 - Solido "
.AddItem " 1 - Transparente "
.AddItem " 2 - Linea Horizontal "
.AddItem " 3 - Linea Vertical "
.AddItem " 4 - Diagonal Arriba "
.AddItem " 5 - Diagonal Abajo "
.AddItem " 6 - Cross "
.AddItem " 7 - Diagonal Cross "
End With

Command1.Caption = "Limpiar"
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _


X As Single, Y As Single)
'color de relleno aleatorio
Me.FillColor = RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd))

'Dibuja el círculo
Circle (X, Y), Int((50 - 10 + 1) * Rnd + 10), _
RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd))

End Sub

Dibujar Elipses

Para dibujar Elipses se debe especificar en el parámetro Aspecto los siguientes


valores. Por ejemplo si pasamos un 1, el círculo será una circunferencia perfecta,
si pasamos 0.5 , el radio horizontal del mismo será el doble que el radio vertical, si
pasamos un 2 lo contrario.

Para el ejemplo del gráfico, colocar un Combo1 y este código en el Form:

Private Sub Form_Load()


ScaleMode = vbPixels
'Grosor de la linea
Me.DrawWidth = 2

For i = 0.1 To 2.1 Step 0.1

Combo1.AddItem i

Next
Combo1 = Combo1.List(0)
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _


X As Single, Y As Single)

Circle (X, Y), Int((50 - 10 + 1) * Rnd + 10), _


RGB(Int(255 * Rnd), Int(255 * Rnd), Int(255 * Rnd)), , , CSng(Combo1)

End Sub

3 - Método Point y método Pset :

El método Point lo que hace es devolver , como un número entero ( un Long ), el


color RGB del punto que se le especifique, puede ser utilizado tanto en un
Formulario como en un PictureBox.

El método Pset establece un color determinado para un punto de un objeto.

El siguiente ejemplo utiliza los dos métodos.

Cargar un gráfico en un Picture1 y también colocar un Picture2. Al hacer click en el


Picture1, en el evento MouseDown, se obtendrá el color de ese pixel, y ese valor
se le aplicará al BackColor del Picture2, como se ve en el gráfico, el punto verde
es el establecido con el método Pset.
Private Sub Form_Load()

'Modo de escala en pixeles


Picture2.ScaleMode = vbPixels
Picture1.ScaleMode = vbPixels

'Grosor del punto


Picture1.DrawWidth = 3

End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, _


X As Single, Y As Single)

Picture1.Cls

' Establece el color del Picture2 mediante el método Point


Picture2.BackColor = Picture1.Point(X, Y)

' Dibuja el punto


Picture1.PSet (X, Y), vbGreen

'Valor Hexadecimal del color


Me.Caption = "Valor del color: " & Hex(Picture2.BackColor)

End Sub
Nota: la forma y variaciones en las que se dibuja el punto u otras figuras mediante
los métodos gráficos, dependen de las propiedades DrawStyle y DrawMode del
objeto.

Este es otro ejemplo que utiliza Pset para dibujar un punto al presionar en el
formulario, tomando como valores el x e y del evento MouseDown del Form, luego
se dibuja una línea desde un punto hacia el otro punto mediante el método Line

Código fuente

Dim X1 As Single
Dim Y1 As Single

Private Sub Form_Load()


AutoRedraw = True
End Sub

Private Sub Form_MouseDown(Button As Integer, _


Shift As Integer, _
X As Single, _
Y As Single)

DrawWidth = 10

'Dibuja el punto con Pset pasandole el x e y donde se hizo click


PSet (X, Y), vbBlack
If X1 <> 0 And Y1 <> 0 Then
DrawWidth = 3
'Dibuja la linea
Line (X1, Y1)-(X, Y), vbWhite
End If

X1 = X
Y1 = Y

End Sub

Este otro ejemplo dibuja puntos en el formulario en forma aleatoria

Colocarle al formulario la propiedad WindowState en Maximized y tambie´n


agregar un control CommandButton

Código fuente en el formulario

Dim Tiempo As Long

Private Sub Command1_Click()

' dibuja los puntos en el formulario


Call Dibujar_Puntos(vbBlue)

' dibuja los puntos en el formulario


Call Dibujar_Puntos(vbButtonFace)

End

End Sub

Function Dibujar_Puntos(Color As Long)


Dim Posicion_X
Dim Posicion_Y

Tiempo = Timer + 5
While Tiempo >= Timer
' valores para la posición x e y
Posicion_X = Rnd * ScaleWidth
Posicion_Y = Rnd * ScaleHeight
' Dibuja el punto en la coordenada y con el color indicado con Pset
PSet (Posicion_X, Posicion_Y), Color
DoEvents
Wend

End Function

Private Sub Form_Load()


' modo de escala en pixeles y grosor del lapiz para el formulario
ScaleMode = 5
DrawWidth = 10

End Sub

4 - Función QBColor:

Definición de la función QBColor de Visual basic:

Esta función devuelve el código de color RGB de un número de color especificado


de una lista de colores estándar predefinidos

Es decir, esta función tiene como parámetro, un número entre el 0 y 15, es decir
16 valores posibles para retornar un color especifico.

El siguiente ejemplo, muestra el uso de esta función. Lo que hace es recorer en un


bucle, desde el 0 hasta el 15, y le cambia el BackColor a un arreglo de controles
Label.

Colocar una matriz de Label1. Label1 (0), Label1(1) .... hasta el Label1(15)

Private Sub Form_Load()


Me.Caption = " Ejemlpo de la función QBColor"

Dim i As Integer

For i = 0 To 15
' Asigna el color devuelto por la función QBColor _
al color de fondo del Label
Label1(i).BackColor = QBColor(i)

' Asigna el caption


Label1(i).Caption = " Valor de QBColor: >> " & i
Next i

End Sub

Al ejecutar el formulario se verá algo por el estilo:


Nota: cualquier valor que no esté entre el 0 y el 15, producirá error.

Sección que explica los aspectos básicos del uso del los métodos PaintPicture,
LoadPicture y SavePicture de visual basic , que permiten leer , guardar , dibujar y
copiar gráficos e imágenes

 Función LoadPicture
 Función SavePicture
 Método PaintPicture
1 - Función LoadPicture :

Esta función se utiliza para cargar una imagen o gráfico en un control Form,
PictureBox o Image.

Esta función requiere como parámetro obligatorio, el path del archivo de imagen a
cargar en el objeto.

Por ejemplo lo siguiente carga un gráfico en un control PictureBox:

Picture1.Picture = LoadPicture("c:\archivo.bmp")

Lo mismo sería para un control Image o Formulario, o cualquier objeto que soporte
la carga de un archivo de imagen de formato compatible a las que soporta Visual
basic ( BMP, JPG, GIF, WMF, algunos ICO etc..) , no así los archivos PNG o TIFF
por ejemplo, ya para estos últimos habría que utilizar el Api de windows o algún
componente externo, para poder leerlos.

Nota: En este enlace hay un Módulo de clase que permite visualizar gráficos e
imágenes de tipo PNG

Para cargar en un control Image:

Image1.Picture = LoadPicture("c:\archivo.bmp")

Para cargar en un Form:


El_Formulario.Picture = LoadPicture( La ruta)

También hay otras propiedades de algunos controles, que requieren por lo general
el uso de esta función para cargar un archivo gráfico a dicha propiedad, como es
el caso de:

La propiedad Icon de los formularios. La propiedad MouseIcon para establecer un


icono personalizado al mouse. La propiedad DragIcon que permite establecer el
icono que se va a mostrar como puntero en una operación de arrastrar y colocar, y
algunas otras.

lo siguiente establece un archivo de ícono al puntero del Mouse para el formulario:

Me.MousePointer = vbCustom

Me.MouseIcon = LoadPicture(La_Ruta_Del_Icono)

Para establecer el ícono en un control TextBox:

Text1.MousePointer = vbCustom

Text1.MouseIcon = LoadPicture(La_Ruta_Del_Icono)

Además de los controles, se pueden cargar archivos con la función LoadPicture,


por ejemplo en los siguientes tipos de variables: IPictureDisp, Picture stdPicture.

Aclarar que al cargar un gráfico en la variable, se debe establecer con la


instrucción Set, por ejemplo:

Dim La_Imagen As Picture

Set La_Imagen = LoadPicture("c:\windows\plumas.bmp")

Picture1.Picture = La_Imagen
Lo anterior carga en el la variable " La_Imagen " el archivo gráfico, y luego se
puede pasar dicha variable a un objeto que tenga la propiedad Picture, en este
caso se paso un control Picture1.

Para eliminar de la memoria la variable, se utiliza el valor Nothing también con la


instrucción Set , por ejemplo:

If Not La_Imagen Is Nothing Then


'Descarga la variable de la memoria
Set La_Imagen = Nothing
End If

Capturar el error 53.

Cuando cargamos un archivo con la función, y el path del archivo no existe, es


decir que no se encuentra el fichero, se produce el error 53.

Un ejemplo para capturar el error:

On Error GoTo errSub


Picture1.Picture = LoadPicture(Ruta)

Exit Sub

'Error
errSub:

If Err.Number = 53 Then
MsgBox "No se puede cargar el archivo, verifique la ruta", vbCritical
End If

2 - Método SavePicture:

Este método lo que hace es guarda en un archivo en disco, un gráfico cargado en


un control Form, PictureBox o un control Image.

Este posee dos parámetros, uno que especifica el Objeto Picture, y otro la ruta del
archivo a generar

Savepicture Picture As IPictureDisp,FileName as String

Su uso es muy simple. A continuación una serie de ejemplos:

Esto lo que es cargar en un control Image, un gráfico del disco, y luego mediante
otro botón, utilizando un control CommonDialog, guarda el archivo cargado en el
Image en la ruta especificada:

Colocar un Control CommonDialog1, un control Image1 y dos controles


CommandButton, Command1 y Command2:
Código en el formulario:

'Botón que carga el el archivo de imagen en el control Image

Private Sub Command1_Click()


On Error GoTo errSub

With CommonDialog1

.DialogTitle = "Seleccionar un archivo"


.Filter = "Archivos BMP|*.bmp|Archivos JPG|*.bmp|Todos|*.*"

.ShowOpen

If .FileName = "" Then Exit Sub

Image1.Picture = LoadPicture(.FileName)

End With

Exit Sub

'Error
errSub:

If Err.Number = 53 Then
MsgBox "No se puede cargar dicho archivo, verifique la ruta", vbCritical
End If
End Sub
'Botón que guarda el contenido del control Image en un nuevo archivo

Private Sub Command2_Click()


With CommonDialog1

.DialogTitle = "Guardar el archivo"


.Filter = "Todos los Archivos|*.*"

.ShowSave

If .FileName = "" Then


MsgBox "No se especificó ningún nombre", vbCritical
End If

If Image1.Picture <> 0 Then


SavePicture Image1.Picture, .FileName
Else
MsgBox "No hay un gráfico cargado para poder guardar", vbExclamation
End If
End With

End Sub

Private Sub Form_Load()


Command1.Caption = "Abrir"
Command2.Caption = "Guardar"
End Sub

Este otro ejemplo, guarda el contenido del portapapeles de windows, en un nuevo


archivo de tipo BMP.

Nota, debe haber una imagen válida en el ClipBoard, si no dará error. Para probar,
se puede copiar al portapapeles la imagen de la pantalla presionando la tecla Print
Screen, y luego ejecutar el siguiente código para generar el archivo

If Clipboard.GetFormat(vbCFBitmap) = True Then

'Guarda la imagen
SavePicture Clipboard.GetData(vbCFBitmap), "c:\Archivo.BMP"

Else

'Error: no coincide el Formato

MsgBox "La imagen del portapales no es válida", vbCritical, "No se pudo


guardar"

End If

3 - El Método PaintPicture de Visual basic

La definición de este método es la siguiente:

El método PaintPicture permite dibujar el contenido de un archivo de gráficos en


un Formulario, en un PictureBox o un objeto Printer.

La sintáxis del método es la siguiente:

El_objeto.PaintPicture La_Imagen, x1, y1, Ancho1, Alto1, x2, y2, Ancho2, Alto2,
Opecode

El_Objeto:

Es como se comentó, donde vamos a dibujar el gráfico, puede ser un form, un


picture o en el objeto Printer

La_Imagen
Este parámetro es de tipo StdPicture, y es la imagen a dibujar. Los formatos
pueden ser un archivo Gif, Bmp, Jpg, Wmf, Dib, Ico . Esta imagen puede estar
cargada en un control, por ejemplo en un Picture, Form, Image, o también en una
variable de tipo StdPicture, IpictureDisp o de tipo Picture. Ver mas adelante un
ejemplo de esto último de como utilizar gráficos cargados en variables

X1 e y1:

Son las coordenadas de destino, es decir la posición Izquierda y Arriba ( Left - Top
), donde se presentará la imagen a dibujar en el objeto destino

Ancho1 y Alto1:

Estos parámetros especifican el ancho y alto que tendrá la imagen a dibujar. Estos
parámetros son opcionales, y si se omiten, la imagen se dibujará en el objeto con
las dimensiones que tenga.

x2 e y2 :

Son las coordenadas a tomar en la imagen, es decir es la zona de recorte de la


misma. Con estos parámetros podemos copiar un trozo del gráfico, si se omite, ya
que es opcional, se toma la imagen completa.

Ancho1 y Ancho2:

Al igual que x2 e y2 son opcionales, y determinan el ancho y alto de la imagen en


el objeto destino

Ejemplos:

Cargar en un control PictureBox un gráfico. Luego al presionar un command1, se


copiará la imagen del Picture en el formulario.
El código del CommandButton sería:

Private Sub Command1_Click()


'Copia el gráfico en el formulario
Me.PaintPicture Picture1.Picture, 0, 0
End Sub

Como se ve en el código, indicamos que copie la imagen del picture1 en el


formulario, es decir en el primer parámetro le pasamos la propiedad Picture del
control. Luego, se indica la posición izquierda y Arriba ( Left - Top ) en el objeto
destino, en este caso el Form. Los demás parámetros son opcionales, y como en
este caso se omitieron, la imagen se copiará con las dimensiones que tenga, es
decir una copia exacta.

Si en cambio en ves de especificar 0 para x y 0 para y, le especificaríamos 500, y


500, el resultado sería el siguiente:
Importante. Los valores para las dimensiones y posiciones del método
PaintPicture, ya sea para las coordenadas x1, y1, ancho1, alto1, ancho2 y alto2,
depende de la propiedad ScaleMode del objeto destino. En el ejemplo anterior, se
asume que se copió en la posición izquierda y Top, usando Twips como medida,
por lo que si haces la prueba y cambias la propiedad ScaleMode del formulario,
por ejemplo a vbPixels, la imagen se copiará tomando dicho modo de escala, es
decir en pixeles. Lo mas común, es trabajar con pixeles, es mas cómodo.

Ejemplo 2:

Este ejemplo es igual al anterior, pero se utilizarán cuatro controles TextBox para
indicar la posición x1, y1, ancho1 y ancho2.
Nota: el código no tiene una rutina de error para comprobar que algunos valores
sean correctos, es decir si por ejemplo colocamos un valor que no sea numérico,
dará error. también se producirá un error en tiempo de ejecución , si pasamos a
PaintPicture, en Ancho1 y Alto1, el valor 0

Código fuente en el formulario:

Private Sub Command1_Click()

'Limpia el contenido del formulario


Me.Cls

'Copia el gráfico en el formulario con los valores


Me.PaintPicture Picture1.Picture, CSng(Text1), _
CSng(Text2), _
CSng(Text3), _
CSng(Text4)
End Sub

Private Sub Form_Load()


' Modo de escala del formulario en pixeles
Me.ScaleMode = vbPixels
End Sub
Ejemplo 3

Lo siguiente copia el gráfico cargado en un PictureBox llamado Pic_Origen, a otro


PictureBox llamado Pic_Destino.

Private Sub Command1_Click()

'Copia el gráfico con el ancho y alto que tenga _


Pic_Destino
Pic_Destino.PaintPicture Pic_Origen, 0, 0, _
Pic_Destino.ScaleWidth, _
Pic_Destino.ScaleHeight

End Sub

Como se ve, en los parámetros que especifican el alto y ancho, se pasó las
dimensiones que tenga Pic_destino, ( ScaleWidth y ScaleHeight )

Ejemplo 4 - Dibujar con PaintPicture un gráfico centrado


Para dibujar una imagen centrada, por ejemplo en un formulario, podemos cargar
la misma en una variable, como se comentó antes, que sea de tipo Picture,
IpictureDisp o StdPicture, y luego pasarla como parámetro a PaintPicture, y en los
parámetros X1 e Y1 ( posición Left y Top ) lo siguiente :

'Variable de tipo Picture para cargar mediante LoadPicture en _


tiempo de ejecución un gráfico
Dim Una_Imagen As Picture

Private Sub Command1_Click()

Dim Pos_x As Single


Dim Pos_y As Single

'Limpia el formulario
Me.Cls

'Carga en la variable la imagen


Set Una_Imagen = LoadPicture("c:\bart.jpg")

' Obtiene la posición x e y para centrar la imagen


Pos_x = (Me.ScaleWidth - ScaleX(Una_Imagen.Width, vbHimetric, vbPixels)) / 2
Pos_y = (Me.ScaleHeight - ScaleY(Una_Imagen.Height, vbHimetric, vbPixels)) / 2

' Dibuja el gráfico centrado en el formulario


Me.PaintPicture Una_Imagen, Pos_x, Pos_y

End Sub

Private Sub Form_Load()


' Modo de escala en pixeles
Me.ScaleMode = vbPixels
Me.Caption = " Dibujar imagen centrada "
End Sub

Private Sub Form_Unload(Cancel As Integer)


'Elimina la imagen/Variable
If Not Una_Imagen Is Nothing Then Set Una_Imagen = Nothing
End Sub
El resultado al presionar el commandButton sería algo por el estilo:

En el código anterior, se declara una variable de tipo Picture para almacenar el


gráfico mediante la función LoadPicture. Pero como es una variable de objeto, se
debe utilizar la palabra clave Set.

También como se comentó, el gráfico a cargar debe ser un formato de imagen de


los que soporta visual basic: bmp, gif, jpg etc... , no asi los Png o los tif por decir
algunos.

Luego en Pos_x y Pos_y se calcula el centro del formulario, restando al ancho del
form, el ancho de la imagen dividido por 2

Nota: La propiedad Width y Height de la imagen, no devuelve un valor en pixeles,


si no en una medida llamada Himetric. Por ese motivo se utiliza la función Scalex y
Scaley para convertir el valor de dicha escala a pixeles, ya que en el FormLoad se
estableció el modo de escala del Formulario, que en este caso es donde se va a
dibujar, en vbPixels. Aclaro que no se si es la única forma de convertir esto, pero
al menos es la que conozco.

Ejemplo 5 - Recortar y estirar una imagen - Parámetros X2, y2 , Ancho2 y


Alto2
Ahora se ve un ejemplo para ver estos parámetros opcionales que no se vieron en
los ejemplos anteriores, y que los mismos permiten seleccionar partes de la
imagen a copiar en el objeto destino, es decir un área específica. Si no se
entiende demasiado, seguro viendo la siguiente imagen se aclara un poco el tema:

Para el ejemplo colocar un Picture llamado Pic_Origen y cargarle un gráfico.


Agregar otro PictureBox llamado Pic_Destino. También Cuatro TextBox en un
arreglo:

Text1(0), Text1(1), Text1(2) y Text1(3), para la posición x, posición y, para el


ancho ancho y alto respectivamente.

Estos valores serán en pixeles, y esos mismos valores se utilizarán para la función
PaintPicture para dibujar dicha área

Código fuente en el formulario:

Option Explicit
Private Sub Dibujar_Imagen(x As Single, y As Single, _
ancho As Single, alto As Single)

' Limpia - Borra los dos picture


Pic_Destino.Cls
Pic_Origen.Cls

'dibuja el cuadrado en el Picture Origen


Pic_Origen.Line (x, y)-Step(ancho, alto), vbRed, B

'Dibuja la porción de imagen en Pic_Destino


Pic_Destino.PaintPicture Pic_Origen.Picture, 0, 0, , , x, _
y, _
ancho, _
alto

End Sub

Private Sub Form_Load()

' Escala en pixeles para los dos Picture Box

Pic_Destino.ScaleMode = vbPixels
Pic_Origen.ScaleMode = vbPixels

'Para que al dibujar con Line y PaintPicture mantenga la imagen


Pic_Origen.AutoRedraw = True
Pic_Destino.AutoRedraw = True

'algunos valores iniciales


Text1(0) = 10
Text1(1) = 10
Text1(2) = 50
Text1(3) = 50

End Sub

Private Sub Text1_Change(Index As Integer)

On Local Error Resume Next


'Llama a la sub que dibuja con PaintPicture
Call Dibujar_Imagen(CSng(Text1(0)), _
CSng(Text1(1)), _
CSng(Text1(2)), _
CSng(Text1(3)))

End Sub

El ejemplo anterior, al colocar valores en los TextBox para los ejes x e y, el ancho
y alto, se dibuja mediante el método Line el recuadro ( área ) en el picture origen,
luego se le pasan esos mismos valores a la función PaintPicture que dibuja esa
porción de imagen en el otro PictureBox

Ejemplo 6 - Estirar una imagen haciendo un efecto de Zoom

El siguiente ejemplo es similar al anterior, con la diferencia de que se captura un


área de un gráfico cargado en un picture, y se dibuja en otro picturebox, pero
estirando la imagen como si fuese un zoom. Para capturar el área se utiliza un
shape que se posiciona al mover el puntero del mouse sobre el picture que tiene la
imagen:

Colocar dos PictureBox y un control shape. A un Picture renombrarlo a Pic_Origen


y cargarle un gráfico. Al otro picture renombrarlo a Pic_destino que es donde se
copiará la porción de la imagen. El shape dejarlo con el nombre Shape1
Código fuente en un formulario

Option Explicit

Dim Ancho As Single


Dim Alto As Single

Private Sub Form_Load()

' Algunas propiedades para el shape

With Shape1

.Width = 500
.Height = 500
.BorderWidth = 2
.BorderColor = vbRed

'Coloca el shape dentro de Pic_Origen


Set .Container = Pic_Origen

End With

Ancho = Shape1.Width
Alto = Shape1.Height

End Sub

Private Sub Pic_Origen_MouseMove(Button As Integer, Shift As Integer, _


X As Single, Y As Single)

' Mueve el Shape en el centro del puntero del mouse


Shape1.Move X - Ancho / 2, Y - Alto / 2

'Dibuja en Pic_Destino
Pic_Destino.PaintPicture Pic_Origen, 0, 0, _
Pic_Destino.ScaleWidth, Pic_Destino.ScaleHeight, _
(X - Ancho / 2), (Y - Alto / 2), Ancho, Alto
End Sub
Dibujar un fondo ( imagen JPG , BMP ) a un formulario o picturebox

Este es un simple código fuente que utiliza la función PaintPicture para dibujar un
gráfico JPG para el fondo del formulario y otra imagen para un picbox alineado en
la parte superior.

En este caso , se dibuja el fondo en los eventos Resize del formulario y del
picturebox superior que actúa como simple menú de opciones.

Descargar

Nota: En este enlace puedes ver un ejemplo simple que hice de como hacer un
Scroll en un gráfico mediante la función PaintPicture, para desplazar la imagen
cuando la misma es superior ( Alto y ancho ) al contenedor, es decir a al
PictureBox o Formulario

Scroll de imagen
http://www.academia.edu/6580018/CUADERNO_DE_EJERCICIOS_Y_PRACTICA
S_VISUAL_BASIC_CUADERNO_DE_EJERCICIOS_Y_PRACTICAS_VISTUAL_B
ASIC_Cuaderno_de_Ejercicios_PowerPoint_para_Ni%C3%B1os_por_Licencia_Cr
eative_Commons_Atribuci%C3%B3n_CUADERNO_DE_EJERCICIOS_Y_PRACTI
CAS_VISUAL_BASIC_Contenido

http://www.youtube.com/watch?v=nQdoqow9c74

También podría gustarte