3.1.- VARIABLES Y CONSTANTES: DECLARACIÓN, TIPOS, ÁMBITO Y DURACIÓN.
Las variables en Visual Basic no necesitan ser declaradas, en el momento en que son necesitadas pueden aparecer en el código. Sin embargo, puede ser útil el exigir la declaración de todas las variables que aparezcan en el código. Para ello, se utilizará la instrucción:
Option Explicit
en la sección de declaraciones del formulario. Una vez procesada esta instrucción, no se permitirán variables no declaradas. Para declarar una variable la instrucción adecuada es:
Dim Nombre_Variable [As Tipo]
donde Tipo puede ser:
|
TIPO |
DESCRIPCIÓN |
TAMAÑO OCUPADO |
IDENTIFICADOR |
|
String |
Carácter |
1 Byte por carácter |
$ |
|
Integer |
Entero |
2 Bytes |
% |
|
Long |
Entero largo |
4 Bytes |
& |
|
Single |
Real simple |
4 Bytes |
! |
|
Double |
Real doble |
8 Bytes |
# |
|
Currency |
Moneda |
8 Bytes |
@ |
|
Byte |
Byte * |
1 Byte |
(ninguno) |
|
Boolean |
Booleano * |
2 Bytes |
(ninguno) |
|
Date |
Fecha * |
8 Bytes |
(ninguno) |
|
Object |
Objeto * |
4 Bytes |
(ninguno) |
|
Variant |
Variante |
Cualquiera de los anteriores |
* Nuevos tipos en Visual Basic 4.0
Para declarar una constante se necesita la instrucción:
Const Nombre_Constante = Expresión
Hay dos tipos de constantes:
ÁMBITO DE LAS VARIABLES EN VISUAL BASIC
Se entiende por ámbito de una variable el espacio de la aplicación donde la variable es visible y por tanto se puede utilizar. Los distintos alcances que puede tener una variable declarada en Visual Basic son:
EJEMPLO:
Crear un formulario con dos botones de comando (cmdInicio y cmdParada), tres etiquetas (lblHInicio; lblHParada y lblTTranscurrido) y, tres cajas de texto (txtHInicio, txtHParada, txtTTranscurrido). Inicialmente, el botón cmdParada estará desactivado. Se pretende que, cuando el usuario pulse el botón cmdInicio, en la caja de texto asociada a la etiqueta lblHInicio, aparezca la hora actual y, al mismo tiempo, se active el botón cmdParada y se desactive el de cmdInicio. Al pulsar el botón cmdParada, se mostrará la hora de parada, el tiempo transcurrido, se desactivará el botón de cmdParada y, se habilitará el de cmdInicio. El código asociado será:
Private Sub cmdInicio_Click()
HInicio = Now
txtHInicio.Text = Format$(HInicio; "hh:mm:ss")
cmdInicio.Enabled = False
cmdParada.Enabled = True
End Sub
Private Sub cmdParada_Click()
HParada = Now
Tiempo = HParada - HInicio
txtHParada.Text = Format$(HParada; "hh:mm:ss")
txtTTranscurrido.Text = Format$(Tiempo; "hh:mm:ss")
cmdInicio.Enabled = True
cmdParada.Enabled = False
End Sub
En este ejemplo se deben declarar las variables HoraInicio, HoraParada y Tiempo como variables a nivel de formulario (en la sección de declaraciones del formulario) para que sean accedidas desde cualquier procedimiento asociado al formulario. Por tanto, el ámbito de una variable determina qué procedimientos podrán acceder a esa variable. Cualquier sentencia Dim declarada en cualquier procedimiento tiene preferencia con respecto a variables declaradas a nivel de módulo.
Siempre que una variable aparece por primera vez, es inicializada al valor por defecto (0 para variables numéricas y cadena vacía para tipo String) Para que una variable mantenga el valor en cada ejecución del procedimiento donde se utiliza, se debe declarar con la instrucción:
Static Nombre_Variable [As Tipo]
Se mantiene la palabra reservada Global por compatibilidad de la versión 3.0, pero es preferible utilizar la palabra reservada equivalente: Public.
EJERCICIOS:
TIPOS DEFINIDOS POR EL USUARIO
Se pueden definir tipos por parte del usuario para crear registros (structs en C, Record en Pascal). Un registro puede definirse como una colección de datos de diferentes tipos relacionados entre sí. Para crear un registro se necesita la sentencia Type ... End Type. Esta sentencia solo puede aparecer en la sección de declaraciones de un módulo estándar y pueden ser declarados como Private o Public. P.e:
Type Ficha
Nombre As String
Dirección As String * 40
Teléfono As Long
DNI As Long
End Type
Una vez definido un tipo de datos, se pueden declarar variables del mismo tipo. P.e: Dim Alum As Ficha
Para refererirse a un determinado campo del registro, se utiliza la notación variable.campo P.e: Alumno.Nombre. Un tipo definido por el usuario no puede contener un array dinámico, pero sí estático.
EJERCICIOS:
EJEMPLO:
Crear un formulario que actúe como un reloj despertador, de forma que visualice la hora actual y, si el usuario ha activado la alarma, cuando la hora actual sea la misma que la alarma, se debe emitir un pitido. Para ello, añadiremos los siguientes controles al formulario.
|
CONTROL |
PROPIEDAD |
VALOR |
|
Label |
Caption |
(ninguno) |
|
Name |
lblPantalla |
|
|
BorderStyle |
1-Fixed Single |
|
|
Label |
Caption |
Alarma |
|
Text Box |
Text |
(ninguno) |
|
Name |
txtAlarma |
|
|
Option Button |
Caption |
Alarma On |
|
Name |
optAlarmaOn |
|
|
Option Button |
Caption |
Alarma Off |
|
Name |
optAlarmaOff |
|
|
Value |
True |
|
|
Timer |
Interval |
1000 |
|
Name |
tmrReloj |
Inicialmente, la alarma debe estar desactivada y no se permitirán valores distintos del carácter ‘:’ o cualquier dígito. El código asociado será:
Dim AlarmaOn As Boolean
Private Sub txtAlarma_KeyPress(KeyAscii As Integer)
Dim Key As String
‘Comprobar que se escriben dígitos o el carácter :
Key = Chr(KeyAscii)
If (Key < "0" Or Key > "9") Then
If Key <> ":" Then
Beep
KeyAscii = 0
End If
End If
End Sub
Private tmrReloj_Timer()
‘Comprobar si la alarma > hora actual
If (Time >= txtAlarma.Text And AlarmaOn) Then
Beep
End If
lblPantalla.Caption = Time
End Sub
Private optAlarmaOn_Click()
AlarmaOn = True
End Sub
Private optAlarmaOff_Click()
AlarmaOn = False
End Sub
EJERCICIO:
Modificar el ejercicio anterior para que suene la alarma 5 segundos.
NOTA:
Cada vez que el usuario presiona una tecla, se generan los eventos KeyDown, KeyUp y KeyPress. El evento KeyPress devuelve el código ASCII de la tecla presionada. Los eventos KeyDown y KeyUp se producen cuando el usuario presiona o libera una tecla y reciben dos argumentos: KeyCode que mantiene el código ANSI de la tecla presionada y, Shift que indica el estado de las teclas Shift, Alt y Ctrl.
FORMULARIOS MÚLTIPLES
Los formularios múltiples añaden flexibilidad a las aplicaciones. Para poder acceder a un control en un formulario distinto del que contiene el foco, es necesario nombrar al control por su nombre completo, es decir, utilizando la sintaxis:
Nombre_Formulario!Nombre_del_Control
El formulario inicial en cualquier proyecto, se consigue accediendo al menú Herramientas/Opciones/Ficha Proyecto y, de la lista Formulario Inicial, escogeremos el nombre del formulario con el que se quiere iniciar la aplicación. Con cualquier formulario las operaciones posibles serán:
Show (Mostrar)
Sirve para mostrar en primer plano el formulario. La sintaxis es: Nombre_Formulario.Show
Load (Cargar)
Lleva a memoria el formulario, pero no lo visualiza. La sintaxis es: Load Nombre_Formulario
Hide (Ocultar)
Retira el formulario de la pantalla pero no lo descarga de memoria. La sintaxis es: Nombre_Formulario.Hide
Unload (Descargar)
Descarga de memoria el formulario, perdiéndose toda la información de sus variables. La sintaxis es: Unload Nombre_Formulario
EJERCICIO:
Crear una aplicación que muestre un formulario inicial preguntando la contraseña. Dicha contraseña no debe visualizarse en la pantalla. Si la contraseña es correcta, se mostrará un nuevo formulario que mostrará la hora y fecha actual y, tras introducir el usuario la fecha de su nacimiento, permita obtener los años vividos por esa persona. En caso que sea el cumpleaños, se debe felicitar al usuario. El número de intentos permitidos para introducir la contraseña es de tres. En caso de superar los intentos, el programa debe dar un mensaje de error al usuario y, tirarlo de la aplicación.
3.2.- SENTENCIAS DE CONTROL: BUCLES Y BIFURCACIONES
BUCLES DETERMINADOS
For Variable = Valor_Inicial To Ultimo_Valor [Step incremento]
[Declaraciones]
[Exit For]
[Declaraciones]
Next [Variable]
BUCLES INDETERMINADOS
Do [{While | Until} Condición] Do
[Declaraciones] [Declaraciones]
[Exit Do] [Exit Do]
[Declaraciones] [Declaraciones]
Loop Loop [{While | Until} Condición]
TOMA DE DECISIONES
SELECCIÓN SIMPLE SELECCIÓN MÚLTIPLE
If Condición_1Then Select Case Condición_de_testeo
Declaraciones_1 Case valor1
[ElseIf Condición_2 Then [Declaraciones_1]
Declaraciones_2]... [Case valor2
[Else [Declaraciones_2]]...
Declaraciones_n] [Case Else
End If [Declaraciones_n]]
End Select
donde valor1,... puede tomar cualquiera de las siguientes formas:
expresión1[, expresión2]...
expresión1 To expresión2
Is operador_relacional expresión
o cualquier combinación de las anteriores separadas por comas.
EJEMPLO:
Crear una aplicación que permita obtener el código ASCII de una tecla pulsada. Se necesita un botón que permita borrar la tecla anterior. Para ello, añadiremos los siguientes controles al formulario.
|
CONTROL |
PROPIEDAD |
VALOR |
|
Label |
Caption |
Pulsa una tecla |
|
Name |
lblPulsaTecla |
|
|
Text Box |
Name |
txtPulsaTecla |
|
Text |
(ninguno) |
|
|
Label |
Caption |
Valor ASCII |
|
Name |
lblValor |
|
|
Label |
Caption |
(ninguno) |
|
Name |
lblResultado |
|
|
BordeStyle |
1-Fixed single |
|
|
Command Button |
Caption |
Limpiar |
|
Name |
cmdLimpiar |
|
|
Default |
True |
Private Sub cmdLimpiar_Click()
txtPulsaTecla.Text = ""
lblResultado.Caption = ""
txtpulsaTecla.SetFocus
End Sub
Private Sub Form_Activate()
txtpulsaTecla.SetFocus
End Sub
Private Sub txtPulsaTecla_KeyDown(KeyCode As Integer, Shift As Integer)
Const vbKeyDelete = 46
Const vbKeyInsert = 45
Const vbKeyEnd = 35
Select Case Keycode
Case vbKeyDelete
lblResultado.Caption = "Presionado Suprimir"
txtpulsaTecla = "[[Suprimir] "
Case vbKeyInsert
lblResultado.Caption = "Presionado Insertar"
txtpulsaTecla = "[Insertar] "
Case vbKeyEnd
lblResultado.Caption = "Presionado Fin"
txtpulsaTecla = "[Fin] "
Case Else
End Select
End Sub
Private Sub txtPulsaTecla_KeyPress(KeyAscii As Integer)
If txtPulsaTecla.Text <> "" Then
txtPulsaTecla.Text = ""
End If
Select Case KeyAscii
Case 8
txtPulsaTecla.Text = "[Retroceso] "
Case 9
txtpulsaTecla = "[Tab] "
Case 13
txtpulsaTecla = "[Intro] "
Case Else
End Select
lblResultado.Caption = KeyAscii
End Sub
3.3.- FUNCIONES BÁSICAS INCORPORADAS
CONVERSIÓN DE TIPO DE DATOS
CDbl(expresión) CInt(expresión)
Conversión a tipo Doble. Conversión a tipo Integer.
CLng(expresión) CDate(expresión)
Conversión a tipo Long. Conversión a tipo Date.
etc.
FUNCIONES DE CALENDARIO
DateSerial(expresión) IsDate(expresión)
Devuelve el número de serie de la fecha indicada Verifica si un valor es del tipo Fecha/Hora.
Date Time
Devuelve la fecha actual. Devuelve la hora actual.
Now Day(Núm_serie)
Devuelve la fecha y hora actuales. Devuelve un entero entre 1 y 31.
Month(Núm_serie) Year(Núm_serie)
Devuelve un entero entre 1 y 12. Devuelve un entero entre 1753 y 2078.
etc.
FUNCIONES DE CADENA
Space(Num_espacios) String(Número, expr_cadena)
Crea una cadena formada por Num_espacios. Crea una cadena de caracteres repetidos.
Mid(expr_cadena, Inicio[, Long] ) Left(expr_cadena, Número)
Permite extraer subcadenas. Extrae los Número caracteres de la izquierda.
Right(expr_cadena, Número) Instr([Inicio,] cadena_1, cadena_2)
Extrae los Número caracteres de la derecha. Indica si cadena_2 está contenida en cadena_1
LCase(expr_cadena) UCase(expr_cadena)
Convierte a minúsculas. Convierte a mayúsculas.
StrComp(cadena_1, cadena_2) Trim(expr_cadena)
Compara cadena_1 y cadena_2. Elimina los espacios del principio y final.
RTrim(expr_cadena) LTrim(expr_cadena)
Elimina los espacios del final. Elimina los espacios del principio.
Format(expresión[, formato] )
Permite dar a una cadena o a un número un formato específico.
EJEMPLO:
Vamos a construir una aplicación que, al desplazarse el usuario con las teclas de cursor, se van iluminando los pixeles por los que pasa. Se necesitará un formulario para el área de dibujo con la propiedad AutoRedraw establecida a True. Finaliza al pulsar la tecla Fin
Dim AlturaPixel As Single, AnchuraPixel As Single
Dim XPunto As Single, YPunto As Single
Private Sub Form_Load()
AutoRedraw = True
ScaleMode = 3 'Pixels
AlturaPixel = ScaleHeight
AnchuraPixel = ScaleWidth
XPunto = AnchuraPixel / 2
YPunto = AlturaPixel / 2
End Sub
Private Sub Form_Resize()
AlturaPixel = ScaleHeight
AnchuraPixel = ScaleWidth
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim sino As Integer
Select Case KeyCode
Case vbKeyLeft
If XPunto <= 0 Then
XPunto = 0
Else
XPunto = XPunto - 1
End If
Case vbKeyRight
If XPunto >= AnchuraPixel Then
XPunto = AnchuraPixel
Else
XPunto = XPunto + 1
End If
Case vbKeyUp
If YPunto <= 0 Then
YPunto = 0
Else
YPunto = YPunto - 1
End If
Case vbKeyDown
If YPunto >= AlturaPixel Then
YPunto = AlturaPixel
Else
YPunto = YPunto + 1
End If
Case vbKeyEnd
sino = MsgBox("¿Estás seguro de que quieres terminar", 4)
If sino = 6 Then End 'Clic en el botón Sí
Case Else
Beep
End Select
PSet (XPunto, Ypunto) ‘Dibujar un punto
End Sub
EJERCICIOS:
Crear una aplicación que permita calcular la posición de los espacios en blanco de una cadena introducida por el usuario.
Crear una aplicación que, dada una frase, permita obtener el número de apariciones de cada vocal en la frase. El resultado debe aparecer indicado de forma clara.
Diseñar una aplicación que el usuario escoja entre introducir números o letras. Si escoge números, no se debe permitir introducir ninguna letra y, si escoge letras, no se debe permitir introducir ningún dígito.