capitulo4_eventos
TRANSCRIPT
LABORATORIO II - AÑO 2008
C A P I T U L O I V
I N D I C E D E C O N T E N I D O
IV. MANEJO DE EVENTOS...........................................................95
IV.1. Eventos generales.................................................................96
IV.2. Para saber los eventos que producen los controles .................96
IV.3. Secuencia de eventos ............................................................97
IV.4. Ciclo de vida de un formulario...............................................97
IV.4.i. Eventos para arrancar una aplicación ..............................98
IV.4.i.1. Creado.........................................................................98
IV.4.i.2. Cargado .......................................................................98
IV.4.i.3. Mostrado......................................................................99
IV.4.i.4. Eventos para terminar una aplicación............................99
IV.4.i.5. Descargado..................................................................99
IV.4.i.6. Eliminado...................................................................101
IV.4.ii. Ejemplo del ciclo de vida de un formulario......................102
IV.5. Otros eventos para Formulario............................................104
IV.6. Eventos LostFocus y GotFocus .............................................104
IV.7. Evento MouseDown, MouseUp y MouseMove .........................105
IV.8. Evento Click y DblClick.......................................................108
IV.9. Evento KeyPress ................................................................109
IV.9.i. Pasar a otro control sin usar la tecla Tab .......................113
IV.9.ii. Usar la tecla ESC para salir ...........................................113
IV.10. Eventos KeyDown y KeyUp ............................................114
IV.11. Evento DragDrop y DragOver ........................................116
IV.11.i. Las propiedades DragMode y DragIcon...........................117
IV.11.ii. METODO Drag ............................................................118
IV.11.iii. EVENTO DragOver......................................................120
IV.11.iv. EVENTO DragDrop .....................................................123
IV.12. Ejercicios propuestos ....................................................127
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 94
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 95
Mg. Ing. Fátima Martínez
IV. MANEJO DE EVENTOS
Visual Basic es un lenguaje orientado a eventos ya que la mayor parte del código a escribir corresponde a los procedimientos o funciones que se activan luego de producidos ciertos eventos (Birnios, B. y Birnios, M.; 2003:85).
En este capítulo se darán a conocer los eventos más habituales de Visual Basic. Cabe aclarar que VB tiene muchas más posibilidades de las que aquí se presentan.
Se ha dicho, en el Capítulo I, que los eventos son acciones que el usuario puede efectuar sobre el control y son reconocidas por éste. Ante un evento sobre un determinado control, VB arranca una determinada función o procedimiento que realiza la acción programada por el usuario para ese evento concreto. Un evento tiene la siguiente forma general:
Sub Objeto_Evento([argumentos]) - Sentencias
End Sub
Sentencias son las programadas por el usuario y se ejecutarán cuando ocurra el evento. Los eventos son, entonces, notificaciones que el objeto envía de que un suceso de importancia ha ocurrido. Estos son muy utilizados sobre todo en los controles.
Argumentos son los datos que se pasan al procedimiento Sub para que se ejecuten las sentencias.
Los eventos deben ser seleccionados desde la ventana del Editor de Código que aparece cuando se hace doble Clic sobre el control. El código describe los sucesos que se ejecutarán cuando suceda el evento sentarse.
1. Ejemplo de Eventos
El objeto silla puede tener un evento Sentarse. Las acciones para este evento serán:
Sub Silla_Sentarse() Peso es Variable Si Peso es mayor a 100kg, entonces: Silla.Romper
Sillas.Patas=0 Sino
Silla.Soportar Fin de Secuencia Si End Sub
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 96
IV.1. Eventos generales
El usuario de Windows está familiarizado con los eventos pero es posible que nunca se haya detenido a pensar en ello. A continuación se presentan los eventos más comunes que reconoce VB. Cada clase de objeto tiene sus propios eventos, pero no todos los objetos soportan los mismos eventos; algunos no están disponibles en los demás. En el caso de los eventos del ratón, casi la mayoría los aceptan.
Para saber qué eventos puede recibir un control determinado se lo selecciona y luego se pulsa la tecla F1 de la Ayuda, de esta manera se abre una ventana que explica el control y permite acceder a los eventos que soporta.
El evento Click es el principal de todos los controles, pero en una aplicación se pueden producir muchos eventos generados por el usuario o incluso el programa puede generar otros.
La siguiente tabla muestra los eventos más importantes comunes a varios controles.
Evento Se produce cuando
Change El usuario modifica el estado de un control.
DblClick El usuario pulsa dos veces un objeto con el botón primario del mouse.
DragDrop El usuario arrastra un control con el botón primario del mouse.
DragOver Un objeto se arrastra sobre un control.
GotFocus Un objeto recibe el foco.
KeyDown Se pulsa una tecla mientras un objeto tiene el foco.
KeyPress Se pulsa y se suelta una tecla mientras un objeto tiene el foco.
KeyUp Se suelta una tecla mientras un objeto tiene el foco.
Load Se carga un objeto en memoria.
LostFocus Un objeto perdió el foco.
MouseDown Se pulsó un botón del mouse sobre un objeto.
MouseMove Se movió el cursor del mouse sobre un objeto.
MouseUp Se soltó un botón del mouse sobre un objeto.
UnLoad Se descarga un objeto de memoria.
IV.2. Para saber los eventos que producen los controles
Para saber los eventos que un control puede aceptar, al menos los que el Visual Basic nos permite, en la ventana de código, en la parte izquierda se selecciona el control o formulario y en la derecha están los eventos que se pueden codificar.
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 97
Mg. Ing. Fátima Martínez
En estas imágenes se pueden ver las listas de objetos disponibles (a la izquierda) y de los eventos permitidos para el control formulario (a la derecha).
IV.3. Secuencia de eventos
Hasta ahora se han visto eventos individuales, pero en general una acción del usuario puede desencadenar una secuencia de eventos. Para controlar con éxito la aparición y el comportamiento de los formularios (y también de los controles) en tiempos de ejecución, debe comprenderse en qué orden se disparan los eventos.
Es importante también comprender que un evento inicia automáticamente con frecuencia a otro evento, produciendo un efecto en cascada. Por ejemplo un evento KeyPress no puede ser disparada sin disparar también lo eventos KeyUp y KeyDown.
Conocer la secuencia de activación de los eventos permite decidir dónde ubicar el código en respuestas a un evento.
IV.4. Ciclo de vida de un formulario
Comprender el ciclo de vida de un formulario es básico para el programador de Visual Basic, puesto que son estos elementos los que permitirán al usuario interactuar con la aplicación. Sólo comprendiendo qué acciones podrán realizarse sobre los formularios y en qué momentos podremos controlar
Se despliegan los objetos del formulario.
Se despliegan los eventos disponibles para el control seleccionado. seleccionado.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 98
adecuadamente la ejecución de nuestros programas1. (Ordovás Oromendía y Lema Osca; 1999: 8).
En la vida de un formulario puede pasar por cinco estados diferentes. En orden cronológico son: creado, cargado, mostrado, descargado, eliminado.
IV.4.i. Eventos para arrancar una aplicación
Cuando se arranca un aplicación, o más concretamente cuando se visualiza por primera vez un formulario se producen los siguientes eventos consecutivos: Initialize, Load, Activate y Paint.
Initialize Inicializa datos cuando se carga el formulario.
Load Se emplea para el código de inicialización adicional. Comienza cargando el formulario en memoria.
Activate Cuando el formulario pasa a ser la ventana activa. Sólo puede ocurrir cuando un objeto es visible.
Paint
Se ejecuta cada vez que algún objeto o sector del formulario necesita ser coloreado. Si la propiedad AutoRedraw (booleana) tiene el valor True no se dispara nunca, por lo que no hace falta agregar código a Paint.
IV.4.i.1. Creado
El formulario existe como objeto, pero todavía no es visible. Cuando un formulario está siendo creado, se genera el evento Initialize. En esta fase del proceso de carga de un formulario no podemos actuar sobre los objetos que lo componen. (Ordovás Oromendía y Lema Osca; 1999: 5)
Se suele utilizar el evento Initialize para inicializar variables definidas a nivel de módulo que tiene lugar antes que el Load.
IV.4.i.2. Cargado
Cuando se inicia el proceso de carga de un formulario, se genera el evento Load. Ya se puede acceder a los controles del formulario, pero todavía no esta visible. Un formulario se encuentra en este estado en el proceso de carga, cuando se oculta o cuando se establece a False su propiedad Visible.
1 Jorge Ordovás Oromendía y Vicente Lema Osca; 1999; Curso de Visual Basic Avanzado;
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 99
Mg. Ing. Fátima Martínez
El evento Load se suele utilizar para dar valores a sus propiedades y a los controles contenidos en él.
IV.4.i.3. Mostrado
Es el estado normal de un formulario. Podemos acceder a todos los elementos que lo componen y podemos actuar sobre ellos, pues el formulario esta visible. Durante este estado, cada vez que hay que repintar el formulario (por ejemplo, cuando una ventana que se ha situado sobre éste desaparece) se genera el evento Paint. Además, si el formulario recupera el foco después de haberlo perdido (por ejemplo, al cambiar a otra aplicación con [Alt]+[Tab] y volver después al formulario), se genera el evento Activate.
IV.4.i.4. Eventos para terminar una aplicación
Cuando un formulario se cierra o elimina se producen los siguientes eventos en este orden: QueryUnload, Unload y Terminate.
QueryUnload
Se dispara por un evento Unload, antes de ejecutar el código para este evento. Ofrece la posibilidad de detener el cierre de un formulario. Ideal cuando se cierra el formulario y hay datos que no se guardaron.
UnLoad Se dispara cuando el usuario cierra el formulario y está a punto de descargarse.
Terminate Se produce cuando se elimina de memoria el formulario.
IV.4.i.5. Descargado
Una vez terminado el proceso de descarga el formulario no es visible, y sus componentes no son accesibles. Este proceso se produce cuando se cierra el
formulario: pulsando el botón cerrar, ejecutando el método Unload del formulario, etc.
El proceso de descarga de un formulario genera a su vez dos eventos en el siguiente orden: QueryUnload y Unload. En general, se aprovechan para
Nota El evento Load no se puede utilizar para dibujar o imprimir sobre el formulario porque todavía no está disponible para esas operaciones. Para
realizarlas se utiliza en cambio el evento Paint u otro posterior, por
ejemplo GotFocus, pero no Load.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 100
liberar la memoria ocupada por los elementos que pertenecen al formulario antes de que este se cierre, salvar el trabajo que esté pendiente de guardado, etc.
El evento Unload se desencadena porque un usuario cierra el formulario mediante el botón cerrar ý o el comando Cerrar del menú de control o una sentencia Unload2.
En los dos eventos podemos detener el proceso de descarga estableciendo el valor del parámetro Cancel a cualquier número distinto de 0.
El parámetro Cancel, es un entero que determina si el formulario es descargado. Si Cancel = 0, el formulario se descarga. Si Cancel = True se impide que el formulario sea descargado.
2. Ejemplo del uso
del evento Unload
Antes de que se intente cerrar el formulario se pregunta mediante una caja de mensaje. En caso afirmativo se cierra el formulario de lo contrario no ha pasado nada: Sub Form_Unload(Cancel As Integer)
If MsgBox(“¿Esta seguro de cerrar la ventana?”, VbYesNo + vbQuestion, “Mensaje”)= vbNo Then
Cancel = True End If
End Sub
3. Ejemplo del uso de
QueryUnload
Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("¿Está seguro de salir de la aplicación?", vbYesNo, "Atención") = vbNo Then
Cancel = True End If
End Sub
2 Descarga un formulario de memoria. Su sintaxis Unload NombreDelFormulario. Use la palabra Me para referirse al formulario actual: Unload Me
Nota Si se cierra la aplicación mediante un botón de comando Salir o con
un End, no se pasa por el evento Unload. Cuando se finaliza la aplicación con la sentencia End no se desencadena ningún evento de los formularios
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 101
Mg. Ing. Fátima Martínez
IV.4.i.6. Eliminado
Aunque esté descargado un formulario, mientras existe cualquier referencia al mismo, no está totalmente eliminado de memoria. Cuando se lo elimina se genera el evento Terminate y el formulario desaparece de memoria.
4. Ejemplo completo de los eventos:
Initialize, Activate y QueryUnload
Botón Salir para terminar la aplicación.
Código de los eventos: Option Explicit
Dim inicio As Integer, finaliza As Integer
Private Sub cmdSalir_Click()
'Botón de comando Salir
Unload Me 'Sentencia para terminar la aplicación
End Sub
Private Sub Form_Activate()
'Determina desde donde se selecciona el texto
txtTexto.SelStart = inicio 'Inicio de la selección primer caracter
txtTexto.SelLength = finaliza 'donde termina la selección al final del texto
End Sub
Private Sub Form_Initialize()
'Carga la caja de texto
txtTexto = "Texto seleccionado"
'Inicializa las variables
inicio = 0 'valor donde inicia la selección
finaliza = Len(txtTexto) 'largo del texto
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'Antes de salir pregunta si quiere finalizar
If MsgBox("¿Esta seguro que desea finalizar?", vbYesNo, "Finaliza") = vbNo Then
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 102
Cancel = True
End If
End Sub
5. Ejemplo completo de los
eventos: Initialize, Activate, QueryUnload, Unload y Terminate
Termina la aplicación desde el botón cerrar de la ventana o el comando Cerrar del menú Control.
Código de los eventos: Option Explicit
Dim inicio As Integer, finaliza As Integer
Private Sub Form_Activate()
txtTexto.SelStart = inicio
txtTexto.SelLength = finaliza
End Sub
Private Sub Form_Initialize()
txtTexto = "Texto seleccionado"
inicio = 0
finaliza = Len(txtTexto)
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("¿Esta seguro que desea salir?", vbYesNo + vbQuestion, "Finaliza") = vbNo Then
Cancel = True
End If
End Sub
Private Sub Form_Terminate()
'Termina la aplicación y quita de la memoria el formulario
MsgBox "Finaliza la aplicación", vbCritical, "Atención!"
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Descarga el formulario
MsgBox "Se descarga el formulario", vbExclamation, "Atención!"
End Sub
IV.4.ii. Ejemplo del ciclo de vida de un formulario
Este es un ejemplo (Ordovás Oromendía. y Lema Osca; 1999:12) para mostrar los estados por los que pasa un formulario durante su ciclo de vida. Además, se comprobará cómo un formulario no se elimina de memoria hasta que no se liberan todas las referencias al mismo en el programa.
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 103
Mg. Ing. Fátima Martínez
1. Se crean dos formularios: Form1 y Form2.
2. En el formulario 1, insertaremos código en las subrutinas Initialize, Load, Activate, Paint, QueryUnload, Unload y Terminate, para que cada vez que se lance el evento correspondiente mostremos un mensaje con el nombre del formulario y el nombre del evento. En el evento Paint se escribe sobre el formulario el nombre del formulario mediante el método Print.
3. Añadiremos código en el evento Click del botón para mostrar el formulario 2. También mantendremos una referencia al formulario 2 (para evitar que se lance su evento Terminate al cerrarse).
4. Insertaremos código en las subrutinas Load, Paint, Unload y Terminate del formulario 2, para mostrar un mensaje con el nombre del formulario y del evento que se produce en cada caso.
6. Ejemplo completo de los
eventos: Initialize, Load, Activate, Paint, QueryUnload, Unload y Terminate
Se reconocen los eventos que un formulario puede recibir, así como el orden en el que se reciben.
Código de los eventos del Formulario 1: Private Sub cmdMostrar_Click()
Formulario2.Show 'Carga y muestra el formulario 2
Form1.Hide 'Oculta el formulario 1
End Sub
Private Sub Form_Activate()
MsgBox "Formulario1: Se Activa", vbInformation, "Evento Activate"
End Sub
Private Sub Form_Initialize()
MsgBox "Formulario1: Se Inicializa", vbInformation, "Evento Initialize"
End Sub
Sub Form_Load()
MsgBox "Formulario1: Se Carga", vbInformation, "Evento Load"
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
MsgBox "Formulario1: Antes de descargar", , "Primer Formulario"
End Sub
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 104
Private Sub Form_Paint()
MsgBox "Formulario1: Se Muestra", vbInformation, "Evento Paint"
Print "Formulario1" 'Escribe sobre el formulario actual
End Sub
Private Sub Form_Terminate()
MsgBox "Formulario1: Finaliza", , "Primer Formulario"
End Sub
Private Sub Form_Unload(Cancel As Integer)
MsgBox "Formulario1: Se Descarga", , "Primer Formulario"
End Sub
Código de los eventos del Formulario 2: Private Sub Form_Load()
MsgBox "Formulario2: Se Carga", , "Segundo Formulario"
End Sub
Private Sub Form_Paint()
MsgBox "Formulario2: Se Muestra", , "Segundo Formulario"
Print "Formulario2" 'escribe sobre el formulario actual
End Sub
Private Sub Form_Terminate()
MsgBox "Formulario2: Finaliza", , "Segundo Formulario"
End Sub
Private Sub Form_Unload(Cancel As Integer)
MsgBox "Formulario2: Se Descarga", , "Segundo Formulario"
Form1.Show 'Muestra el formulario 1
End Sub
IV.5. Otros eventos para Formulario
Otro evento para un formulario es Resize: se dispara cuando se modifica el tamaño del formulario o cuando se carga por primera vez. Esto permite realizar acciones como mover o cambiar el tamaño de los controles de un formulario cuando han cambiado sus dimensiones.
El evento que realiza la operación inversa a Activate es Deactivate, ocurre cuando un formulario deja de ser la ventana activa. Estos eventos son adecuados para iniciar o finalizar acciones del formulario. Por ejemplo, en el evento Activate podríamos escribir código para resaltar el texto de un determinado cuadro de texto; con el evento Deactivate podríamos guardar los cambios efectuados en un archivo o en una base de datos.
IV.6. Eventos LostFocus y GotFocus
En todas las aplicaciones de Windows, en cualquiera de sus versiones, siempre hay un único control, formulario o ventana que puede recibir entradas desde teclado. En
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 105
Mg. Ing. Fátima Martínez
cada comento ese control, ventana o formulario es el que dispone del foco (focus) (García de Jalón y otros; 1999:50).
El control que tiene el foco aparece resaltado con letra negrita, con un contorno más vivo o con el cursor titilando en él. El foco puede pasar de un objeto a otro por código, porque el usuario ha cliqueado en él o ha pulsado la tecla [Tab].
Cuando un control se convierte en activo y recibe el foco, produce el evento GotFocus; de igual forma, cuando deja de ser el control activo, hace sonar la alarma mediante el evento LostFocus.
El control en el que suele usarse estos eventos, de forma más habitual, es el TextBox.
7. Ejemplo de LostFocus
El siguiente código evitará que un cuadro de texto llamado txtNombre esté vacío antes de pasar a otro control.
Private Sub txtNombre_LostFocus() 'Chequea que no esté vacío If txtNombre = "" Then 'Si esta vacío no pasa a otro control Beep 'pitea 'mantiene el foco txtNombre.SetFocus Else 'Si no está vacío pasa el foco txtCodigo.SetFocus End If End Sub
8. Ejemplo de GotFocus
El siguiente código inicializa las propiedades del control cuando tenga el foco.
Private Sub txtCodigo_GotFocus() txtCodigo.PasswordChar = "?" txtCodigo.FontName = "Arial" txtCodigo.FontSize = 14 txtCodigo.FontBold = True End Sub
IV.7. Evento MouseDown, MouseUp y MouseMove
El evento MouseDown se produce cuando se pulsa un botón del ratón. Con los parámetros que tiene este evento se puede conocer el botón pulsado (Button), la
Nota El método SetFocus permite dar el foco al objeto al que se aplica.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 106
posición dentro del control (X, Y) y si se está pulsando la tecla [Sh i f t ], [Ct r l ] o [A l t] (Shift).
Para un objeto formulario:
Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
El evento MouseUp se produce cuando se suelta el botón que había sido pulsado. Los parámetros son los mismos que para MouseDown, pero en este caso lo que se detecta es cuando se suelta el botón pulsado.
Vamos a ver los parámetros y algunos de los valores disponibles.
Parámetro Valores posibles
Button Indica el botón que se está pulsando. Puede tener los siguientes valores: 1 → se está pulsando o soltado el botón izquierdo, 2 → se está pulsando o soltado el derecho, 4 → se está pulsando o soltado el botón central. Sólo se controla un botón a la vez.
Shift Indica si se está pulsando algunas de las teclas: [Shift], [Ctrl] o [Alt].
El valor devuelto corresponde con:
1 → se está pulsando la tecla [Shift]
2 → se está pulsando [Control]
4 → se está pulsando [Alt]
Se permiten combinaciones de estos valores, es decir que si se pulsan varias de esas teclas, los valores serán:
3 → se están pulsando [Shift] y [Ctrl],
5 → se están pulsando [Shift] y [Alt],
6 → se están pulsando [Ctrl] y [Alt],
7 → se están pulsando las tres teclas.
X, Y Indica las coordenadas de la posición del puntero del ratón dentro del control. Es importante saber que estos valores son sólo dentro del control en cuestión, no referente al formulario o la pantalla.
El evento MouseDown se suele usar, entre otras cosas, para mostrar menús emergentes (PopUpMenus), normalmente controlando que se haya pulsado el botón derecho (cuando Button vale 2).
El evento MouseMove se produce cada vez que se mueve el ratón sobre un control o formulario.
Los parámetros de este procedimiento son los mismos que en los otros referentes al ratón:
Para cualquier control por ejemplo en un formulario:
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 107
Mg. Ing. Fátima Martínez
Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
9. Ejemplo de
MouseDown y MouseUp
Este ejemplo se utiliza para dibujar sobre un formulario.
Option Explicit Dim Now As Boolean ‘Declara una variable del
tipo True/False
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'Empieza a dibujar, presiona el mouse sobre el formulario
Now = True 'Activa el dibujo. End Sub Private Sub Form_MouseUp(Button As Integer,
Shift As Integer, X As Single, Y As Single)
'Termina de dibujar, levanta el mouse
Now = False 'Desactiva el dibujo. End Sub Private Sub Form_MouseMove(Button As Integer,
Shift As Integer, X As Single, Y As Single)
If Now Then PSet (X, Y) 'Método gráfico, dibuja un punto.
End If End Sub
Private Sub Form_Load() ‘Inicializa en la carga DrawWidth = 5 'Propiedad del formulario actual, pincel ancho.
ForeColor = RGB(0, 0, 255) 'Propiedad del formulario actual, color del dibujo.
End Sub
10. Ejercicio que inicia preguntando si
“Está conforme con el sueldo” que gana. Seguro que la mayoría va a contestar que “No”, entonces mediante un truco cuando quieran hacer Click en el Botón de No, este se mueve a una nueva posición aleatoriamente entre las medidas de ancho y alto del formulario.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 108
Con el Botón Si, salimos del programa.
Código de los eventos de cada botón: Private Sub cmdNo_Click()
MsgBox "Sufre el mismo mal que millones de Argentinos!!"
End Sub
Private Sub cmdUno_Click()
End
End Sub
Código del evento MouseMove del botón ‘NO’: Private Sub cmdNo_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
'Mueve el control para que no puedan hacer clic en él
'Transforma en entero con la función CInt() el valor de las coordenadas X y de Y
cmdNo.Move CInt(Rnd * (Width - cmdNo.Width)), CInt(Rnd * (Height - cmdNo.Height))
End Sub
IV.8. Evento Click y DblClick
El evento Click se produce cuando se hace clic en un control.
Es una combinación del MouseDown seguido de un evento MouseUp y por último Click. Se producen los tres eventos en ese orden: primero se presiona, después se suelta y por último se produce el clic.
El DblClick se produce cuando se hace una doble pulsación, un doble clic.
Normalmente se producen en este orden: primero el MouseDown, seguido de un MouseUp, a continuación un Click seguido de un DblClick y por último un MouseUp.
11. Ejemplo de
Click y DoubleClick
Private Sub Form_Click() Print "Se ha pulsado sobre el formulario (Click)"
End Sub Private Sub Form_DblClick()
Print "Doble pulsación en el formulario (DblClick)"
End Sub Private Sub Form_MouseDown(Button As Integer,
Shift As Integer, X As Single, Y As Single)
Print "Se ha pulsado el botón del ratón (MouseDown)"
End Sub
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 109
Mg. Ing. Fátima Martínez
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Print "Se ha soltado el botón del ratón (MouseUp)"
End Sub
IV.9. Evento KeyPress
Este evento se produce cada vez que se pulsa una tecla, al menos una tecla normal, las especiales no se consideran normales y no se suelen detectar en este evento. (Som, G.; 1998).
Con el evento KEYPRESS se pueden detectar todas las teclas las alfanuméricas y otros caracteres, además de la tecla [E N T E R ], salvo la tecla [TAB] ya que es una tecla especial.
La información que acepta este evento como parámetro es KeyAscii, indica el código de la tecla pulsada. Este código da un valor numérico, no una cadena. Por ejemplo, para un control cuadro de texto llamado Text1:
Text1_KeyPress(KeyAscii As Integer)
Si se pulsa la tecla A mayúscula, KeyAscii valdrá 65, ya que ese es su valor ASCII.
Los valores Ascii se pueden saber usando la función ASC y hacer una comparación de este tipo:
Para un control cuadro de texto llamado Text1: If KeyAscii = Asc("A") Then
MsgBox “Se ha pulsado la A mayúscula” End if
Suele detectarse la pulsación de la tecla [ENTER], entre otras cosas, porque emite un pitido cada vez que se pulsa
Ejemplo del
KeyPress en cajas de texto
Por ejemplo en las cajas de texto, para evitar ese "pitido", se puede hacer esto: If KeyAscii = vbKeyReturn Then KeyAscii = 0 'Eliminamos el pitido End If
Con esta asignación KeyAscii = 0 , se le indica a VB que no se ha pulsado nada o al menos se le dice que no tenga en cuenta que se ha pulsado esa tecla.
Nota Para saber el valor de las teclas se puede pulsar [F2 ] para abrir el Examinador de objetos y buscar las constantes de KeyCode. También en la ayuda se busca la palabra KeyCode.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 110
12. Ejemplo del KeyPress, GotFocus y
QueryUnload
En este ejemplo se programan los controles para que el cursor avance con [ENTER] al ingresar los datos.
La caja de texto de Fecha de Hoy se carga automática, desde el evento GotFocus, con la fecha actual (del sistema) y está todo el tiempo bloqueada.
Las cajas de texto: Nombre, Apellido y Nombre completo, pertenecen a un arreglo de cajas de texto txtDatos(i).
A partir de Nombre se programa el evento KeyPress para que pase al siguiente control y de allí al botón Mostrar que concatena el nombre con el apellido.
La aplicación termina con el botón Salir o con la tecla [ESC]. Antes se pregunta si se desea finalizar, para ello se programa la descarga del formulario con el evento QueryUnload.
Código del evento KeyPress para el arreglo:
Private Sub txtDatos_KeyPress(Index As Integer, KeyAscii As Integer)
'Se utiliza ENTER para pasar al siguiente control
If KeyAscii = 13 Then 'Si la tecla presionada es ENTER
If Index < 1 Then 'Que no pase del Indice 1 del arreglo
txtDatos(Index + 1).SetFocus 'Pasa el foco al siguiente elemento del arreglo
Else
cmdMostrar.SetFocus 'Si no pasa el foco al siguiente control
End If
End If
End Sub
Código del evento GotFocus para la caja de texto Fecha:
Private Sub txtFecha_GotFocus()
'Se introduce automáticamente la fecha
txtFecha.Text = Format(Now, "dd-mm-yyyy") ‘Función para dar formato a la fecha
txtDatos(0).SetFocus 'Vuelve el foco al primer elemento del arreglo
End Sub
Código del evento QueryUnload para descargar el Formulario:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("¿Está seguro que desea salir?", vbYesNo, "Finalizar") = vbNo Then
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 111
Mg. Ing. Fátima Martínez
Cancel = True
'Detiene la descarga del formulario
txtDatos(0).SetFocus 'Pone el foco en el 1º cuadro de texto del arreglo
End If
End Sub
Código del botón Salir:
Private Sub cmdSalir_Click()
Unload Me ‘Instrucción para descargar
End Sub
Código del botón Limpiar:
Private Sub cmdLimpiar_Click()
'Borra todos los elementos del arreglo de cajas de texto
For i = 0 To 2
txtDatos(i) = ""
Next i
txtDatos(0).SetFocus 'Pasa el foco al primer elemento
End Sub
Código del botón Mostrar:
Private Sub cmdMostrar_Click()
'el botón Muestra concatena Nombre y Apellido
For i = 0 To 1
txtDatos(2) = txtDatos(2) & " " & txtDatos(i)
Next i
cmdLimpiar.SetFocus 'Muestra y pasa al siguiente control
End Sub
13. Ejemplo del evento KeyPress
En este ejemplo se usa el evento KeyPress en el cuadro de texto “Otro color”.
Detecta si la tecla presionada es [ENTER].
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 112
Código de todos los botones: Private Sub cmdAgrega_Click()
'si caja de texto no esta vacía
If txtElem <> "" Then
'Se agrega al final de lista
lstColores.AddItem txtElem
'Se vacia el contenido de caja de texto
txtElem = ""
End If
' Actualiza el valor de los índices
lblTotal = lstColores.ListCount
lblActual = lstColores.ListIndex
lstColores.SetFocus 'Vuelve el foco a las lista de colores
End Sub
Private Sub cmdElimina_Click()
'Si hay un elemento seleccionado
If lstColores.ListIndex <> -1 Then
'Elimina el elemento actual
lstColores.RemoveItem lstColores.ListIndex
End If
' Actualiza el valor de los índices
lblTotal = lstColores.ListCount
lstColores.ListIndex = 0
lblActual = lstColores.ListIndex
lstColores.SetFocus 'Vuelve el foco a las lista de colores
End Sub
Private Sub cmdModif_Click()
'Si hay un elemento seleccionado
If lstColores.ListIndex <> -1 Then
'El elemento actual es ubicado en el cuadro de texto
txtElem = lstColores.List(lstColores.ListIndex)
lblActual = lstColores.ListIndex 'Actualiza el indice del elemento actual
txtElem.SetFocus 'lleva el foco al cuadro de texto
End If
End Sub
Private Sub cmdSalir_Click()
End
End Sub
Private Sub Form_Load()
lstColores.ListIndex = 0
lblActual = lstColores.ListIndex
lblTotal = lstColores.ListCount
End Sub
Private Sub lstColores_Click()
lblActual = lstColores.ListIndex
End Sub
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 113
Mg. Ing. Fátima Martínez
Código del evento KeyPress : Private Sub txtElem_KeyPress(KeyAscii As Integer)
'Si se presiona la tecla Enter en el cuadro de texto
If KeyAscii = 13 Then
lstColores.RemoveItem lstColores.ListIndex 'Elimina de la lista
'Agrega en el índice Actual lo que tiene el cuadro de texto
lstColores.AddItem txtElem, lblActual.Caption
lstColores.SetFocus 'lleva el foco a la lista de colores
End If
End Sub
IV.9.i. Pasar a otro control sin usar la tecla Tab
Cuando se pulsa [E N T E R ] se puede pasar al siguiente control, de la misma forma que si se hubiera pulsado la tecla T A B . Para conseguirlo, la propiedad
TabStop de los controles debe estar activa, (si tiene el valor FALSE no se puede usar T A B para cambiar de control). Además se debe decir a Windows que se ha pulsado T A B no [E N T E R ]; esto con el código:
14. Ejemplo para
pasar a otro control sin la tecla [TAB]
Para pasar al siguiente control como si se pulsara la tecla TAB: Private Sub text1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then SendKeys ("{TAB}") KeyAscii = 0 'Elimina el pitido
End if End Sub
IV.9.ii. Usar la tecla ESC para salir
Si se tiene un botón de comando encargado de cerrar el programa con la propiedad Cancel = TRUE, se puede ejecutar su acción pulsando la tecla [ESC] .
Otra manera es mediante un procedimiento a nivel de formulario para detectar si la tecla presionada es [ESC] . Primero se debe modificar la propiedad del
formulario KeyPreview a True de manera de que éste procese el evento KeyPress en el formulario antes que los otros controles.
15. Ejemplo
KeyPress
Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyEscape Then 'Se ha pulsado ESC Unload Me 'Se descarga el formulario
Nota: Se usa la instrucción SendKeys para que envíe una tecla [TAB]. Para conocer otras teclas a enviar con SendKeys consultar la Ayuda.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 114
para salir con la tecla [ESC]
ElseIf KeyAscii = vbKeyReturn Then 'Se ha pulsado ENTER 'Se borra la tecla pulsada para que no "pite" KeyAscii = 0 SendKeys "{TAB}" 'Se envía una pulsación TAB
End If End Sub
IV.10. Eventos KeyDown y KeyUp
KeyDown se produce cuando se presiona la tecla; KeyUp cuando se suelta. Sirven
para tener un mayor control en las teclas pulsadas. La principal diferencia con el evento KeyPress es que los códigos no son ASCII , sino códigos de teclado.
Los parámetros por ejemplo para un control cuadro de texto llamado Text1:
Text1_ KeyDown(KeyCode As Integer, Shift As Integer )
Parámetro Valores posibles
KeyCode Código de la tecla. Puede coincidir en algunos casos con el código ASCII, no siempre. Sus valores se pueden ver presionando la tecla [F2].
Shift Indica si se está pulsando algunas de las teclas: [S h i f t ], [C t r l ] o [A l t]. Sus valores son los mismos que para el evento de ratón.
Para que un formulario procese estos eventos Keyxxx a nivel de formulario, antes que los controles, debe tener la propiedad KeyPreview en True.
16. Ejemplo de KeyDown
En el ejemplo se ejecuta el evento KeyDown en las cajas de texto para detectar las teclas de movimiento: Incio, Fin, Flecha abajo, Flecha arriba, Flecha a la derecha, Flecha a la izquierda, Borra a la derecha.
La aplicación empieza posicionado el cursor en la 2º caja de texto. De allí pasa
Nota: Tener en cuenta al utilizar KeyPress en un formulario, para controlar la pulsación de las teclas, que si un botón para salir tiene asignada TRUE en la propiedad Cancel, el formulario no procesarán antes esas pulsaciones.
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 115
Mg. Ing. Fátima Martínez
a la Anterior con Flecha abajo y a la Siguiente con Flecha arriba . La etiqueta superior informa cuál es la tecla de movimiento presionada.
Se programa el evento en el formulario el evento KeyPress para pasar de un control a otro con la tecla [ENTER] (la propiedad Preview del formulario está en True).
El botón Salir finaliza con la aplicación, también si se pulsa la tecla [ESC] programada en el evento KeyPress.
Código para el evento KeyDown: Private Sub txtAnterior_KeyDown(KeyCode As Integer, Shift As Integer)
'caja de texto Superior
If KeyCode = vbKeyDown Then
lblTecla = "Flecha abajo"
txtPrim.SetFocus 'Pasa el foco al control siguiente
End If End Sub Private Sub txtPrim_KeyDown(KeyCode As Integer, Shift As Integer)
'Inicia en esta caja de texto
If KeyCode = vbKeyHome Then
lblTecla = "De Inicio"
ElseIf KeyCode = vbKeyEnd Then
lblTecla = "De Fin"
ElseIf KeyCode = vbKeyLeft Then
lblTecla = "Flecha a la izquierda"
ElseIf KeyCode = vbKeyRight Then
lblTecla = "Flecha a la derecha"
ElseIf KeyCode = vbKeyBack Then
lblTecla = "Borra a la derecha"
ElseIf KeyCode = vbKeyDown Then
lblTecla = "Flecha abajo"
txtSiguiente.SetFocus 'Pasa el foco al control siguiente
ElseIf KeyCode = vbKeyUp Then
lblTecla = "Flecha arriba"
txtAnterior.SetFocus 'Pasa el foco al control anterior
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 116
End If End Sub Private Sub txtSiguiente_KeyDown(KeyCode As Integer, Shift As Integer)
'Caja de texto Inferior
If KeyCode = vbKeyUp Then
lblTecla = "Flecha arriba"
txtPrim.SetFocus 'Pasa el foco al control anterior
ElseIf KeyCode = vbKeyDown Then
lblTecla = "Flecha abajo"
cmdSalir.SetFocus 'Pasa el foco al control siguiente
End If End Sub
Código del evento KeyPress para salir con [ESC] o para saltar con [ENTER]:
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyEscape Then 'Se ha pulsado ESC
Unload Me 'Se descarga el formulario
ElseIf KeyAscii = vbKeyReturn Then 'Se ha pulsado ENTER
KeyAscii = 0 'Se borra la tecla pulsada para que no "pite"
SendKeys "{TAB}" 'Se envía una pulsación TAB para pasar a otro control
End If
End Sub
IV.11. Evento DragDrop y DragOver
Una de las peculiaridades del entorno Windows es “arrastrar y soltar objetos”, de este modo se copian ficheros, se cambian objetos de lugar (iconos, la barra de tareas, etc.)
El Drag & Drop es una forma visual de representar el movimiento de algo. Para ello se toma algo de una parte de la interface gráfica, mediante la operación de colocar el puntero del ratón y pulsar su botón izquierdo sobre ese algo que se quiere tomar. Sin dejar de pulsar el botón izquierdo del ratón se desliza (se arrastra) el puntero del ratón hasta el punto de la interface gráfica donde lo queremos dejar. Ese punto puede ser un control o un formulario. Una vez en el
Nota: Tener en cuenta al utilizar algún evento Keyxxx en un formulario, para controlar la pulsación de las teclas, que si el botón en cuestión tiene asignada TRUE en la propiedad Default, el formulario no procesarán antes esas pulsaciones.
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 117
Mg. Ing. Fátima Martínez
punto de destino se suelta el botón del ratón y se “deja caer” lo que habíamos tomado en el punto de origen (Suárez Bernardo, L; 1998).
Para realizar esto, Visual Basic dispone de propiedades, métodos y eventos.
El efecto de “tomar” algo de un control se denomina DragOver, y el efecto de dejar caer se denomina DragDrop.
El Drag & Drop tiene un efecto visual muy didáctico, pero en realidad no toma nada del control origen ni lo suelta al llegar a destino. Estas acciones se realizan mediante código en los eventos adecuados: MouseDown, DragOver, DragDrop, dando los valores adecuados a las propiedades DragMode y DragIcon, y utilizando el método Drag.
El evento DragOver sucede mientras se está arrastrando un objeto sobre un control. Suele utilizarse para variar la forma del cursor que se mueve con el ratón dependiendo de si el objeto sobre el que se encuentra el cursor en ese momento es válido para soltar o no. El evento DragDrop sucede al concluir una operación de arrastrar y soltar.
El evento DragOver requiere los argumentos que se muestran a continuación:
Para un control cuadro de texto llamado Text1: Private Sub Text1_DragOver(Source As Control, _ X As Single, Y As Single, State As Integer)
. . . End Sub
Parámetro Valores posibles
Source contiene el objeto que está siendo arrastrado
X, Y indican la posición del objeto arrastrado dentro del sistema de coordenadas del objeto sobre el que se está arrastrando
State Vale: 0 - si está entrando; 1 - si está saliendo; 2 - si permanece dentro del mismo objeto.
IV.11.i. Las propiedades DragMode y DragIcon
Los controles tienen una propiedad llamada DragMode que establece si el arrastre se iniciará y finalizará a través del código, con el método Drag, en modo de arrastre manual o si se usará el modo automático en una operación de arrastrar.
Nota: el evento DragOver pertenece al objeto sobre el que se arrastra, no al objeto que es arrastrado.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 118
Sintaxis: ControlOrigen.DragMode [= número] Donde número puede tomar los valores 0 (Manual, valor predeterminado) ó 1 (Automático).
• vbManual se debe emplear el método Drag para iniciar una operación Drag & Drop.
• vbAutomatic haciendo clic botón izquierdo sobre el objeto se inicia la operación Drag &
Drop.
En principio parece más práctico tener esta propiedad en 1(Automático). Sin embargo, pese a que en el caso de establecerla en 0 (Manual), se debe utilizar el método Drag para iniciar el proceso, es preferible porque se controla mejor el Drag&Drop.
Otro inconveniente de tener la propiedad en automático, es no se sabe si lo que se quiere hacer es establecer el foco en ese control o iniciar una operación de Drag&Drop.
También poseen la propiedad DragIcon que establece un icono personalizado para las operaciones de arrastre de ese control.
Sintaxis: ControlOrigen.DragIcon [= icono] Donde icono es cualquier referencia a una imagen de icono válido.
Si no se especifica esta propiedad, el desplazamiento se expresa mediante un rectángulo del tamaño del control origen. Por lo tanto es preferible poner un icono en esta propiedad.
El valor de esta propiedad puede establecerse en tiempo de diseño, eligiendo el icono en el cuadro de Propiedades del control origen, o en tiempo de ejecución, cargándolo mediante la función LoadPicture :
ControlOrigen.DragIcon = LoadPicture (C :\Iconos\Icono1.ico)
El archivo que se cargue debe tener extensión .ico. y formato de icono.
IV.11.ii. METODO Drag
Con el método Drag, que tienen los controles, se puede controlar exactamente en qué momento se desea producir el inicio y el final del Drag & Drop.
El método Drag lleva un argumento numérico llamado Action el cual determina si se Inicia (1), Termina (2) o Cancela (0) una operación de arrastre de cualquier objeto excepto los controles Line, Menu, Shape o Timer.
Sintaxis: ControlOrigen.Drag TipoAcción
ControlOrigen es el nombre del control donde se inició la operación Drag&Drop.
TipoAcción es un valor o una constante que especifica la acción a realizar, según se describe a continuación:
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 119
Mg. Ing. Fátima Martínez
Constante Valor Descripción
vbCancel 0 Cancela la operación de arrastre.
vbBeginDrag 1 Inicia el arrastre del objeto (Predeterminada).
vbEndDrag 2 Termina el arrastre y suelta el objeto.
Sin embargo puede utilizarse el método Drag también cuando tenga el valor 1 (vbAutomatic).
Razón por la que se recomienda DragMode = Manual (0):
• Si en un control, por ejemplo un TextBox, tiene DragMode = 1 (vbAutomatic), será difícil que éste tome el foco y si se consigue no se podrá seleccionar el texto que tiene, ya que VB no sabe si se quiere seleccionar el texto o se desea iniciar una operación Drag & Drop.
Recordemos que “Drag & Drop solamente es una manifestación visual de algo que se está produciendo, pero ese algo deberemos programarlo”.
Un ejemplo típico del uso de Drag & Drop es llevar un texto que tiene una caja de texto a otra mediante D & D. Para ello se declara una variable en la cual se carga ese dato (hacerlo en el lugar donde sea válida para ambos controles) y al final de la operación D & D, se introduce ese valor en el TextBox final.
La carga de la variable se puede realizar en el procedimiento MouseDown del control origen, ya que D & D comienza haciendo clic en el control origen. Si en ese momento dicho control tiene la propiedad DragMode = 0 (vbManual) el mismo toma el foco y se lo puede arrastrar con el ratón para cambiar el texto. En cambio si ese control tiene DragMode = 1 (vbAutomatic), no se podrá.
La operación de arrastre mediante el método Drag comienza en el evento MouseDown del control pasándole el valor: Private Sub Text1_MouseDown(Button As Integer, Shift
As Integer, X As Single, Y As Single) Text1.Drag vbBeginDrag
End sub
Nota: El método Drag para controlar una operación de arrastrar se requiere únicamente cuando la propiedad DragMode del control origen tiene el valor Manual (0).
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 120
IV.11.iii. EVENTO DragOver
Cuando una operación de arrastrar y soltar D & D está en progreso y el cursor del ratón pasa por encima de un control o un formulario, se produce el evento DragOver de ese control o formulario (Suárez Bernardo, L; 1998).
Dependiendo del tipo de control, DragOver captura los siguientes parámetros:
• Si se trata de un Formulario convencional:
Private Sub Form_DragOver(Origen As Control, X As Single, Y As Single, Estado As Integer)
• Si se trata de un Control:
Private Sub Control_DragOver([Indice As Integer,]Origen As Control, X As Single, Y As Single, Estado As Integer)
Los parámetros:
Parámetro Descripción
Source (Origen) Control que se está arrastrando, es decir en el que se inicia Drag & Drop.
X, Y Coodenadas que especifican la posición horizontal (X) y vertical (Y) actual del puntero del mouse dentro del control o formulario destino.
Estado (State) Valor entero que indica el Estado de transición del control que se está arrastrando en relación al formulario o control destino.
Index (Indice) Si el control de origen fuese parte de un arreglo de controles, Index contiene el índice de ese control.
Comentarios: • Dentro del procedimiento puede hacerse referencia a las propiedades y
métodos del argumento Source, por ejemplo, Source.Visible = False.
• Las coordenadas X, Y se expresan siempre en términos del sistema de coordenadas del destino tal y como se establece en las propiedades ScaleHeight , ScaleWidth, ScaleLeft y ScaleTop.
• Valores del Estado:
Estado Descripción
0 = Entra. Se produce cuando entra el cursor del ratón al otro control o Formulario. También se genera en el control
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 121
Mg. Ing. Fátima Martínez
origen en el instante que se hace clic en el ratón, iniciándose de esta forma el D & D.
1 = Deja Se produce cuando el cursor sale del control o Formulario.
2 = Sobre Se produce cuando se está moviendo el cursor sobre el control o el Formulario destino.
Puede emplearse el procedimiento DragOver para comprobar si el valor que transportamos puede depositarse sobre el control o formulario por el que estamos pasando, si el valor que llevamos está dentro de los márgenes que admite la aplicación, etc. Es muy llamativo por ejemplo, cambiar el color del control que va a recibir el valor traspasado si este valor se sale de los márgenes aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar en ese control. Es típico poner la señal de trafico de Prohibido cuando el dato transportado no se puede soltar sobre el control sobre el que estamos pasando el cursor del ratón. (Como el control origen se pasa como parámetro al procedimiento DragOver con el nombre Origen basta con poner Origen.DragIcon = XXX) Recuerde en este caso que al abandonar ese control debe restaurar el icono original. Para ello es útil cargar varias variables con los distintos iconos que se van a usar y luego igualar la propiedad DragIcon del control origen a una u otra variable, dependiendo de los valores u otros factores de la aplicación (Suárez Bernardo, L; 1998).
En el siguiente ejemplo, se declaran 4 variables tipo Picture que van a almacenar cuatro iconos distintos. Se disponen en el formulario de dos cajas de texto a la izquierda que muestran la variación de las coordenadas del objeto transportado; dos cajas de texto a la izquierda. La superior, Text1, contiene un dato que será transportado a la segunda Text2, si el valor ingresado es 1000 o superior, en caso contrario no será depositado en ésta y el icono del mouse cambia. En Text1 se inicia el proceso de arrastre en el evento MouseDown y en Text2 (sobre el que pasa el control) se programa el evento DragOver. El botón Reinicia (predeterminado) inicializa nuevamente todos los valores y borra las cajas de texto. El botón Salir termina con la aplicación y finaliza el proceso de arrastre.
17. Ejemplo de DragDrop
Arrastra un valor ingresado en una caja de texto hacia otra y lo deposita en ella si ese valor es superior a 999. En caso contrario no lo deposita y el icono cambia.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 122
Declaración de las variables: Option Explicit Dim pepe As String Dim icono1 As Picture, Icono2 As Picture, Icono3 As Picture, Icono4 As Picture
Código del evento Load: Private Sub Form_Load() 'Se cargan los íconos y se inicializa el icono del control origen Set icono1 = LoadPicture("drag1.ico") 'Flecha a la derecha Set Icono2 = LoadPicture("drag2.ico") 'Flecha a la izquierda Set Icono3 = LoadPicture("drop3.ico") 'Osito Set Icono4 = LoadPicture("drop4.ico") 'Stop Text1.DragIcon = Icono3 'Inicia el icono Osito
End Sub
Código del evento MouseDown del control Origen: Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single) 'Inicia el proceso de arrastre pepe = Text1 ‘se carga en la variable Pepe con lo ingresado en Text1 Text1.Drag vbBeginDrag 'Inicia el proceso de arrastre
End Sub
Código del evento DragOver del control Destino: Private Sub Text2_DragOver(Source As Control, X As Single, Y As Single, State As
Integer) 'En el control destino se cambia el icono si el valor de 'la variable transportada (pepe) es mayor de 999 txtCoord(0) = Str(X) 'Función para transformar un valor en string txtCoord(1) = Str(Y) If Val(pepe) > 999 Then 'Si el valor ingresado supera los 999 'Cambia el icono a Flecha a la izquierda Source.DragIcon = Icono2 Text2 = Text1 Else 'Caso contrario cambia a Stop Source.DragIcon = Icono4 End If End Sub
Código del evento Click del botón Reinicia: Private Sub cmdReinicia_Click() 'Botón predeterminado 'Reinicializa en el icono del Osito Text1.DragIcon = Icono3 'Borra las cajas de texto Text1 = ""
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 123
Mg. Ing. Fátima Martínez
Text2 = "" txtCoord(0) = "" txtCoord(1) = "" Text1.SetFocus 'Pone el foco en la primera caja de texto Text1.Drag vbCancel 'cancela el proceso de arrastre End Sub
IV.11.iv. EVENTO DragDrop
Ocurre cuando se completa una operación de arrastrar y soltar como resultado de arrastrar un control sobre un formulario o control y liberar el botón del mouse o utilizar el método Drag con su argumento acción establecido en 2 (Drop).
Dependiendo del tipo de control donde se suelte el objeto “dragueado”, DragDrop captura los siguientes parámetros idénticos a los de DragOver:
• Si se suelta en un Formulario convencional:
Private Sub Form_DragDrop(Origen As Control, X As Single, Y As Single)
• Si se suelta en un Control diferente:
Private Sub Control_DragOver([Indice As Integer,]Origen As Control, X As Single, Y As Single)
Utilice un procedimiento de evento DragDrop para controlar qué ocurre tras completarse una operación de arrastrar. Por ejemplo, puede mover el contenido del control origen a un nuevo lugar o copiar un archivo de un lugar a otro, depositar un valor sobre un control etc.
Recuerde que la operación Drag & Drop no hace otra cosa que lo que se puede ver en la interface gráfica. Debe programar el Procedimiento para el evento DragDrop con el código necesario para que se realice la operación deseada.
18. Ejemplo de DragDrop
Para arrastrar una imagen
En un formulario se tiene un objeto imagen llamado Image1, este es arrastrado dentro de la ventana y reubicado en distintos lugares posibles.
La propiedad DragMode del objeto está en 0 (Manual).
Declaración de variables:
Option Explicit Dim DY As Single Dim DX As Single
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 124
Código del evento DragDrop sobre el Formulario: Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
'Se suelta sobre el formulario
Source.Visible = True 'Se hace visible el objeto
Source.Move X - DX , Y - DY 'nueva posición del objeto
Source.Drag vbEndDrag 'Termina el proceso y suelta el objeto
Source.ZOrder 'Determina el orden, el objeto delante del formulario End Sub
Código del evento MouseDown de la Imagen: Inicia el proceso Private Sub image1_MouseDown(Button As Integer, Shift As Integer, X As Single,
Y As Single) 'Inicia el proceso de arrastre
If Button = vbLeftButton Then 'Si se hace clic en el botón izquierdo
DX = X: DY = Y 'se cargan las variables con las coordenadas
Image1.Drag vbBeginDrag 'Permite la operación de Drag & Drop
'Oculta el control. Si no lo hace el formulario no detectaría,
'que se ha soltado si el puntero del ratón no sale del control.
Image1.Visible = False
End If End Sub
Código del evento MouseUp de la Imagen: suelta el mouse Private Sub image1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y
As Single)
If Button = vbLeftButton Then
Image1.Visible = True 'Pone visible nuevamente el objeto Image
Image1.ZOrder 'Determina el orden del objeto adelante
Image1.Drag vbEndDrag 'Termina la operación de arrastrar y suelta el objeto
End If End Sub
Código del evento Click del botón Salir: Private Sub cmdSalir_Click() End End Sub
Código del evento Click del botón Reinicializa: Private Sub cmdReiniciar_Click()
Image1.Visible = True 'Deja visible la imagen Image1.Left = DX 'Inicializa en la posición original Image1.Top = DY End Sub
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 125
Mg. Ing. Fátima Martínez
19. Ejemplo de DragDrop.
En el ejemplo distintas imágenes son arrastradas en el formulario Los objetos tienen la propiedad DragMode=1 (Automático).
Código del evento Load del Formulario: Inicializa Private Sub Form_Load() 'Pone en 1 (Automático) el valor de la propiedad DragMode 'la operación Drag & Drop inicia haciendo clic botón izquierdo sobre el objeto. Picture1.DragMode = 1 Picture2.DragMode = 1 Picture3.DragMode = 1 End Sub
Código del evento DragDrop sobre el Formulario: Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) 'Se redefinen las posiciones Source.Move (X - Source.ScaleWidth / 2), (Y - Source.ScaleHeight / 2) End Sub
20. Ejemplo de DragDrop entre listas
Se arrastra un elemento de una lista a otra y de esta a la anterior. Las listas tienen la propiedad DragMode = 0 (Manual).
En un formulario se tienen dos listas List1 y List2. Se arrasta un elemento de List1 hacia List2. En el MouseDown de List1 comienza la operación de arrastre mediante el método Drag, pasándoles el valor vbBeginDrag. En el evento DragDrop, que tiene un parámetro llamado Source, se verifica si es el control indicado, elimina el ítem del List1 y agrega el item al List2.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 126
Se debe especificar el archivo del icono a mostrar en la operación de arrastre en el evento Load del formulario o en tiempo de diseño en la propiedad DragIcon de ambos ListBox.
Código del evento Load sobre el Formulario: Inicializa Private Sub Form_Load() Dim i As Integer 'Agrega los meses del año en List1 For i = 1 To 12 List1.AddItem MonthName(i) Next 'IMPORTANTE: ESPECIFCAR EL ARCHIVO DE ÍCONO ‘QUE SE VA A MOSTRAR CUANDO SE EJECUTE EL DRAG List1.DragIcon = LoadPicture("Drag1.ico") List2.DragIcon = LoadPicture("Drag2.ico") End Sub
Código del evento MouseDown de List1: Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single) 'Inicia la operación de arrastre, es decir el drag para List1 List1.Drag vbBeginDrag End Sub
Código del evento DragDrop sobre la lista List1 de los elementos de List2 'Al soltar el item en List1 se agrega al mismo y se elimina el del List2 Private Sub List1_DragDrop(Source As Control, X As Single, Y As Single) ‘Se suelta el elemento de la lista 2 en la lista 1 'Si el control es el List2 entonces OK. If Source Is List2 Then If List2.ListIndex <> -1 Then 'Se agrega el elemento de la lista 2 en la lista 1 List1.AddItem List2.List(List2.ListIndex) 'Se borra de la lista 2 el elemento arrastrado List2.RemoveItem List2.ListIndex End If End If End Sub
Código del evento MouseDown de List1: Private Sub List2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single) List2.Drag vbBeginDrag 'Comienza el Drag para el List2 End Sub
Código del evento DragDrop sobre la lista List2 de los elementos de List1 'Al soltar el item en List2, se agrega al mismo y se elimina el del List1
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 127
Mg. Ing. Fátima Martínez
Private Sub List2_DragDrop(Source As Control, X As Single, Y As Single) 'Si el control es el List1 entonces If Source Is List1 Then If List1.ListIndex <> -1 Then 'Se agrega en la lista 2 el elemento de la lista 1 List2.AddItem List1.List(List1.ListIndex) 'Se borra de la lista 1 el elemento arrastrado List1.RemoveItem List1.ListIndex End If End If End Sub
Código del evento clic del botón Reinicializar: Private Sub cmdRein_Click() ‘Regresa las listas a sus valores iniciales List1.Clear ‘Borra todos los elementos Dim i As Integer 'Agrega los meses del año en List1 For i = 1 To 12 List1.AddItem MonthName(i) Next List2.Clear ‘Borra todos los elementos End Sub
IV.12. Ejercicios propuestos
1) Calculadora:
Crea una aplicación que realice las cuatro operaciones matemáticas, para ello inserta en un formulario: tres etiquetas, tres cajas de texto, un marco y tres botones de opción, tal como se muestra en la figura. Considera lo siguiente:
a) Al iniciar la ejecución el marco debe estar invisible y el foco en el cuadro de texto donde ingresa la primera cantidad.
b) No debe permitirse, en modo ejecución, que el tamaño del formulario se modifique y tampoco que aparezca el menú de control en la barra de títulos de la ventana.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 128
c) Sólo es permitido ingresar hasta 5 caracteres en las dos cantidades con las que se opera.
d) Se programará la caja de texto para que pase el foco al siguiente control con la tecla [En te r ] y sólo si en la primera cantidad se ha ingresado algo.
e) Luego de llenado los dos primeros cuadros de texto, el marco se pondrá en visible y el foco pasará a una de las operaciones pero sin seleccionarse.
f) El cálculo se realizará si se selecciona una opción y el Resultado se presentará con el formato apropiado. Las otras operaciones pueden realizarse una por una y luego pasarse a realizar Otro Cálculo con la tecla [En te r ].
g) El botón Otro Cálculo borra el contenido de las cajas de texto, pone el foco en la primera y pone invisible el marco.
h) El botón Salir termina la aplicación con la tecla [ESC ].
i) Antes de cerrar el formulario se preguntará con una ventana de mensaje si se quiere salir de la aplicación.
Nota: utiliza el método SetFocus, el evento KeyPress, LostFocus y QueryUnload.
2) Mover la foto:
Crea una aplicación que permita mover una imagen a las cuatro esquinas del formulario. Inserta en el formulario una caja combinada, una caja de imagen y dos botones de comando. Considera lo siguiente:
a) La caja combinada, cargada en tiempo de diseño, debe presentar una lista siempre visible, no desplegable y permitir seleccionar elementos de la lista.
b) Al iniciar la aplicación el foco estará en la caja combinada y la primera opción se encontrará seleccionada; la imagen se hallará en la parte media del formulario.
c) Establezca la propiedad correspondiente para que el botón Mover ejecuta su procedimiento al presionar [En te r ] una vez hecha la selección.
d) El botón Mover permitirá ejecutar la acción del cambio de posición de la imagen a los distintos extremos según la opción seleccionada en la caja combinada.
e) El botón Restaurar permitirá que la imagen regrese a la posición inicial dentro de la ventana y restaurará las propiedades iniciales de los controles.
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC
AÑO 2008
C A P I T U L O I V
Página 129
Mg. Ing. Fátima Martínez
f) No debe permitirse modificar el tamaño del formulario en tiempo de ejecución.
g) Se deberá terminar con la aplicación presionando el botón X de la ventana. Antes de salir debe preguntar si está seguro mostrando una caja de mensaje.
h) Programa también en el evento apropiado para salir al presionar la tecla [ESC].
Nota: utiliza el método SetFocus y el Move, el evento KeyPress y el evento QueryUnload.
3) Llevar a Devil a la casa:
En este ejercicio practica el “dragueo” de una imagen llamada Devil. Arrastra a Devil hacia la imagen de la casa. Considera lo siguiente:
a) Devil tiene la propiedad DragMode = 0 (Manual).
b) Al iniciar la aplicación determina la posición inicial de la imagen dentro del formulario.
c) Debes mostrar la imagen en el proceso Drga & Drop sobre el formulario.
d) Cuando Devil llegue a la casa deberá desaparecer.
e) El botón Restaura volverá a hacer aparecer la imagen en la posición original.
Nota: utiliza el método Drag, el evento DragOver y DragDrop.
Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez
Página 130
BIBLIOGRAFÍA CONSULTADA Y RECURSOS EN LA WEB
Nombre Autor/Año Edición, Editorial / Dirección del Sitio
Microsoft Visual Basic 6.0. Manual de Referencia
Birnios, B. y Birnios, M.; 2003
Manuales USERS; MP Ediciones; Buenos Aires – Argentina.
Cómo saber los eventos que producen los formularios y controles
Som, G, 1998 http://www.elguille.info/vb/cursos_vb/basico/basico23.htm; (accedido 02/08/2007).
Los eventos producidos al pulsar las teclas: KeyPress, KeyDown, KeyUp
Som, G, 1998 http://www.elguille.info/vb/cursos_vb/basico/basico24.htm; (accedido 02/08/2007)
Otros eventos: GotFocus, LostFocus, Change.Arrastrar y soltar (Drag & Drop)
Som, G, 1998 http://www.elguille.info/vb/cursos_vb/basico/basico25.htm; (accedido 02/08/2007)
DragOver y DragDrop http://www.wikilearning.com/dragover_y_dragdrop-wkccp-16856-57.htm; (accedido 27/08/2007)
Curso de Visual Basic Avanzado
Ordovás Oromendía, J. y Lema Osca, V.; 1999
www.infomanuales.com/Manuales/VisualBasic/VisualBasic.asp (accedido 02/08/2007)
Aprenda Visual Basic como si estuviera en primero
García de Jalón y otros; 1999
http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/VisualBasic6/vbasic60.pdf (accedido
Fundamentos de programación en Visual Basic
Matta Gonzales, Danny A.
http://www.cs.us.es/cursos/ai-2003/VB/VB.pdf (accedido 21/07/2007)
Guia del Estudiante. Cap. 9. EL DRAG & DROP (Arrastrar y Soltar)
Suárez Bernardo, L.; 1998
http://www.monografias.com/trabajos2/guiavb/guiavb.shtml (accedido 02/08/2007)