Documentos de Académico
Documentos de Profesional
Documentos de Cultura
COMPUTACIÓN E
INFORMÁTICA
CICLO I
ASIGNATURA:
Programación
Visual I
Lima - Perú
2
SILABO ACADÉMICO
I. Identificadores del programa
Carrera: Computación e Informática – PROGRAMACIÓN VISUAL I (VISUAL BASIC I)
Ciclo: II Código:
Tipo: Curso Sesión: 5 hrs. Sesiones x
Horas: 100
pedagógicas Semana: 2
Totales : 100 Teoría : 20 Práctica : 80
III. Contenidos
Diseño Gráfico
COMPUTACIÓN E INFORMÁTICA
Ensamblaje mantenimiento
y Reparación de PC.
Fast Office
Asistente de Gerencia
PROGRAMACION
VISUAL I
Carrera:
Secretariado Computación e Informática
Ejecutivo Curso: Visual Basic
Computarizado
7
CAPITULO I
El lenguaje de programación BASIC (Beginner's All purpose Symbolic Instruction Code) nació en el
año 1964 como una herramienta destinado a principiantes, buscando una forma sencilla de realizar
programas. Teniendo en cuenta el año de su nacimiento, este lenguaje cubría casi todas las
necesidades para la ejecución de programas.
Los autores fueron los científicos John G. Kemeny (Budapest, 1926 – USA 1992) y Thomas E. Kurtz
(Illinois 1928) Su trabajo original se llamó True BASIC.
Actualmente se está comercializando la versión 6.0 de este producto. Desde su salida al mercado,
cada versión supera y mejora la anterior. Dados los buenos resultados a nivel profesional de este
producto, y el apoyo prestado por el fabricante para la formación de programadores, Visual-Basic se
ha convertido en la primera herramienta de desarrollo de aplicaciones en entorno Windows.
Análisis . Es el studio de las necesidades que han dado origen a la creación de ese programa.
Es lo que se se llama Análisis de la aplicación. Es la primera fase que debe tener siempre un
programa y es tambien la más olvidada entre los programadores noveles. Una aplicación no
se inicia con el teclado, sino sobre un papel.
Definición de las propiedades de los controles – Se dará la forma, posición, y todas las
características necesarias a los controles que hayamos colocado en ese formulario. Estas
propiedades determinarán la forma estática de los controles, es decir, como son los controles
y para qué sirven.
Generación del código asociado a los eventos que ocurran a estos controles. A la
respuesta a estos eventos (click, doble click, una tecla pulsada, etc.) le llamamos
Procedimiento, y deberá generarse de acuerdo a las necesidades del programa.
- Generación del código del programa. Un programa puede hacerse solamente con la
programación de los distintos procedimientos que acompañan a cada objeto. Sin embargo, VB
ofrece la posibilidad de establecer un código de programa separado de estos eventos. Este
código puede introducirse en unos bloques llamados Módulos, en otros bloques llamados
Funciones, y otros llamados Procedimientos. Estos Procedimientos no responden a un evento
acaecido a un control o formulario, sino que responden a un evento producido durante la
ejecución del programa.
VARIABLES. DEFINICION Y ENTORNO
Basic, desde siempre, al contrario de otros sistemas de programación, no exigió la definición previa de
Nombre
Apellido1
Teléfono
Salario
La variable Nombre tomará valores distintos según vayamos introduciendo los datos de los distintos
alumnos. Es posible, que a lo largo de la ejecución del programa, esta variable Nombre valga:
José
Pedro
María
Luis
Decíamos que Basic no exige la definición previa de las variables. Otras herramientas exigen que se
haga así. Por lo tanto es normal encontrar, en otros sistemas de programación, que un programa
comienza de la siguiente forma:
Salario=50000000
Nombre ="Pedro"
Teléfono = "1234567"
entiende que Salario, Nombre y Teléfono son variables, que Salario es un número (No hemos metido
su valor entre comillas), y que Nombre y Teléfono son sucesiones de caracteres alfanuméricos (su
valor está entre comillas)
El peligro de no declarar las variables no termina en esa posibilidad de error. Cuando no declaramos el
tipo de variables, Visual Basic supone que la variable es de un tipo que soporta cualquier tipo de
datos : una variable tipo Variant. En ese tipo podrá meter cualquier tipo de variable, pero a costa de
ocupar mucho mas espacio en la memoria que si la hubiese declarado con el tipo correcto para el dato
que va a meter en ella.
Basic ha pensado en ese problema, y se puede solucionar con esta que será la primera instrucción
BASIC que vamos a estudiar:
OPTION EXPLICIT
Obliga a declarar previamente las variables que se vayan a usar. De no haberla declarado antes de
usarla, el programa dará una comunicación de error.
(Fig. 1.1)
TIPOS DE VARIABLES
Las variables pueden ser de los siguientes tipos: (El número indicado en segundo lugar indica el
número de Bytes que ocupa en memoria.)
Puede declarar el tipo de la variable mediante un carácter después del nombre de la variable. Esta
técnica, obligatoria en Quick-Basic, está en desuso en VB. No es recomendable definir el tipo de esta
forma, pues existe un serio peligro de error. De cualquier forma, eso es potestativo del programador y
de sus costumbres.
En Visual Basic, cuando declaramos una variable como String (Cadena de caracteres), no es
necesario declarar su longitud. VB aceptará cualquier número de caracteres. Si desea evitar que se
puedan introducir más de un determinado número de caracteres, debe declarar su número. Por
ejemplo :
En este segundo caso, si se introduce como Var2 una cadena de caracteres con mas de 15 caracteres,
Var2 tomará solamente los 15 primeros. Visual basic no presenta ningún aviso de que esa variable
ha omitido los caracteres que han sobrepasado la cifra de 15. Si desea que el usuario conozca esa
circunstancia, debe introducir el código oportuno para producir el aviso.
Declarando una variable mediante la sentencia PRIVATE en un Formulario o Módulo, esa variable
puede usarse en todo ese Formulario o Módulo (En todos sus Procedimientos y Funciones), pero NO
fuera del Formulario o Módulo donde se declaró.
Declarando una variable de esta forma en la sección de declaraciones de un Módulo, esa variable
puede usarse en cualquier parte del programa citándola simplemente por su nombre.
NombreFormulario.Nombrevariable
La sintaxis es:
La sentencia Global sólo puede usarse en el apartado de declaraciones de un Módulo. Esta sentencia
se mantiene por compatibilidad con versiones anteriores de VB. No la use.
Sentencia STATIC
Como se dijo anteriormente, una variable declarada en un procedimiento pierde su valor al salir de él.
Lo peor es que una vez que el programa vuelva a entrar en ese procedimiento, la variable estará
puesta a cero. Afortunadamente, esto último tiene solución. Si declarásemos una variable en un
procedimiento o función, como estática, esa variable, aunque no la podremos utilizar fuera de ese
procedimiento o función, cuando volvamos a él conservará el valor que tenía cuando lo abandonamos.
Esta declaración como estática se realiza mediante la instrucción Static
En un Módulo
Creo que esta costumbre viene del lenguaje C. Pero no vale en VB. Se trata de declarar varias
variables juntas en una misma línea :
Esta declaración está MAL hecha. Visual Basic interpretará que Variable1, Variable2 y Variable3 son
del tipo Variant, y solamente Variable4 la supone como tipo String
La forma correcta de hacerlo, si queremos declarar esas variables un una sola línea, es la siguiente :
Operadores Matemáticos
Visual Basic puede operar con números tal como lo haría cualquier persona. Conoce las 4 reglas, y
puede utilizar paréntesis de la misma forma que los escribimos sobre el papel.
+ Suma
- Resta
* Multiplicación
/ División
\ División sin decimales
Mod Resto de una división
^ Eleva a un exponente
Ejemplos
Existen otras operaciones que se pueden realizar con números: comparaciones. Los operadores que
realizan comparaciones se denominan Operadores relacionales. El resultado de las operaciones
realizadas con estos operadores solamente admiten dos resultados: True (Cierto) o False (Falso)
Estos operadores son:
= Igual que
<> No igual que
< Menor que
<= Menor o igual que
> Mayor que
>= Igual o mayor que
Estos operadores se suelen utilizar en estructuras de programa donde se tome una decisión.
Operadores Lógicos
CAPITULO II
La primera
pantalla que
nos saldra sera
Aquí escogemos el tipo de proyecto que queremos realizar que en este caso sera EXE STANDARD ya
que es el ideal para crear aplicaciones
OJO: Los otros tipos de proyecto permite crear cosas distintas como por ejemplo
ActiveX Control Crea un control para poder usarlo en tus aplicaciones e incluso en una página WEB.
DLL ActiveX Crea Librerias dinamicas que se podra utilizar desde cualquier lenguaje que tenga
compatibilidad.
Una vez que hemos escogido el proyecto a desarrollar el sistema nos respondera de la siguiente
manera:
Barra de Menu
Barra de Herramientas
standard
Explorador
de
Proyecto
Diseñador de
Formulario
Ventana de
Propiedades
Cuadro de
Herramientas
Si hacemos doble click con el ratón sobre alguno de ellos se insertará automáticamente en la ventana
del formulario.
Line es un control gráfico que se muestra líneas de diferente tipo, como por
ejemplo una línea horizontal, vertical o diagonal.
Utilice el control Image para mostrar una imagen. Un control Image puede
mostrar una imagen desde un mapa de bits, un icono o un metarchivo, así como un
metarchivo mejorado, un archivo JPEG o archivos GIF.
Data es un control para enlace de datos con una tabla de una Base de Datos. El
control Data del formulario primario y sus objetos relacionados, permiten relacionar
o enlazarse con la Base de datos mediante los objetos Database y Recordset.
Ventana de propiedades Los objetos tiene asociados unas propiedades que describen sus
atributos, valores, comportamiento y apariencia del objeto.
Para sacar las propiedades se hace clic derecho y propiedades o se pulsa F4.
Explorador de proyectos Contiene la lista de los archivos que forman parte de la aplicación
NOTA: Los objetos vienen a ser los controles como TextBox, Label, Etc.
Las propiedades son aquellas características o atributos que permiten establecer la apariencia de un
objeto como el color, tamaño, posición, etc... O el estado del mismo: activo, maximizado, ect...
Existen propiedades que sólo están disponibles en tiempo de diseño y otras que sólo están disponibles
en tiempo de ejecución.
Ejemplo de Propiedades: alignment, autosize, caption, name, etc.
Los métodos son pequeños programas que actúan sobre un determinado objeto y que establecen su
comportamiento. Así un objeto puede moverse, ocultarse, etc... Puedes utilizar cualquier método que
forme parte del objeto.
Ejemplo de Metodos: show, hide, etc.
Los eventos son las situaciones que se producen y que nos interesan identificar para establecer
algún tipo de de respuesta por parte del objeto. Así, puedes hacer click sobre un determinado objeto,
creando de esta forma un evento reconocible por el objeto. Que suceda algo o no como respuesta a
este evento dependerá de que hayas programado alguna acción en el correspondiente procedimiento
de evento.
Ejemplo de Eventos: click, dobleclicke ,mousemove, keypress, etc.
* Label o Etiquetas .- Las etiquetas son controles que nos permiten mostrar texto en los
formularios y que tienen la particularidad de que el usuario no puede modificar solo muestra
información acerca de algo.
Propiedad Definición
* TextBox o Caja de Textos.- Los cuadro de texto son el control estándar de entrada de
datos en Visual Basic. Permiten al usuario de la aplicación introducir información.
Los cuadros de texto son semejantes a las etiquetas, pero con la diferencia que el usuario puede
modificar su contenido. El texto que se introduce puede ser tanto numérico como alfanumérico
(números y letras).
Cuando se recupera un valor de una caja de texto asi se haya ingresado un numero tomará el valor de
una cadena.
Propiedad Definición
Alignment Alineación de la información introducida.
Multiline Permite introducir más de una línea de texto en el cuadro
PasswordChar Estable el caracter que se muestra al realizar una entrada en el
control. Sólo se mostrará dicho carácter(Por defecto esta vacio)
ScrollBars Muestra barras de desplazamiento(Esto solo funciona si la propiedad multiline
esta en True)
Text Texto que se visualiza en el control
Bloquear controles
Cuando estén situados los controles en el formulario se pueden bloquear para que no puedan moverse
de forma accidental.
Otras Propiedades
1 - El aviso es sí, que tiene por objetivo mostrar una información de interés.
2 - El aviso con espera de respuesta, que muestra una información esperando que el usuario
seleccione una de las respuestas posibles para que el programa la trate.
Una caja de mensaje, puede ser por ejemplo, la instrucción MsgBox "Hola". Por defecto, la caja de
mensaje será similar a esta:
El resultado es:
Como podemos apreciar en el código, la caja de mensaje posee un título Ejemplo y el mensaje, pero
es posible que deseemos escribir un mensaje en varias líneas con salto de párrafo. Nada tan fácil
como este código por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", , "Ejemplo".
El resultado es:
Supongo que se habrá percatado de que entre el mensaje y el título de la ventana, hemos escrito dos
comas, esto es porque entre las comas, debe ir un número que representará el icono a mostrar.
Existen cuatro iconos diferentes además de la posibilidad de no mostrar ninguno. Los iconos son:
Para mostrar el icono en cuestión o para que Visual Basic lo entienda, es necesario escribir lo
siguiente:
El resultado es:
Ahora bien, es posible que queramos mostrar algún otro botón que o bien no sea el de Aceptar o que
además del botón de Aceptar haya más botones. Para este propósito, tenemos los siguientes
parámetros:
Aceptar vbOKOnly ó 0
Aceptar y Cancelar vbOKCancel ó 1
Anular, Reintentar, Ignorar vbAbortRetryIgnore ó 2
Sí, No y Cancelar vbYesNoCancel ó 3
Sí y No vbYesNo ó 4
Reintentar y Cancelar vbRetryCancel ó 5
Aplicación modal vbApplicationModal ó 0 (Es la caja de mensaje sin
icono)
La forma de hacer esto es sumar al parámetro del icono que queremos mostrar el valor de los botones
que deseamos que aparezcan.
Así por ejemplo:
MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo , "Ejemplo"
El resultado es:
Aún así, es posible que deseemos que el Focus lo adquiera otro un botón determinado. Por ejemplo,
en este caso el Focus lo tiene el botón Sí, pero es posible que deseemos que lo tenga el botón No por
ejemplo. Esto se consigue con los siguientes parámetros:
Por ejemplo: MsgBox "Hola" & vbCrLf & "Esto es un ejemplo.", VbQuestion + vbYesNo +
vbDefaultButton2, "Ejemplo"
El resultado es:
Ahora bien, si decidimos mostrar un mensaje esperando una respuesta, o queremos saber que botón
ha pulsado el usuario, esto lo podemos conseguir mediante el siguiente código de respuestas:
Aceptar vbOK ó 1
Cancelar vbCancel ó 2
Anular vbAbort ó 3
Reintentar vbRetryó 4
Ignorar vbIgnore ó 5
Sí vbYes ó 6
No vbNo ó 7
If Resp = 6 Then
MsgBox "Ha pulsado SI"
Else
MsgBox "Ha pulsado NO"
End If
Si pulsamos el botón Sí obtendremos una acción, y si pulsamos el otro botón otra acción.
Ahora bien, para elegir o seleccionar un evento o acción, el usuario debe saber combinar los códigos,
sabiendo que un MsgBox posee la siguiente sintaxis principal:
El InputBox o caja de entrada es otra de las partes más utilizadas para la interacción del usuario con
la aplicación. Es importante que el usuario interactúe con la aplicación para ser el protagonista de
esta.
El InputBox nos permite sacar una caja donde el usuario pasará un parámetro, valor o dato para que
el programa lo trate y lo ejecute.
El mensaje que quiere que aparezca se realiza de forma casi idéntica al MessageBox. Puede escribirse
varias líneas de texto seguidas por la constante de Visual Basic vbCrLf o salto de línea o párrafo.
La sentencia es:
Val almacenará el texto escrito por el usuario, que puede ser una cantidad, cadena string, … etc.
Por ejemplo:
Dim Val As String
(El usuario teclea el nombre - Mundo Visual - y hace click en Aceptar. A continuación se muestra el
MsgBox - 2ª línea del código anterior )
Ahora bien, podemos determinar un texto predeterminado a la caja de entrada, como por ejemplo:
Es importante determinar que si el usuario elige el botón Cancelar, el programa devolverá una cadena
de caracteres igual a 0, es decir, Val ="".
La caja de entrada puede ser sin embargo más personalizada mediante dos parámetros como son la
posición de la ventana de entrada de datos en la pantalla.
CAPITULO III
Estructuras de control
Sentencias condicionales.
Si no se cumple
Fin de la sentencia.
Así de fácil es programar en Basic. Lo que ocurre es que esta herramienta habla inglés, y lo descrito
anteriormente toma la forma:
If condición Then
Instrucciones
Else
Otras instrucciones
End If
If condición 1 Then
Instrucciones
ElseIf Condición 2
Su nombre casi nos define lo que es: Selecciona, dependiendo del caso, un determinado juego de
instrucciones:
Select Case variable ' variable es una variable que puede tomar los valores (p.e.) de 1 a 4
Case 1
Instrucciones a ejecutar en caso de que variable = 1
Case 2
Instrucciones a ejecutar en caso de que variable = 2
Case 3
Instrucciones a ejecutar en caso de que variable = 3
Case 4
Instrucciones a ejecutar en caso de que variable = 4
Case Else
Instrucciones a ejecutar en caso de que variable sea distinta a los valores
anteriores
End Select
Este procedimiento resulta mucho mas sencillo y rápido que las sentencias If Then Else
vistas anteriormente, cuando el margen de elección es mayor que 2.
Puede agrupar varios valores en una misma línea. Por ejemplo, si tiene 100 valores
posibles, y el tratamiento es igual para varios de ellos, puede agruparlos así:
Cuando lo que queremos es elegir un valor, no ejecutar instrucciones como hacíamos anteriormente,
disponemos de otras dos funciones: Choose y Switch.
Switch toma una serie de parámetros, todos por parejas. El primer término de cada pareja es la
expresión a evaluar. El segundo es el valor que tiene que devolver. En realidad Switch es una función
(las funciones las veremos muy pronto)
Esta instrucción obtiene un valor para A que dependerá del valor que tome B entre los valores posibles
(1, 2 ó 3)
A = Choose ( B, 5, 7, 11 )
En estas sentencias, Switch y Choose, si el valor de B no coincide con ninguno de los valores que
se le habían establecido (1, 2 ó 3 en nuestro caso), la sentencia devuelve el valor Nulo ( Null ). Esto
puede producir algún error si no se contempla esa posibilidad.
Las sentencias Switch y Choose no se usan mucho en programación. Parece que los
programadores o no las conocen o se lían (y es comprensible) al utilizarlas. Le garantizo que puede
llegar a ser un gran programador sin necesidad de utilizarlas. Use preferentemente If End If y
Select Case.
Observaciones
IIf siempre evalúa SiEsCierto y SiEsFalso, aunque sólo vaya a devolver una de ellas. Por esta razón,
deberá vigilar que no se produzcan efectos no deseados. Por ejemplo, si al evaluar SiEsFalso se
produce un error de división entre cero, se generará un error aunque Expresión dé como resultado
True.
Como ejemplo, en el formulario de nuestro primer programa introduzca un nuevo botón de comando.
Introduzca también un TextBox. Vea que poco a poco vamos metiendo cosas aunque no las
conocemos todavía. Mas tarde las conocerá. El TextBox tendrá por nombre Text1. Haga doble click
sobre el botón de comando e introduzca el siguiente código :
Al ejecutar el programa, debe introducir un valor numérico en Text1. Si ese valor numérico es menor
que 100, MiVariable tomará el valor “Es menor” (No se cumple la condición expresada en el primer
parámetro Text1.Text > 1000). Si introduce una cantidad mayor, se cumple esa condición, por lo que
MiVariable tomará el valor “Es mayor”. El valor que toma la variable puede verlo en Label1.
Fíjese que hemos declarado MiVariable como String, ya que va a contener un dato tipo cadena de
caracteres.
Con estas sentencias condicionales es posible realizar bifurcaciones del programa, cambiar las
propiedades de un objeto, obtener resultados de operaciones, ....
Sentencias de bucle.
Es muy común utilizar bucles a lo largo de un programa. Un bucle es una sucesión repetitiva de
Mientras condición
Instrucciones
Existen dos formas de bucle: Una, que realiza un número determinado de recorridos por el bucle. Es el
denominado bucle por contador. Otra, realiza el bucle hasta que se cumpla (o deje de cumplirse) una
condición. Es el llamado bucle por condición.
Realiza el bucle tantas veces como le indiquemos. Por ejemplo, en este bucle nos va a
presentar las 26 letras mayúsculas del alfabeto inglés
For N=65 To 90
Label1.caption = Chr ( N )
Next N
Este "programa" nos presentará en una caja (Label) los caracteres cuyo número ASCII vaya desde el
65 (A) al 90 (Z) Comenzará presentando el correspondiente al número 65, e irá presentando
sucesivamente el 66, el 67, etc., hasta llegar al 90, donde se parará.
X=0
Do While X < 1000
X=X+1
Loop
El programa toma una variable ( X ) que previamente tuvimos la curiosidad de ponerla a cero, e
incrementa su valor una unidad. Analiza si el valor de X es menor que 1000, y si es cierto, vuelve a
realizar el bucle. Así hasta que X ya no sea menor que 1000. Al dejar de cumplirse que X sea menor
que 1000, sale del bucle. Acabamos de realizar un temporizador, y también de exponer las sentencias
condicionales y los bucles, inicio de cualquier curso de Basic. Como final de lección, se propone un
problema. Con el primer bucle, donde visualizábamos los caracteres A a la Z, posiblemente no nos
diese tiempo de ver cada una de las letras que iban apareciendo en la pantalla, en la etiqueta Label1,
dado que cambiaría con mucha velocidad, y solamente veríamos la Z, que es donde se detuvo el
programa. Podemos poner un temporizador cada vez que presente una letra, y así nos dará tiempo a
verla. Con los dos bucles vistos anteriormente ya podemos hacerlo.
Si lo que queremos es que el programa se ejecute mientras no se cumpla una determinada condición,
la sentencia será:
X=0
Do Until X > 1000
X=X+1
Loop
Observe que la diferencia entre una y otra es la condición, While para indicar Mientras se cumpla
que ... y Until para indicar Mientras no se cumpla que ....
Para terminar bien el programa anterior utilizaremos la condición de While (Mientras se cumpla la
For N=65 To 90
Label1.caption = Chr ( N )
Label1.RefreshN ' Refresca la etiqueta
X=0
Do While X < 1000
X=X+1
Loop
Next N
Nos falta la interface gráfica. Para realizarla basta con abrir el VB y sobre el formulario que aparece al
abrirlo, introducir una etiqueta, (Label) que llevará el nombre por defecto de Label1. Solo nos queda
pensar donde introducimos el código anterior. Podemos introducir un botón de comando (Command
Button) que saldrá con el nombre por defecto de Command1. Haga doble click sobre el botón.
Aparecerá el procedimiento Click. Este procedimiento es el que se realiza cuando hacemos click sobre
ese botón. Escriba en ese procedimiento este código.
Hemos puesto nuestra primera piedra en Visual Basic. Este ejemplo es muy sencillo. Visual Basic es
tan sencillo como este ejemplo.
(*) Las temporizaciones no se hacen realmente así. El ejemplo anterior no deja de ser una forma
sencilla de detener el programa, para que en los comienzos de su carrera como programador pueda
ver el contenido de una etiqueta. Si lo hiciera de esta forma, su ordenador estaría detenido realizando
una función bastante triste, contar hasta 1000 para luego continuar el programa. Y lo que es peor, en
un ordenador a 300 MHz. Tardaría menos tiempo que en uno a 66. Esta misma función puede hacerla
con Sleep que la verá mas adelante, que es la forma limpia y elegante de hacer una temporización
Ejemplos
En el siguiente ejemplo pretendemos parar el programa cierto tiempo, a la espera que otro equipo se
conecte a través del puerto serie. (Cuando se conecte, el control MSComm1 detectará la señal DSR
que le envía el otro equipo y deberemos salir inmediatamente del bucle para, por ejemplo, atender a
ese puerto serie)
Contador = 0
Do While Contador < 1000
Contador = Contador + 1
DoEvents
If MSComm1.DSRHolding = True Then Exit Do
Sleep (1000)
Loop
En el siguiente ejemplo, deseamos transmitir por el puerto serie una serie de números, del
1 al 1000, pero siempre y cuando que el equipo que está al otro lado de la línea serie esté a
la escucha (Condición MSComm1.DSRHolding = True) Si se desconecta ese equipo, y la
condición pasa de True a False, deseamos salir del bucle:
For I = 1 To 1000
If MSComm1.DSRHolding = False Then Exit Do
MSComm1.Output = Str(I)
Next I
Y ya que explicamos como se sale de un bucle por la vía rápida, veamos como salir de un
procedimiento usando también esa “vía rápida”.
Para salir de un procedimiento basta con ejecutar la sentencia Exit Sub. En el ejemplo siguiente,
usamos el botón BotonLeerNombre para introducir el dato Nombre en una base de datos. Pero ese
campo puede tener como máximo, 20 caracteres. Si el usuario ha introducido mas de 20 caracteres,
debemos salir del procedimiento donde se introduce ese dato sin ejecutarlo de forma íntegra:
2. Realizar un programa donde se ingresara por teclado en una caja de texto la hora en formato de
24 horas y en otra caja de texto la cantidad de minutos al hacer clic en un botón deberá salir la hora
en formato de 12 horas por ejemplo si se ingresa 23 en una caja y en la otra 12 el resultado seria
11:12 PM
3. Desarrollar un programa donde se ingrese la cantidad total de minutos hablados por una persona y
escoja el tipo de llamada (Local, Nacional, Internacional).Se visualizara el importe de la llamada
sabiendo que por los 3 primeros minutos se paga S/ 1.00 y por cada minuto adicional se paga 0.50 en
caso sea local si es nacional se incrementa el 25% y si es internacional se incrementa el 60% a los
precios por minuto.
5. Realizar un programa donde se ingrese por teclado el día de nacimiento y el mes de nacimiento de
una persona al hacer clic se deberá mostrar su signo zodiacal así como también deberá aparecer la
imagen del signo Zodiacal en un control PictureBox.
CAPITULO IV
Funciones de cadena
Se denomina CADENA a una sucesión de caracteres. Una cadena puede tener uno o varios caracteres
alfanuméricos. Una cadena es también una sucesión de números.
Ejemplo de cadenas:
Hagamos una distinción entre una cadena que contenga números y un número. Un número tiene un
valor, pero también tiene una presentación escrita. El valor es algo que estará en el ordenador como
una sucesión de bits. Dependiendo de como lo hayamos declarado, tendrá mas o menos bits. Pero esa
información no es un número legible por el usuario. Lo que sí es legible por el usuario es la
representación en numeración decimal (u octal, o hexadecimal, o incluso en binario) de ese número.
Esa representación del número en un determinado sistema de numeración es una cadena.
Así, el número nueve, que en la memoria del ordenador será una sucesión de bits, nos lo podrá
presentar como:
9 En numeración decimal
9 En numeración hexadecimal
11 En numeración octal
1001 En numeración binaria
Esas formas de presentarnos el número son CADENAS de caracteres. El valor del número dentro del
ordenador es un NUMERO.
Para presentar un número en la pantalla, el ordenador debe convertirlo previamente a una cadena.
Cuando introducimos un valor numérico por teclado o pantalla, el ordenador para hacer operaciones
con él, debe transformarlo a un número.
Estas consideraciones nos llevan a las dos primeras funciones con cadenas:
Str (número)
Convierte un número a una cadena en numeración decimal.
Ejemplos
Este ejemplo convierte la cadena de caracteres (numéricos) que hubiese en la caja de texto
TextBox1 en un número, y asocia este número a la variable Variablenumerica.
Si el contenido de la caja de textos no fuesen caracteres numérico (abcd, por ejemplo),
Variablenumerica tomaría el valor 0.
Este ejemplo pondría en la etiqueta Label1 los caracteres correspondientes al valor que tuviese la
variable Variablenumerica .
Existe una función mas amplia que Str. Se trata de Cstr. Esta función no solamente transforma un
número a una cadena, como hace Str, sino que convierte cualquier tipo de variable a una variable tipo
String (cadena).
Esta función transforma, por ejemplo, una variable tipo Booleana en una variable de cadena,
devolviendo la cadena “Verdadero” si el valor de la variable booleana es True, y “Falso” si es False.
Left (cadena, n)
Extrae los n primeros caracteres de una cadena, comenzando por la izquierda.
Right (cadena, n)
Extrae lo n últimos caracteres de la cadena
Mid (cadena, m, n)
Extrae n caracteres de la cadena, siendo el primer carácter
extraído el que ocupa el lugar m.
LCase (cadena)
Devuelve otra cadena igual, pero con todos los caracteres en minúsculas. (LCase =
Lower Case)
UCase (cadena)
Devuelve otra cadena igual, pero con todos loscaracteres en mayúsculas. (UCase =
Upper Case)
Len (cadena)
Devuelve la longitud de la cadena
Space (n)
Devuelve una cadena formada por n espacios.
LTrim Elimina los posibles espacios que tenga una cadena por
Su izquierda.
Rtrim Elimina los posibles espacios que tenga una cadena por
Su derecha.
Trim Elimina los espacios que tenga una cadena, tanto por su
izquierda como por su derecha. (No elimina los espacios
centrales de la cadena)
Estas tres funciones se emplean para quitar los posibles espacios que pueden resultar de una
entrada de datos. Tienen especial importancia cuando se toman los datos de un archivo o base de
datos, donde fueron introducidos por otro programa.
Mid puede usarse también para cambiar el contenido de una cadena. Observe la sutileza entre Mid
como Función de cadena y Mid como Instrucción.
La Instrucción Mid reemplaza un número especificado de caracteres en una variable de cadena con
caracteres de otra cadena.
Si la cadena que vamos a introducir tuviera más caracteres, tomará solamente los primeros
Estas funciones se utilizan para obtener el número ASCII de un carácter, y para, sabiendo el número
ASCII, hallar el carácter correspondiente.
Función Asc
Cadena es cualquier expresión de cadena válida. Si la cadena no contiene caracteres, ocurrirá un error
en tiempo de ejecución.
Nota Hay otra función (AscB) que puede usarse con bytes contenidos en una cadena. En lugar de
Función Chr
Como ejemplos de números de caracteres algo especiales se debe señalar el carácter 10 (avance de
línea) y el carácter 13 (Retroceso de carro). La tecla ENTER produce ambos caracteres cada vez que
se pulsa.
Otros caracteres importantes son, el Backspace (carácter 8), y el espacio (carácter 32)
Int y Fix eliminan la fracción de un número y devuelven el valor entero resultante. La diferencia entre
Int y Fix es que si el número es negativo, Int devuelve el primer entero negativo menor o igual a
número, mientras que Fix devuelve el primer entero negativo mayor o igual a número. Por ejemplo,
Int convierte -8,4 en -9, y Fix convierte -8,4 en -8.
Funciones Trigonométricas
Función Cdate Convierte una expresión al tipo de datos Date. (Fecha / Hora)
Otras Funciones
Randomize Timer
La función Randomize devuelve una variable Rnd con un número comprendido entre 0 y 1
(Nunca será 0 ni 1) Leyendo el valor de la variable sucesivas veces, se puede obtener una sucesión de
números aleatorios. No es necesario ejecutar la instrucción Randomize Timer cada vez que se quiera
obtener un dato de la variable Rnd.
Supongamos que tenemos un formulario con una etiqueta de nombre Label1, un botón de comando
de nombre Command1. Cuando hagamos click sobre el botón de comando deberá generar un número
comprendido entre el 1 y el 49. En el procedimiento click de Command1 pondremos el siguiente
código:
Randomize Timer
A = Rnd * 100
A = CInt(A)
Do While A > 49
A = A - 49
Loop
Do While A < 1
A = A + 49
Loop
Label1.caption = A
End Sub
Las fechas son cadenas especiales. Visual Basic sabe obtener y tratar la información relativa a la fecha
y la hora. Dispone para ello de una declaración de variable: Date. Una variable declarada como date
puede contener una fecha, una fecha y una hora o una hora solamente.
Date Devuelve la fecha de hoy. Esta fecha la toma del reloj del ordenador.
Mediante estas instrucciones podemos obtener el dato necesario de una fecha u hora. Por ejemplo,
para obtener el día de hoy solamente:
La función DatePart
Merece estudio aparte. Con esta función podemos averiguar el mes, trimestre, semana, día del año,
etc.
El parámetro Primerdíasemana puede ser un número o una constante (veremos a lo largo de todo el
curso, que VB usa constantes que son palabras reservadas por VB que generalmente comienzan por
vb) que indica que día es para nosotros el primero de la semana
Para el parámetro primerasemanaaño podemos emplear uno de los siguientes números o constantes:
Por ejemplo, y tomando como referencia para todos los ejemplos el día 22 de Septiembre de 1998,
fecha en la que se ha escrito este texto, (Now = 22/09/1998), tenemos :
Cuidado con como se escriben las fechas. Una posibilidad es la usada en los ejemplos, pero solamente
vale para el día de hoy. Puede expresar la fecha metiéndola entre dos signos #, pero en ese caso
debe estar expresada en el formato mm/dd/yy (mes/día/año). Ejemplo :
Pero lo mas fácil para el formato de fecha usado en España es meter la fecha entre comillas dobles, y
usar el formato especificado para el país :
Con las comillas dobles puede incluso no poner el año. En este caso le pone por defecto, el año en
curso.
Estas tres formas de expresar la fecha funcionan perfectamente, al igual que cuando lo hacíamos con
Now, y el resultado sigue siendo 39.
Función FORMAT
Esta función permite presentar cadenas numéricas o fechas de una determinada forma. Permite
establecer el Formato de esa cadena.
Si recurre a la ayuda de VB acerca de esta función se va a enterar muy poco de lo que puede dar de
sí. La sintaxis que presenta es :
la variable FechadeHoy tendrá el valor 1998-05-21, que se refiere al día 21 de mayo de 1998, según
el formato recomendado por la norma ISO-8601 para la presentación de fechas. Si hubiésemos puesto
la expresión FechadeHoy = Format (Now, “dd/mm/yy”) , la variable FechadeHoy contendría el valor
21/05/98 referido al día citado.
Las posibilidades de Format llegan también al campo de las cadenas numéricas. Por ejemplo la cifra
123456 se transformará en las siguientes expresiones, según como empleemos la función Format
No se complique la vida con el tema del primer día de la semana ni la primera semana del año. No lo
usará con frecuencia. Centrémonos mas en el parámetro Formato. Puede tomar muchos valores.
Veamos los principales. Primero para números
Observe que usamos la expresión Variable = Format (1234567,”Formato”) para todos los ejemplos de
números.
(Cada carácter # indica que ahí va un número. El separador debe ser una coma, no un punto, aunque
esto depende del idioma que esté usando)
Puede poner una de estas expresiones, eso si, siempre entre comillas dobles :
Para fechas (Observe que usamos el ejemplo Format(Now, “Formato”) siendo Now la fecha y hora
actual (21/07/98 a las 22:16:00 )
CAPITULO V
Formularios Múltiples
Lo que se va a explicar en este capítulo le será bastante familiar aunque nunca haya reparado en ello.
Posiblemente haya utilizado un procesador de texto en el que está escribiendo una carta, y antes de
terminar de escribir esa carta, comienza a escribir otro documento, y posiblemente otro, y tenga los
tres documentos en la pantalla al mismo tiempo, bien en ventanas escalonadas, (cascada), bien en
ventanas en forma de mosaico, o simplemente tapando unas a otras completamente. Los tres
documentos están en su procesador de textos, y puede actuar sobre uno u otro simplemente eligiendo
el deseado mediante el mecanismo que le proporciona su procesador de textos. Este sistema no es ni
mas ni menos que una interface de documentos múltiples. En programación, a este tipo de
aplicaciones las denominamos MDI
Para crear una aplicación MDI debe hacerse mediante un Formulario Padre al que se le añaden
tantos Formularios Hijo como documentos tengamos. Al formulario padre le denominamos
Formulario MDI, y a los formularios hijo en Visual Basic se les denomina formularios MDIChild. En
esta Guía del Estudiante se usarán indistintamente una u otra denominación.
La única diferencia entre un formulario normal y un formulario Hijo es que éste tiene la propiedad
MDIChild a True.
Para realizar una aplicación MDI, lo primero que hay que hacer es introducir en ella un formulario
MDI. Para introducirlo, basta con hacer click en Insertar | Formulario MDI de la barra de menú.
Solamente se puede tener un formulario MDI en una aplicación. Puede observar que una vez que ha
introducido uno, la palabra Formulario MDI del submenú Insertar queda deshabilitada.
Una vez que tiene un formulario MDI puede introducir tantos formularios hijo como desee. Para que
un formulario sea formulario hijo basta con poner a True su propiedad MDIChild.
Aparte de las propiedades de un formulario normal, un formulario MDI tiene las siguiente
propiedades :
Load NombreFormularioHijo
ActiveForm Mediante esta propiedad podemos conocer el formulario activo dentro de una
aplicación de documentos múltiples. (El formulario activo es aquel que tiene el foco)
MiVariable = ActiveForm.caption
Aparte de estas propiedades que diferencian un Formulario MDI de un Formulario normal, los
Formularios MDI presentan otras particularidades.
El control Picture puede trabajar como contenedor de otros controles. Por lo tanto, para poder
introducir cualquier control (TextBox, Label, CommandButton ...) será necesario introducir un control
Picture, y sobre el, poner los controles que se necesiten.
Línea de Menú. Cuando existe la línea de Menú en un Formulario MDI y en el Formulario Hijo que
introduzcamos en él, la línea de menú del Formulario MDI se sustituye por la línea de menú del
Formulario Hijo introducido.
Barra de Título. La Barra de Título del Formulario MDI se conserva siempre. Pero si el Formulario
Hijo insertado dentro de él está maximizado (ocupa toda la extensión del Formulario MDI), a la barra
de título se le añadirá la barra de Título del Formulario Hijo entre paréntesis.
Para hacer que un Formulario sea un formulario hijo basta con ponerle su propiedad MDIChild a True.
Puede preparar los formularios hijo uno a uno e introducirlos dentro del formulario MDI según las
necesidades de la aplicación. Este sería el caso de una aplicación con varias pantallas, todas ellas
colocadas sobre una pantalla fija (Formulario MDI) del que se aprovecha quizás alguna parte como
parte común de toda la aplicación (Menú, Título, Barra de herramientas montada sobre un Picture,
etc.)
Puede también darse el caso de introducir un número indeterminado de ventanas iguales para realizar
varias veces la misma función, pero sobre ventanas diferentes. (Caso del procesador de texto que
tiene varias ventanas de texto, cada una con un documento. Lo que desconocemos a priori es el
número de documentos que vamos a editar)
Para el primer caso, será necesario crear cada una de las ventanas, e introducirlas y quitarlas según
pida la aplicación.
En segundo caso, bastará con crear un formulario hijo con todas las partes necesarias para su
correcto funcionamiento, y luego, realizar tantas “fotocopias” de ese formulario como ventanas
necesitemos. Lo que introducimos en la aplicación son precisamente esas “fotocopias”, pero no el
original, que lo seguimos manteniendo intacto para volver a copiarlo si fuese necesario.
En realidad una Clase es la definición de un objeto Visual Basic. Un objeto Visual Basic puede ser un
Formulario, un control, un objeto de acceso a datos.
La Instancia es la réplica de una clase. Puede ser la réplica de un Formulario, de un control o de otro
objeto. La Instancia lleva las mismas Propiedades que la clase. Se dice que hereda las
propiedades. (Excepto la propiedad Visible, que siempre, por defecto, aparece a False). Cuando se
varía una propiedad de una Instancia, no se altera el valor de esa propiedad en la Clase ni en ninguna
de las restantes Instancias.
Después de toda esta teoría, ¿podemos saber como se crea una Clase de un formulario ? O dicho de
manera mas coloquial, ¿Cómo se crea un Formulario para poder hacer varias “fotocopias” de él ?
La respuesta es obligatoriamente mas sencilla que la teoría. Con el formulario vacío que tengamos en
el proyecto (Insertemos un Formulario si fuese necesario) pongámosle todos los controles que
deseemos. Le podemos poner un Menú y cambiar a nuestro antojo todas sus propiedades. Entre ellas,
la propiedad MDIChild. Si vamos a introducir las Instancias de ese Formulario en un Formulario MDI
esa propiedad debe estar a True, y por lo tanto sus Instancias saldrán igualmente con esa propiedad
a True. Pongámosle un nombre y ya está creada la clase. Supongamos que ese nombre es
FormularioHijo
Para crear ahora Instancias de ese Formulario podemos hacerlo de dos formas :
Declarar una variable tipo Objeto. No se asuste. Para declarar que una variable es un Formulario basta
con declararla de la siguiente forma :
Esta variable debe declararla en sitio adecuado para su aplicación, y el ámbito de esa variable objeto
será el mismo que para cualquier tipo de variable. (Vea Ambito de las Variables) La sentencia a
utilizar para la declaración será Dim, Private, Public o Global tal como se explicó para las variables.
Una vez declarada como variable puede hacerla igual a un objeto existente que servirá de modelo
(Una Clase) que estará definida por un nombre: (P.e. FormularioHijo)
Una vez creado la instancia del formulario debemos cargarlo en el Formulario Padre. Para cargarlo
debemos emplear la sentencia Load MiVentana, con lo que quedará cargado en la memoria, pero,
dependiendo de como está la propiedad AutoShowChildren del Formulario Padre se mostrará o no
se mostrará. Para que se muestre, independientemente de como esté esa propiedad, basta con
ejecutar MiVentana.Show. En realidad mediante el método Show un formulario no solamente se
muestra, sino que también se carga en la memoria si no estuviese previamente cargado. Por lo tanto
podíamos habernos ahorrado la instrucción anterior para cargarlo Load MiVentana
Es muy práctico poner un Caption distinto a cada formulario que se introduzca, caso de introducirse
varios formularios hijo iguales. El Caption es una propiedad y por lo tanto todas las instancias heredan
el Caption de la Clase. Sería prudente distinguir un formulario de otro mediante su Caption, es decir
mediante su barra de título.
Para ello podemos crear un contador en el mismo procedimiento en el que creamos una nueva
instancia, y poner el Caption de cada nuevo Formulario siguiendo un orden numeral.
Si queremos nombrar un Formulario Hijo dentro de una aplicación MDI el primer problema con el que
nos encontramos es que todos los formularios hijo (Instancias de la misma Clase) tienen el mismo
nombre. Por lo tanto no podemos nombrarlas con ese nombre, ya que la aplicación no sabría a cual de
ellas nos referimos.
Si el código donde vamos a nombrar ese formulario está fuera de él (P.e. en el Formulario Padre)
deberemos referirnos al formulario hijo mediante ActiveForm. ActiveForm nos va a indicar cual es
el formulario que está actualmente activo. Un formulario está activo cuando estamos trabajando sobre
él. En ese momento tiene el foco. Permanece activo desde que hacemos click con el ratón sobre
cualquiera de sus partes, hasta que activamos otro formulario. Es sencillo reconocer cual es el
formulario activo pues tiene su barra de título con el color vivo.
Cada vez que hacemos una operación sobre una parte de un formulario éste se pondrá activo. Por
ejemplo, si el formulario es un documento de texto, y contiene el texto en un RichTextBox de nombre
ActiveForm.RTB1.SelBold = True
ya que siempre estaremos seguro de que el Formulario Activo es aquel en el que acabamos de
seleccionar el texto.
Si el botón donde hemos puesto el botón no es el formulario padre, sino el hijo, tenemos un problema
similar. Su nombre será (con los ejemplos anteriores) MiVentana, y pueden existir varios formularios
con ese nombre, tantos como documentos hayamos introducido. No podemos por tanto nombrarlo
con su nombre, pues hay (o puede haber) varios. Tampoco lo podemos nombrar con ActiveForm, ya
que esta propiedad corresponde al Formulario Padre. La solución es nombrarle mediante Me. Me
siempre se refiere al formulario que contiene al procedimiento donde está esa palabra. Por lo tanto, si
tenemos un botón en el formulario hijo con la instrucción :
Me.RTB1.SelBold = True
Mediante el método Arrange podemos distribuir los formularios hijo dentro del formulario padre.
Pueden colocarse en cascada, mosaico horizontal, mosaico vertical o como iconos.
donde
Las ventanas o los iconos se pueden distribuir incluso si el objeto MDIForm está minimizado. Los
resultados son visibles cuando el objeto MDIForm se maximiza.
Cuando tenemos varios formularios hijo, unos ocultan a los otros. Mucho mas si los formularios están
maximizados. Podemos colocar un formulario hijo en la parte frontal del montón de formularios (para
que se vea completamente) o llevarle a la posición mas atrás mediante el Método ZOrder.
ZOrder es un método que no solamente se puede emplear con formulario hijo, sino con cualquier
instancia. Puede emplearlo también con cualquier control. Pero lea detenidamente la Ayuda de este
método, ya que no todos los controles la admiten.
Al explicar el Editor de menús casi se pasó por alto una propiedad del menú : WindowList. Cuando
se activa esta propiedad (Puede activarse para una sola palabra del menú. Si se pretende activar
para mas de una dará un error), esa palabra que tiene activada la propiedad WindowList mostrará al
hacer click sobre ella, en un menú desplegable, el Caption (Barra de Título) de todos los formularios
hijo cargados en ese instante en la aplicación. Pueden estar incluso minimizados.
CAPITULO VI
Diseño de Menú
El Menú o Barra de Menú es la segunda línea de cualquier ventana Windows, donde pueden verse
distintos nombres. La Barra de Menú es un componente de un Formulario.
La Barra de Menú puede tener tantas palabras como se desee, y sobre cada palabra, puede
desplegarse un Menú desplegable con mas palabras. Sobre cada una de estas puede a su vez
desplegarse otro conjunto de palabras, etc. con lo que se puede conseguir una cantidad de palabras
tan grande como necesitemos.
Para cada palabra se produce el evento click. Cada palabra de la Barra de Menú lleva anexo un único
procedimiento, que se ejecutará al hacer click sobre la palabra. Pero en las palabras que sirven para
desplegar un menú no tiene sentido que se ponga ningún código en su procedimiento, ya que están
ahí justamente para desplegar otras palabras. Será en las palabras finales donde se colocará el código
correspondiente.
En las figuras anteriores pueden verse tres formas distintas de ver el mismo Menú. En la primera
figura el Menú está sin desplegar. En la segunda figura puede verse un árbol de Menú largo,
desplegado en su totalidad. En la tercera puede verse el Menú desplegable de la palabra Archivo de la
Barra de Menú. Puede apreciarse en este menú desplegable una línea que separa las palabras
Guardar Como y SALIR. Esta línea separadora es muy práctica para separar dos temas distintos
Para crear un menú debe usarse el Editor de Menú, que se encuentra en la Barra de Menú de VB en
Herramientas | Editor de menús. Le aparecerá el siguiente cuadro. (En principio vacío)
Cada palabra del menú tiene su Caption (La palabra que aparece en el menú), su Name (Nombre), y
puede tener Index (si existen varias palabras con el mismo Name). Para introducir estas propiedades
basta con teclearlas directamente en cada una de las casillas al efecto del cuadro del editor de menús.
Para colocar el cursor de escritura en una u otra casilla, puede hacerse bien con el cursor del ratón,
bien con el tabulador. Para pasar a la siguiente línea de edición (crear una nueva palabra), basta con
pulsar ENTER.
Existen otras propiedades aparte del Caption y Name que se introducen directamente en las casillas al
efecto.
HelpContextID Igual que esta propiedad en el resto de los controles, permite introducir un
número de contexto para la ayuda de Windows.
Enabled. Habilitado. Si se quita la marca de esa casilla, esa palabra aparecerá por defecto
deshabilitada. Esta propiedad puede leerse y cambiarse en tiempo de ejecución, por lo que esta
propiedad puede usarse para deshabilitar ciertas funciones de la aplicación, dependiendo de la
evolución de la propia aplicación. La presentación en el menú cuando está deshabilitada es con color
pálido.
Visible. Como su nombre indica, que sea visible o no lo sea. Puede cambiarse en
tiempo de ejecución.
WindowList Indica si esa palabra es la que va a mostrar todos los formularios abiertos en una
aplicación de documentos múltiples (MDI). Al hacer click sobre esta palabra, se desplegará un
submenú con todos los Caption de los Formularios hijo abiertos en ese momento. Solamente puede
existir una palabra en un menú con esta propiedad activada. Esta propiedad no puede variarse en
tiempo de ejecución.
Para cambiar una de estas propiedades en tiempo de ejecución, basta con citar por su nombre a esa
palabra (por su Name, no por su Caption), e igualar a True o False su valor :
El nombre usado para nombrar a una de las palabras del menú puede ser cualquiera. Sin embargo es
prudente usar un nombre que nos pueda identificar, por una parte, que ese nombre corresponde a
una de las palabras del menú, y por otra, a que palabra se refiere. La solución puede ser cualquiera.
El autor de estos apuntes propone poner las letras mnu (o menu - recomiendo no usar acentos e los
Names de VB), seguido del Caption de esa palabra.
Otras propiedades
Shortcut Atajo. Esta propiedad admite varias combinaciones de teclas para acceder al
procedimiento click de esa palabra sin necesidad de usar el ratón. Las combinaciones de teclas
posibles se muestran haciendo click en la flecha hacia abajo que tiene esa casilla. Se desplegará una
lista con todas ellas. Para elegir una de estas combinaciones, basta con hacer click sobre la línea que
la contiene. Esta combinación de teclas aparecerá en el menú, al lado de la palabra (Véase figura
siguiente, SALIR Ctrl + X)
NegotiatePosition. Establece un valor que determina si los controles Menu de nivel superior se
muestran en la barra de menús mientras un objeto vinculado o incrustado de un formulario está activo
y mostrando sus menús. No está disponible en tiempo de ejecución. Puede tener los valores 0
(Predeterminado) Ninguno. El menú no se muestra en la barra de menús cuando el objeto está activo.
1 Izquierda. El menú se muestra a la izquierda de la barra de menús cuando el objeto está activo.
2 Medio. El menú se muestra en medio de la barra de menús cuando el objeto está activo.
3 Derecha. El menú se muestra a la derecha de la barra de menús cuando el objeto está activo.
El menú editado con los datos de la figura anterior tendrá esta forma en tiempo de ejecución :
Observe que tiene cuatro palabras en la línea superior, y que “colgando” de la primera aparece un
menú desplegable. Para conseguir un menú desplegable fíjese en la figura del Editor, en la parte de
abajo donde están todos los Caption de las palabras del menú. Observará que algunas de ellas
(&Edicion, Documentos, Ayuda - Hay otra que no se vé, &Archivo) están completamente a la
izquierda de la ventana, y las demás están separadas de la parte izquierda por unos guiones. Las
palabras que están completamente a la izquierda son las que figurarán en la barra de menú de forma
permanente. Las que están separadas (tabuladas) corresponden a las que aparecerán en los menús
desplegables. Como es lógico, un menú desplegable debe colgar de una palabra de las de la barra de
menú. La palabra de la que cuelga el submenú es la palabra sin tabular inmediatamente anterior.
Para tabular las palabras, hay que hacer click en el botón en forma de flecha a la derecha que está
sobre la ventana de edición:
Situandonos sobre una de las líneas ya editadas, y haciendo click sobre el botón con flecha hacia la
izquierda, quitamos la tabulación.
Los botones con flecha hacia arriba o abajo nos permiten variar el orden de las líneas ya editadas.
Podemos hacer varios niveles de submenús a base de introducir varias tabulaciones. Al comienzo de
este capítulo puede ver un ejemplo de ello.
Quedan un par de cosas. Una de ellas es el carácter & que está delante de los Caption de Archivo y
Edición. Este carácter nos permite acceder al procedimiento click de esa palabra pulsando la tecla Alt
+ la tecla correspondiente a la letra que está detrás del carácter &. Justamente la letra que está
subrayada en la palabra del menú.
Otra cosa. Puede verse en el menú desplegado de la figura anterior una línea entre Guardar Como y
SALIR. Esta línea, que solamente tiene efectos estéticos, se logra introduciendo como Caption un
guión ( - ). El editor de menús solamente le permite el guión en una palabra de menú desplegable
(Tabulada). No se olvide de poner el Name incluso para este guión.
POPUP MENÚS
Un PopUpMenú o Menú Emergente es un menú que despliega en cualquier punto de un Formulario
(MDI o normal) con varias opciones. Es normal en los procesadores de texto que se obtenga un menú
emergente pulsando el botón derecho del ratón, donde aparecen las tres palabras mágicas de Copiar,
Cortar y Pegar.
Para crear un menú emergente o PopUpMenu es necesario tener en el menú de ese formulario una
palabra de la que se despliegue un submenú con las mismas palabras que queremos que aparezcan
en el PopUpMenu.
Por ejemplo, en el menú que hemos editado como ejemplo anteriormente, existía una palabra Edición,
de la que se desplegaba el Submenú Copiar, Cortar y Pegar. Si analizamos la edición realizada, las
palabras tenían el siguiente Caption y Name :
Edición mnuEdicion NO
Copiar mnuCopiar SI
Cortar mnuCortar SI
Pegar mnuPegar SI
Recuerde que las palabras del menú que estaban tabuladas son las que aparecían en el menú
desplegable. Esas mismas serán las que aparezcan en el PopUpMenu.
Para ello utilizaremos el Método PopupMenu. Este método pesenta un menú emergente en un objeto
MDIForm o Form en la posición actual del mouse o en las coordenadas especificadas.
Nombremenú. Este parámetro es requerido. Es el Name de la palabra del menú de donde cuelga el
menú desplegable. La palabra del menú a que se refiere Nombremenú debe tener al menos un
submenú.
Indics. Parámetro opcional. Un valor o constante que especifica la posición y el comportamiento del
menú emergente, como se describe a continuación :
Para combinar la los valores de indics de posición y comportamiento basta con sumar los valores.
negrita. Parámetro opcional que especifica el nombre de un control menú del menú emergente para
presentar su título en negrita. Si se omite, ningún control del menú aparece en negrita.
La forma mas habitual de presentar un menú emergente es mediante el botón derecho del ratón.
Concretamente en el editor Word que estoy utilizando para escribir estos apuntes ocurre cuando se
levanta el botón derecho del ratón. Es decir, en el evento MouseUp, con la condición de que Button=2.
Imaginemos que queremos presentar en un menú emergente las palabras Cortar, Copiar y Pegar del
ejemplo anterior, que colgaban en el menú de la palabra Edición. (Vea mas atrás). Queremos también
que la palabra Copiar salga resaltada en negrita. Iríamos al procedimiento MouseUp del Formulario y
escribiríamos :
Observe que se ha omitido el nombre del Formulario (Opcional), el parámetro indics, y las
coordenadas x e y (el menú emergente aparecerá donde esté situado el cursor del ratón). Observe
también que las comas separadoras de los parámetros hay que colocarlas.
Cuando se presenta un menú emergente, el código que sigue a la llamada al método PopupMenu no
se ejecuta hasta que el usuario elige un comando del menú (en cuyo caso se ejecuta antes el código
del procedimiento de evento Click) o cancela el menú. Además, sólo puede presentarse un menú
emergente al mismo tiempo; por lo tanto, las llamadas a este método se ignoran si el menú
emergente está presentado actualmente o si un menú desplegable está abierto.
Si queremos presentar un menú emergente es necesario tener ese menú en el menú del formulario. El
problema puede ser que no queramos que esté en la barra de menú. No es problema. Ponga la
propiedad Visible del elemento del menú desde el que se va a desplegar el submenú a False. No se
verá ya en la barra de menú ni esa palabra ni el submenú que de ella se despliega. Eso sí, las
palabras del submenú deben tener la propiedad Visible = True. Si les pone esa propiedad a False, no
se verán en el menú emergente. Puede aprovechar esta circunstancia para hacer menús emergentes
con mas o menos elementos, según las necesidades de su aplicación. También puede poner la
propiedad Enabled a False si así lo precisa. No puede activar la propiedad WindowList en un elemento
que forma parte de un menú emergente.
Ejercicio propuesto: un editor de texto, con un menú que diga Copiar | Cortar | Pegar donde
pueda utilizar el portapapeles. Ahora es posible que le cueste un poco de trabajo. Pero este
ejercicio lo va a repetir con casi todas las aplicaciones que realice en su vida profesional.
CAPITULO VII
Funciones y procedimientos
Procedimientos
Un Procedimiento en Visual Basic es un trozo de código que realiza una determinada tarea. Un
procedimiento es el código que asociamos a un evento de un control (CommandButton_Click,
Form_Load, ...). Un control puede tener por lo tanto, muchos procedimientos asociados. Uno a cada
uno de sus eventos.
Si queremos realizar una determinada tarea en un programa, y esta tarea se repite muchas veces en
ese programa, podemos, por ejemplo, repetir el código tantas veces como sea necesario en los puntos
del programa que así lo pidan. Esto nos llevaría a escribir líneas y líneas repetidas en nuestras
aplicaciones, con el consiguiente incremento de trabajo y del volumen de la aplicación.
Podemos hacer otra cosa mas práctica y elegante. Escribir ese código una sola vez, creando con él un
Procedimiento. Este Procedimiento tendrá un nombre, y cada vez que queramos que se ejecute ese
código bastará con nombrar por ese nombre al Procedimiento.
En esta ventana debe teclear el nombre que quiere dar al Procedimiento. En tipo debe elegir la opción
Procedimiento (Veremos mas adelante la Función y en otro capítulo las opciones Propiedad y
Evento) y en el Ambito debe elegir Public o Private dependiendo del ámbito que quiera darle :
Si se ha insertado en un Módulo, puede citarse solamente por su nombre. Puede citarse también por
el nombre del módulo seguido por el nombre del procedimiento, separando ambos por un punto. Si el
procedimiento tiene por nombre NombreProcedimiento y se ha insertado en el Módulo1 puede citarse
de las dos formas siguientes en cualquier parte del programa:
NombreProcedimiento
Si se ha insertado en un Formulario, desde ese Formulario basta con citarle por su nombre. Desde
otro Formulario o Módulo, hay que citarlo mediante el nombre del Formulario donde está insertado,
seguido del nombre del procedimiento, separados por un punto.
Private. Si elige este ámbito, sólo se podrá acceder a ese Procedimiento desde el Formulario o
Módulo donde se haya insertado.
La caja de opción (Check) que pone Todas las variables locales como estáticas nos va a poner
todas las variables declaradas dentro del procedimiento como estáticas (No ponen a cero o nulo su
valor cuando salimos y volvemos a entrar en ese procedimiento). Puede ahorrarnos un poco de
código.
El código de los Procedimientos se guarda en el General del Formulario o Módulo donde se han
insertado :
Para llamar a un procedimiento desde cualquier parte del código basta con escribir en una línea el
nombre del procedimiento.
fpublico
Call fpublico
No hace falta poner Call, aunque Visual Basic lo admite. Algunos programadores me dicen que al
poner Call, siempre se enteran mejor de que están llamando a un procedimiento. Me parece muy bien,
y creo que es una buena razón. Pero no existe otra razón para ello.
Los datos que se puedan generar en un procedimiento debe extraerlos de ese procedimiento mediante
variables. Verá que con las funciones es distinto.
RutErr:
End Sub
Esto puede producirse serios problemas a la hora de depurar su programa. Para evitar que suceda
eso, y que se pare la ejecución del programa en la línea del procedimiento Calcula_Dietas en la que se
produjo el error, inicie este procedimiento con una instrucción que anule la condición de tratamiento
de errores:
Funciones
Una función es una forma especial de realizar un procedimiento. En realidad es un procedimiento al
que le pasamos una o varios parámetros con los que realizará una operación (cualquier operación, no
tiene porqué ser matemática) y obtendrá un resultado de esos parámetros. Este resultado puede
leerse desde otra parte de la aplicación en una variable que tienen el mismo nombre que la función.
La forma de obtener los datos de la función es llamar directamente a esa función, como verá un poco
más adelante.
Para insertar una Función se procede de igual forma que para un Procedimiento, pero marcando el
botón de opción Tipo Función en la caja de diálogo de la figura anterior.
El ámbito de una Función es el mismo que el un Procedimiento. Si se declara Pública puede usarse en
toda la aplicación. Si se declara Privada, solamente en el Formulario o Módulo donde se haya
insertado.
Para llamar a una Función son válidos igualmente los criterios expuestos para los Procedimientos en
cuanto a la sentencia Call.
End Function
La función MiFuncion sabe que debe recibir dos parámetros, y que el primero será una cadena de
caracteres y el segundo un integer. Los nombres Variable1 y Variable2 son los nombres que usa la
Función internamente. No tienen porqué coincidir con los nombres que tengan las variables que
contienen esos valores en otras partes del programa.
Una función siempre da un resultado. Este resultado se le introduce en una variable que tiene el
mismo nombre que la función. Esta variable no hace falta declararla, ya que la declaración de la
función lleva implícito que exista una variable con ese nombre.
Ya se habrá dado cuenta de que debemos emplear Left para obtener los caracteres iniciales de una
cadena. Nuestra función quedará de la forma :
(Observe que hemos añadido la expresión As String al final de la declaración. Esto quiere
significa que le estamos diciendo a la función que su resultado es un String,)
Donde MiFuncion es una variable que se ve en todo el ámbito de la función. Para llamar a la función,
basta con citarla por su nombre y ponerle los parámetros necesarios. Cuando esté tecleando el código,
Visual Basic le invitará a introducir los parámetros citándole su nombre. (En nuestro ejemplo, ByVal
Variable1 as String, ByVal Variable2 as Integer
Pruebe esto con una pequeña aplicación. En un formulario, ponga un TextBox (Text1) donde va a
introducir la cadena original, otro TextBox donde va a introducir el número de caracteres a tomar, y
un Label (Label1) donde va a ver el resultado. Ponga un Botón de comando (Command1) donde
llamará a la función. Inserte una función (MiFuncion) en ese formulario :
Puede pensar que para hacer esta cosa tan elemental no merece la pena hacer una función.
Efectivamente. Bastaría con poner en el botón Command1_Click el siguiente código :
y funcionaría igual. Lógicamente, una función debe introducirse cuando vaya a realizar un código un
poco mas complejo, y sobre todo, cuando se va a repetir en muchos procedimientos.
Hemos visto que los parámetros de la función pueden pasarse Por Valor (ByVal), caso del ejemplo
anterior, y Por Referencia (ByRef). ¿Cuál es la diferencia ? La diferencia es que si le pasa un valor
por valor (ByVal) ese valor, aunque lo cambie la función internamente, ese cambio no se manifiesta
fuera de ella. Si se pasa por referencia (ByRef), y la función cambia el valor de esa variable, ese
cambio se mantiene fuera de la función.
Veamos esto de una forma muy sencilla : Vamos a hacer una función que multiplica dos números.
Pero dentro de la función vamos a cambiar uno de esos números, sumándole 2. Una vez realizada la
operación presentamos el valor de los dos factores en dos Label a ver si ha cambiado. Insertemos dos
Las dos funciones son idénticas, excepto en la forma de pasarle los parámetros. Pongamos un Botón
de Comando para multiplicarlo con MultiplicaA y otro con MultiplicaB. Al final del procedimiento click
de cada uno de ellos presentamos las dos variables que se pasan a la función en sendos Label.
Cuando se usa MultiplicaA el valor de X1 (pepe en el CommandButton) se mantiene. En MultiplicaB
cambia al valor pepe+2
Tras esto, se pone en Label2 el valor pepe + 2 (se mantienen el cambio realizado en la función
MultiplicaB x1 = x1 + 2
No queda ahí la cosa. Un valor puede pasarse también por ParamArray. En principio parece que esto
ya es para nota. No es para tanto.
Vamos a ver que sucede cuando queremos realizar una suma. La suma de los importes de varios
productos de un ticket de compra. En principio no sabemos cuantos productos va a comprar un
cliente, por lo tanto no sabemos a priori cuantos parámetros le tenemos que pasar. Para pode pasar
un número indeterminado de parámetros se los pasamos como PamArray :
Cuando se declara una función con un determinado número de parámetros, es necesario pasárselos
todos. Si no se hace así, VB nos dará un error. Pero puede que algún parámetro no exista siempre.
Cuando uno o varios de los parámetros que se pasan a una función son opcionales, se le pueden pasar
como Optional.
Se pueden pasar uno o mas parámetros como Optional. Las condiciones para los parámetros
opcionales es que ocupen los últimos lugares y que sean del tipo Variant
Hagamos un ejemplo en el que vamos a poner en un TextBox (TB4) el nombre y apellidos de una
persona. El segundo apellido se lo pasamos como Opcional. La declaración de la función será :
Los parámetros los tomamos de tres TextBox (TB1, TB2 y TB3, siendo este último el que es opcional.
En un botón de comando ponemos este código :
Se puede salir de una función antes de que termine. Por ejemplo, si se cumple una determinada
condición, se puede salir de la función mediante la sentencia Exit Function
CAPITULO VIII
Uso del ADO (ActiveX Data Object)
OBJETO CONNECTION.-
Un objeto Connection representa el enlace o la conexión a algún manejador de Base de Datos.
Para hacer un enlace a un Manejador de Base de Datos debemos declarar una variable de tipo
connection para eso debemos hacer lo siguiente:
1. Primero hacer la referencia al ADO (Nos vamos al menú Proyecto – Referencias y se marca la
opción Microsoft Actives DataObjects 2.5 Library)
Nota : Esta referencia es necesaria para objetos de tipo Connection y recordset.
5. Abrir la conexión
cn.open “cadena de conexión” .- donde la cadena de conexión puede variar según a que
manejador de base de datos queremos conectarnos
Para Acces La cadena de conexión sería:
"Provider=Microsoft.Jet.OLEDB.4.0;Datasource=d:\micarpeta\Mibase.mdb”
Donde el proveedor indica que la conexión será con Access y el data source indica la ubicación
y el nombre de la base de datos
Para SQL Server la conexión sería:
"Provider=sqloledb;uid=sa;database=Mibase;server=a1_10”
Donde el proveedor indica que la conexión es a SQL el UID hace referencia al usuario del SQL
ya que SQL server maneja usuarios y el usuario SA es el usuario por defecto, Database hace
referencia a la base de datos a la cual se quiere conectar y server el nombre de la maquina
donde se encuentra la base de Datos.
OBJETO RECORDSET.-
Un objeto Recordset representa los registros de una tabla o una consulta a la cual nosotros queremos
acceder. Para manipular la información de una tabla nosotros debemos declarar una variable de tipo
recordset y esta variable contendrá todos los campos y registros de la tabla o la consulta a la cual
queremos acceder.
Ejemplo:
Para utilizar una variable de tipo recordset lo que vamos a hacer es lo siguiente
1. En este caso vamos a trabajar de la mano con la variable de tipo connection entonces lo
primero es declarar,instanciar y abrir una variable de tipo connection
- donde tabla o consulta sql es el nombre de la tabla o la consulta sql al cual queremos acceder
- cn es el nombre de la variable de tipo connection
- Tipo de cursor hace referencia a como va a trabajar la variable de tipo recordset
- Tipo de Bloqueo hace referencia a como se va a bloquear la tabla cuando un usuario acceda a
la tabla
Ejemplo 1:
Aquí se esta abriendo la tabla alumnos de la base de datos a la cual se conecto la variable cn de tipo
de cursor fue adOpenDynamic y el tipo de bloqueo fue adLockOptimistic
Ejemplo 2:
Ejemplo: vamos a suponer que la variable rs tiene dos campos cod y nom
Rs(0)
Rs.Fields(0)
Rs!cod
harían referencia al campo cod (va 0 por que es el índice del campo todos los índices empiezan con 0)
Método Descripción
MoveFirst Posiciona el cursor en el primer registro
MoveLast Posiciona el cursor en el último registro
MoveNext Avanza el cursor en un registro
MovePrevious Retrasa el cursor en un registro
Las propiedades relacionadas con el movimiento a través del Recordset son las siguientes:
Propiedad Descripción
AbsolutePosition Nos indica el número del registro en el que nos encontramos.
También lo podemos utilizar para movernos a una determinada
posición. Ej.: rs.AbsolutePosition = 5
BOF Es True cuando nos encontramos al principio del Recordset,
antes del primer registro.
EOF Es True cuando nos encontramos al final del Recordset,
después del último registro.
RecordCount Nos señala el número de registros que contiene el objeto
Recordset.
Ahora que hemos visto los aspectos básicos de un Recordset entregaremos al lector una guía con los
principales métodos asociados a este objeto, de forma que se pueda profundizar en el estudio y
utilización del objeto Recordset.
Método Descripción
AddNew Crea un nuevo registro en el Recordset. Sólo será
insertado en la tabla cuando se aplique el método Update.
Ejemplo:
rs.AddNew
rs(0) = "Rodrigo"
rs(1) = "Rohland"
rs.Update
CancelUpdate Cancela un proceso de actualización, ya sea de creación o
de modificación de registros.
Clone Crea una copia del objeto Recordset. Ejemplo:
Set rs2 = rs.Clone
Close Cierra el objeto Recordset utilizado.
Delete Elimina del Recordset el registro que estemos utilizando
en ese momento.
GetRows Crea un arreglo con el contenido del Recordset. Si quieres
aprender más sobre este método visita.
Move Permite movernos hacia arriba si le indicamos un número
positivo, o hacia abajo si le indicamos uno negativo.
Ejemplo:
rs.Move -2
MoveFirst Nos lleva al primer registro del Recorset.
MoveNext Nos permite recorrer secuencialmente el Recordset,
avanzando un registro hacia adelante.
MoveLast Nos lleva al último registro del Recordset.
Otras propiedades
Filter .- Sirve para filtrar la variable de tipo recordset
Rs.Filter “Condicion de filtro”
Ejemplo :
rs.Filter = “sueldo > 100” .- aquí se esta filtrando los datos de la variable Rs donde el sueldo sea
mayor a 100 (la condicion va como cadena)
Find .- Sirve para buscar en base a un criterio, esta funcion hace que el puntero se ubique en la
posición del registro que se ha buscado.
Rs.find “Condicion de Busqueda”
Ejemplo :
Rs.Find "cod='A001'" .- Aquí se esta buscando el registro que tenga como codigo el „A001‟ si en caso
existe el puntero se ubica en ese registro caso contrario se va al fin de archivo (EOF toma el avlor de
True)
Ejemplos Demostrativos 1:
Mantenimiento de Datos
Public cn As String
Sub datos()
Sub main() Text1.Text = RsEmpleados(0)
cn = "Provider=Microsoft.jet.4.0.oledb; Text2.Text = RsEmpleados(1)
data source=c:\sistema\bdventas.mdb" Text3.Text = RsEmpleados(2)
Form1.Show Combo1.Text = RsEmpleados(3)
End Sub Text5.Text = RsEmpleados(4)
Text6.Text = RsEmpleados(5)
Dim RsEmpleados As New Text7.Text = RsEmpleados(6)
ADODB.Recordset Text8.Text = RsEmpleados(7)
Ejemplos Demostrativos 2:
En el modulo
Public cn As String
Public RsEmpleados As New ADODB.Recordset
Public Rsclientes As New ADODB.Recordset
Sub main()
cn = "Provider= Microsoft.jet.4.0.oledb; data source=c:\sistema\bdventas.mdb"
RsEmpleados.CursorLocation = adUseClient
RsEmpleados.Open "select * from empleados", cn, adOpenDynamic, adLockOptimistic
Rsclientes.CursorLocation = adUseClient
Rsclientes.Open "select * from Clientes", cn, adOpenDynamic, adLockOptimistic
Form2.Show
End Sub
Consulta 1:
En el formulario
Private Sub DataCombo1_Change()
RsEmpleados.MoveFirst
Do While True
If RsEmpleados(1) = DataCombo1.Text Then
Text1.Text = RsEmpleados(0)
Text2.Text = RsEmpleados(1)
Text3.Text = RsEmpleados(2)
Text4.Text = RsEmpleados(3)
Text5.Text = RsEmpleados(4)
Text6.Text = RsEmpleados(5)
Text7.Text = RsEmpleados(6)
Text8.Text = RsEmpleados(7)
Exit Do
End If
RsEmpleados.MoveNext
Loop
End Sub
Private Sub Form_Load()
Consulta 2:
En el formulario