Sei sulla pagina 1di 38

CAPITULO IV INDICE DE CONTENIDO

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. IV.4.i.1. IV.4.i.2. IV.4.i.3. IV.4.i.4. IV.4.i.5. IV.4.i.6. IV.4.ii. Eventos para arrancar una aplicacin ..............................98 Creado.........................................................................98 Cargado .......................................................................98 Mostrado......................................................................99 Eventos para terminar una aplicacin............................99 Descargado ..................................................................99 Eliminado................................................................... 101 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. IV.9.ii. IV.10. IV.11. IV.11.ii. IV.11.iii. IV.11.iv. IV.12. Pasar a otro control sin usar la tecla Tab ....................... 113 Usar la tecla ESC para salir ........................................... 113 Eventos KeyDown y KeyUp ............................................ 114 Evento DragDrop y DragOver ........................................ 116 METODO Drag ............................................................ 118 EVENTO DragOver ...................................................... 120 EVENTO DragDrop ..................................................... 123 Ejercicios propuestos .................................................... 127

IV.11.i. Las propiedades DragMode y DragIcon........................... 117

LABORATORIO II - AO 2008

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

Pgina 94

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 95

IV. MANEJO DE EVENTOS

Visual Basic es un lenguaje orientado a eventos ya que la mayor parte del cdigo 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 captulo se darn a conocer los eventos ms habituales de Visual Basic. Cabe aclarar que VB tiene muchas ms posibilidades de las que aqu se presentan. Se ha dicho, en el Captulo 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 funcin o procedimiento que realiza la accin 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 ejecutarn cuando ocurra el evento. Los eventos son, entonces, notificaciones que el objeto enva 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 Cdigo que aparece cuando se hace doble Clic sobre el control. El cdigo describe los sucesos que se ejecutarn cuando suceda el evento sentarse. 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

1. Ejemplo de Eventos El objeto silla puede tener un evento Sentarse. Las acciones para este evento sern:

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

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 continuacin se presentan los eventos ms comunes que reconoce VB. Cada clase de objeto tiene sus propios eventos, pero no todos los objetos soportan los mismos eventos; algunos no estn disponibles en los dems. En el caso de los eventos del ratn, casi la mayora 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, p ero en una aplicacin se pueden producir muchos eventos generados por el usuario o incluso el programa puede generar otros. La siguiente tabla muestra los eventos ms importantes comunes a varios controles. Evento
Change DblClick DragDrop DragOver GotFocus KeyDown KeyPress KeyUp Load LostFocus MouseDown MouseMove MouseUp UnLoad

Se produce cuando
El usuario modifica el estado de un control. El usuario pulsa dos veces un objeto con el botn primario del mouse. El usuario arrastra un control con el botn primario del mouse. Un objeto se arrastra sobre un control. Un objeto recibe el foco. Se pulsa una tecla mientras un objeto tiene el foco. Se pulsa y se suelta una tecla mientras un objeto tiene el foco. Se suelta una tecla mientras un objeto tiene el foco. Se carga un objeto en memoria. Un objeto perdi el foco. Se puls un botn del mouse sobre un objeto. Se movi el cursor del mouse sobre un objeto. Se solt un botn del mouse sobre un objeto. 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 cdigo, en la parte izquierda se selecciona el control o formulario y en la derecha estn los eventos que se pueden codificar. Pgina 96

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 97

En estas imgenes se pueden ver las listas de objetos disponibles (a la izquierda) y de los eventos permitidos para el control formulario (a la derecha).

Se despliegan los objetos del formulario.

Se despliegan los eventos disponibles para el control seleccionado. seleccionado.

IV.3.

Secuencia de eventos

Hasta ahora se han visto eventos individuales, pero en general una accin del usuario puede desencadenar una secuencia de eventos. Para controlar con xito la aparicin y el comportamiento de los formularios (y tambin de los controles) en tiempos de ejecucin, debe comprenderse en qu orden se disparan los eventos. Es importante tambin comprender que un evento inicia automticamente con frecuencia a otro evento, produciendo un efecto en cascada. Por ejemplo un evento KeyPress no puede ser disparada sin disparar tambin lo eventos KeyUp y KeyDown. Conocer la secuencia de activacin de los eventos permite decidir dnde ubicar el cdigo en respuestas a un evento.

IV.4.

Ciclo de vida de un formulario

Comprender el ciclo de vida de un formulario es bsico para el programador de Visual Basic, puesto que son estos elementos los que permitirn al usuario interactuar con la aplicacin. Slo comprendiendo qu acciones podrn realizarse sobre los formularios y en qu momentos podremos controlar

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

adecuadamente la ejecucin de nuestros programas1. (Ordovs Oromenda y Lema Osca; 1999: 8). En la vida de un formulario puede pasar por cinco estados diferentes. En orden cronolgico son: creado, cargado, mostrado, descargado, eliminado.

IV.4.i. Eventos para arrancar una aplicacin


Cuando se arranca un aplicacin, o ms concretamente cuando se visualiza por primera vez un formulario se producen los siguientes eventos consecutivos: Initialize, Load, Activate y Paint . Initialize Load Activate Inicializa datos cuando se carga el formulario. Se emplea para el cdigo de inicializacin adicional. Comienza cargando el formulario en memoria. Cuando el formulario pasa a ser la ventana activa. Slo puede ocurrir cuando un objeto es visible. Se ejecuta cada vez que algn 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 cdigo a Paint.

Paint

IV.4.i.1.

Creado

El formulario existe como objeto, pero todava 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. (Ordovs Oromenda y Lema Osca; 1999: 5) Se suele utilizar el evento Initialize para inicializar variables definidas a nivel de mdulo 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 todava 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.

Jorge Ordovs Oromenda y Vicente Lema Osca; 1999; Curso de Visual Basic Avanzado;

Pgina 98

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 99

Nota El evento Load no se puede utilizar para dibujar o imprimir sobre el formulario porque todava no est disponible para esas operaciones. Para realizarlas se utiliza en cambio el evento Paint u otro posterior, por ejemplo GotFocus, pero no Load.

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. Adems, si el formulario recupera el foco despus de haberlo perdido (por ejemplo, al cambiar a otra aplicacin con [Alt]+[Tab] y volver despus al formulario), se genera el evento Activate .

IV.4.i.4.

Eventos para terminar una aplicacin

Cuando un formulario se cierra o elimina se producen los siguientes eventos en este orden: QueryUnload, Unload y Terminate . Se dispara por un evento Unload, antes de ejecutar el cdigo para este evento. Ofrece la posibilidad de detener el cierre de QueryUnload un formulario. Ideal cuando se cierra el formulario y hay datos que no se guardaron. UnLoad Terminate Se dispara cuando el usuario cierra el formulario y est a punto de descargarse. 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 botn cerrar, ejecutando el mtodo 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 Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

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 botn 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 parmetro Cancel a cualquier nmero distinto de 0.
Nota Si se cierra la aplicacin mediante un botn de comando Salir o con un End , no se pasa por el evento Unload. Cuando se finaliza la aplicacin con la sentencia End no se desencadena ningn evento de los formularios

El parmetro 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. 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: 2. Ejemplo del uso del evento Unload 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 Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If MsgBox("Est seguro de salir de la aplicacin?", vbYesNo, "Atencin") = vbNo Then Cancel = True End If End Sub

3. Ejemplo del uso de QueryUnload

Descarga un formulario de memoria. Su sintaxis Unload NombreDelFormulario. Use la palabra Me para referirse al formulario actual: Unload Me

Pgina 100

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 101

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 Botn Salir para terminar la aplicacin.

Cdigo de los eventos:


Option Explicit Dim inicio As Integer, finaliza As Integer Private Sub cmdSalir_Click() 'Botn de comando Salir Unload Me 'Sentencia para terminar la aplicacin End Sub Private Sub Form_Activate() 'Determina desde donde se selecciona el texto txtTexto.SelStart = inicio txtTexto.SelLength = finaliza End Sub Private Sub Form_Initialize() 'Carga la caja de texto txtTexto = "Texto seleccionado" 'Inicializa las variables inicio = 0 finaliza = Len(txtTexto) 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 'valor donde inicia la seleccin 'largo del texto 'Inicio de la seleccin primer caracter 'donde termina la seleccin al final del texto

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos


Cancel = True End If End Sub

Mg. Ing. Ftima Martnez

5. Ejemplo completo de los eventos: Initialize, Activate, QueryUnload, Unload y Terminate Termina la aplicacin desde el botn cerrar de la ventana o el comando Cerrar del men Control.

Cdigo 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 aplicacin y quita de la memoria el formulario MsgBox "Finaliza la aplicacin", vbCritical, "Atencin!" End Sub Private Sub Form_Unload(Cancel As Integer) 'Descarga el formulario MsgBox "Se descarga el formulario", vbExclamation, "Atencin!" End Sub

IV.4.ii. Ejemplo del ciclo de vida de un formulario


Este es un ejemplo (Ordovs Oromenda. y Lema Osca; 1999:12) para mostrar los estados por los que pasa un formulario durante su ciclo de vida. Adems, se comprobar cmo un formulario no se elimina de memoria hasta que no se liberan todas las referencias al mismo en el programa. Pgina 102

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008 1. Se crean dos formularios: Form1 y Form2.

CAPITULO IV Pgina 103

2. En el formulario 1, insertaremos cdigo 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 mtodo Print. 3. Aadiremos cdigo en el evento Click del botn para mostrar el formulario 2. Tambin mantendremos una referencia al formulario 2 (para evitar que se lance su evento Terminate al cerrarse). 4. Insertaremos cdigo 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.

Cdigo de los eventos del Formulario 1:


Private Sub cmdMostrar_Click() Formulario2.Show Form1.Hide 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 'Carga y muestra el formulario 2 'Oculta el formulario 1

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos


Private Sub Form_Paint()

Mg. Ing. Ftima Martnez

MsgBox "Formulario1: Se Muestra", vbInformation, "Evento Paint" Print "Formulario1" 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 'Escribe sobre el formulario actual

Cdigo 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" 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 End Sub 'Muestra el formulario 1 'escribe sobre el formulario actual

IV.5.

Otros eventos para Formulario

Otro evento para un formulario es Resize: se dispara cuando se modifica el tamao del formulario o cuando se carga por primera vez. Esto permite realizar acciones como mover o cambiar el tamao de los controles de un formulario cuando han cambiado sus dimensiones. El evento que realiza la operacin 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 podramos escribir cdigo para resaltar el texto de un determinado cuadro de texto; con el evento Deactivate podramos 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 Pgina 104

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 105

cada comento ese control, ventana o formulario es el que dispone del foco (focus) (Garca de Jaln y otros; 1999:50). El control que tiene el foco aparece resaltado con letra negrita, con un contorno ms vivo o con el cursor titilando en l. El foco puede pasar de un objeto a otro por cdigo, 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.
Nota El mtodo SetFocus permite dar el foco al objeto al que se aplica.

El control en el que suele usarse estos eventos, de forma ms habitual, es el TextBox. Private Sub txtNombre_LostFocus() 'Chequea que no est vaco If txtNombre = "" Then 'Si esta vaco no pasa a otro control Beep 'pitea 'mantiene el foco txtNombre.SetFocus Else 'Si no est vaco pasa el foco txtCodigo.SetFocus End If End Sub Private Sub txtCodigo_GotFocus() txtCodigo.PasswordChar = "?" txtCodigo.FontName = "Arial" txtCodigo.FontSize = 14 txtCodigo.FontBold = True End Sub

7. Ejemplo de LostFocus

El siguiente cdigo evitar que un cuadro de texto llamado txtNombre est vaco antes de pasar a otro control.

8. Ejemplo de GotFocus El siguiente cdigo inicializa las propiedades del control cuando tenga el foco.

IV.7.

Evento MouseDown, MouseUp y MouseMove

El evento MouseDown se produce cuando se pulsa un botn del ratn. Con los parmetros que tiene este evento se puede conocer el botn pulsado (Button), la Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

posicin dentro del control (X, Y) y si se est pulsando la tecla [S h i f t ], [C t 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 botn que haba sido pulsado. Los parmetros son los mismos que para MouseDown, pero en este caso lo que se detecta es cuando se suelta el botn pulsado. Vamos a ver los parmetros y algunos de los valores disponibles. Parmetro
Button

Valores posibles
Indica el botn que se est pulsando. Puede tener los siguientes valores: 1 se est pulsando o soltado el botn izquierdo, 2 se est pulsando o soltado el derecho, 4 se est pulsando o soltado el botn central. Slo se controla un botn a la vez. 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 sern: 3 se estn pulsando [Shift] y [Ctrl], 5 se estn pulsando [Shift] y [Alt], 6 se estn pulsando [Ctrl] y [Alt], 7 se estn pulsando las tres teclas. Indica las coordenadas de la posicin del puntero del ratn dentro del control. Es importante saber que estos valores son slo dentro del control en cuestin, no referente al formulario o la pantalla.

Shift

X, Y

El evento MouseDown se suele usar, entre otras cosas, para mostrar mens emergentes (PopUpMenus), normalmente controlando que se haya pulsado el botn derecho (cuando Button vale 2). El evento MouseMove se produce cada vez que se mueve el ratn sobre un control o formulario. Los parmetros de este procedimiento son los mismos que en los otros referentes al ratn: Para cualquier control por ejemplo en un formulario:

Pgina 106

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 107

Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Option Explicit Dim Now As Boolean

tipo True/False

Declara una variable del

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

9. Ejemplo de MouseDown y MouseUp Este ejemplo se utiliza para dibujar sobre un 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) 'Mtodo grfico, 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) End Sub

'Propiedad del formulario actual, color del dibujo.

10. Ejercicio que inicia preguntando si Est conforme con el sueldo que gana. Seguro que la mayora va a contestar que No, entonces mediante un truco cuando quieran hacer Click en el Botn de No, este se mueve a una nueva posicin aleatoriamente entre las medidas de ancho y alto del formulario. Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos Con el Botn Si, salimos del programa.

Mg. Ing. Ftima Martnez

Cdigo de los eventos de cada botn:


Private Sub cmdNo_Click() MsgBox "Sufre el mismo mal que millones de Argentinos!!" End Sub Private Sub cmdUno_Click() End End Sub

Cdigo del evento MouseMove del botn 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 funcin CInt() el valor de las coordenadas X y de Y cmdNo.Move CInt(Rnd cmdNo.Height)) End Sub * (Width cmdNo.Width)), CInt(Rnd * (Height -

IV.8.

Evento Click y DblClick

El evento Click se produce cuando se hace clic en un control. Es una combinacin del MouseDown seguido de un evento MouseUp y por ltimo Click . Se producen los tres eventos en ese orden: primero se presiona, despus se suelta y por ltimo se produce el clic. El DblClick se produce cuando se hace una doble pulsacin, un doble clic. Normalmente se producen en este orden: primero el MouseDown, seguido de un MouseUp, a continuacin un Click seguido de un DblClick y por ltimo un

MouseUp.
Private Sub Form_Click() Print "Se ha pulsado sobre el formulario (Click)" End Sub Private Sub Form_DblClick() Print "Doble pulsacin 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 botn del ratn (MouseDown)" End Sub

11. Ejemplo de Click y DoubleClick

Pgina 108

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 109

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Print "Se ha soltado el botn del ratn (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 alfanumricas y otros caracteres, adems de la tecla [E N T E R ], salvo la tecla [TAB] ya que es una tecla especial. La informacin que acepta este evento como parmetro es KeyAscii, indica el cdigo de la tecla pulsada. Este cdigo da un valor numrico, no una cadena. Por ejemplo, para un control cuadro de texto llamado Text1: Text1_KeyPress(KeyAscii As Integer)

Nota Para saber el valor de las teclas se puede pulsar [F2 ] para abrir el Examinador de objetos y buscar las constantes de KeyCode . Tambin en la ayuda se busca la palabra KeyCode .

Si se pulsa la tecla A mayscula, KeyAscii valdr 65, ya que ese es su valor ASCII. Los valores Ascii se pueden saber usando la funcin ASC y hacer una comparacin de este tipo: Para un control cuadro de texto llamado Text1: If KeyAscii = Asc("A") Then MsgBox Se ha pulsado la A mayscula End if Suele detectarse la pulsacin de la tecla [ENTER], entre otras cosas, porque emite un pitido cada vez que se pulsa 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

Ejemplo del KeyPress en cajas de texto

Con esta asignacin 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. Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

12. Ejemplo del KeyPress, GotFocus y QueryUnload

La caja de texto de Fecha de Hoy se carga automtica, 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 botn Mostrar que concatena el nombre con el apellido.

La aplicacin termina con el botn Salir o En este ejemplo se programan los con la tecla [ESC]. Antes se pregunta si controles para que el cursor avance se desea finalizar, para ello se programa con [ENTER] al ingresar los datos. la descarga del formulario con el evento QueryUnload.

Cdigo 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 If Index < 1 Then Else cmdMostrar.SetFocus End If End If End Sub 'Si no pasa el foco al siguiente control 'Si la tecla presionada es ENTER 'Que no pase del Indice 1 del arreglo 'Pasa el foco al siguiente elemento del arreglo

txtDatos(Index + 1).SetFocus

Cdigo del evento GotFocus para la caja de texto Fecha:


Private Sub txtFecha_GotFocus() 'Se introduce automticamente la fecha txtFecha.Text = Format(Now, "dd-mm-yyyy") txtDatos(0).SetFocus End Sub Funcin para dar formato a la fecha 'Vuelve el foco al primer elemento del arreglo

Cdigo 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

Pgina 110

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008


Cancel = True 'Detiene la descarga del formulario txtDatos(0).SetFocus End If End Sub

CAPITULO IV Pgina 111

'Pone el foco en el 1 cuadro de texto del arreglo

Cdigo del botn Salir:


Private Sub cmdSalir_Click() Unload Me End Sub Instruccin para descargar

Cdigo del botn 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 End Sub 'Pasa el foco al primer elemento

Cdigo del botn Mostrar:


Private Sub cmdMostrar_Click() 'el botn Muestra concatena Nombre y Apellido For i = 0 To 1 txtDatos(2) = txtDatos(2) & " " & txtDatos(i) Next i cmdLimpiar.SetFocus End Sub 'Muestra y pasa al siguiente control

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].

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

Cdigo de todos los botones:


Private Sub cmdAgrega_Click() 'si caja de texto no esta vaca 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 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 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 txtElem.SetFocus 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 'Actualiza el indice del elemento actual 'lleva el foco al cuadro de texto 'Vuelve el foco a las lista de colores 'Vuelve el foco a las lista de colores

Pgina 112

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 113

Cdigo 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 lstColores.AddItem txtElem, lblActual.Caption lstColores.SetFocus End If End Sub 'lleva el foco a la lista de colores 'Elimina de la lista 'Agrega en el ndice Actual lo que tiene el cuadro de texto

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). Adems se debe decir a Windows que se ha pulsado T A B no [ E N T E R ]; esto con el cdigo:
Para pasar al siguiente control como si se pulsara la tecla TAB: 14. Ejemplo para pasar a otro control sin 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

Nota: Se usa la instruccin SendKeys para que enve una tecla [TAB]. Para conocer otras teclas a enviar con SendKeys consultar la Ayuda.

IV.9.ii. Usar la tecla ESC para salir


Si se tiene un botn de comando encargado de cerrar el programa con la propiedad Cancel = TRUE, se puede ejecutar su accin pulsando la tecla [ E S C ] . Otra manera es mediante un procedimiento a nivel de formulario para detectar si la tecla presionada es [ E S C ] . Primero s debe modificar la propiedad del e formulario KeyPreview a True de manera de que ste procese el evento KeyPress en el formulario antes que los otros controles. Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyEscape Then 'Se ha pulsado ESC Unload Me 'Se descarga el formulario

15. Ejemplo KeyPress

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos para salir con la tecla [ESC]

Mg. Ing. Ftima Martnez

ElseIf KeyAscii = vbKeyReturn Then


'Se ha pulsado ENTER 'Se borra la tecla pulsada para que no "pite"

KeyAscii = 0 SendKeys "{TAB}" End If End Sub

'Se enva una pulsacin TAB

Nota: Tener en cuenta al utilizar KeyPress en un formulario, para controlar la pulsacin de las teclas, que si un botn para salir tiene asignada TRUE en la propiedad Cancel, el formulario no procesarn antes esas pulsaciones.

IV.10.
para

Eventos KeyDown y KeyUp


Sirven

KeyDown se produce cuando se presiona la tecla; KeyUp cuando se suelta.

tener un mayor control en las teclas pulsadas. La principal diferencia con el evento KeyPress es que los cdigos no son ASCII , sino cdigos de teclado. Los parmetros por ejemplo para un control cuadro de texto llamado Text1: Text1_ KeyDown(KeyCode As Integer, Shift As Integer )

Parmetro
KeyCode Shift

Valores posibles
Cdigo de la tecla. Puede coincidir en algunos casos con el cdigo ASCII , no siempre. Sus valores se pueden ver presionando la tecla [F2]. 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 ratn.

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 aplicacin empieza posicionado el cursor en la 2 caja de texto. De all pasa

Pgina 114

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 115

a la Anterior con Flecha abajo y a la Siguiente con Flecha arriba. La etiqueta superior informa cul 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 botn Salir finaliza con la aplicacin, tambin si se pulsa la tecla [ESC] programada en el evento KeyPress.

Cdigo 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 lblTecla = "Flecha arriba" txtAnterior.SetFocus 'Pasa el foco al control anterior 'Pasa el foco al control siguiente ElseIf KeyCode = vbKeyUp Then

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

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 End If End Sub 'Pasa el foco al control siguiente

Cdigo del evento KeyPress para salir con [ESC] o para saltar con [ENTER]:
Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyEscape Then Unload Me ElseIf KeyAscii = vbKeyReturn Then KeyAscii = 0 SendKeys "{TAB}" End If End Sub 'Se ha pulsado ESC 'Se descarga el formulario 'Se ha pulsado ENTER 'Se borra la tecla pulsada para que no "pite" 'Se enva una pulsacin TAB para pasar a otro control

Nota: Tener en cuenta al utilizar algn evento Keyxxx en un formulario, para controlar la pulsacin de las teclas, que si el botn en cuestin tiene asignada TRUE en la propiedad Default, el formulario no procesarn antes esas pulsaciones.

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 grfica, mediante la operacin de colocar el puntero del ratn y pulsar su botn izquierdo sobre ese algo que se quiere tomar. Sin dejar de pulsar el botn izquierdo del ratn se desliza (se arrastra) el puntero del ratn hasta el punto de la interface grfica donde lo queremos dejar. Ese punto puede ser un control o un formulario. Una vez en el

Pgina 116

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 117

punto de destino se suelta el botn del ratn y se deja caer lo que habamos tomado en el punto de origen (Surez Bernardo, L; 1998). Para realizar esto, Visual Basic dispone de propiedades, mtodos 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 didctico, pero en realidad no toma nada del control origen ni lo suelta al llegar a destino. Estas acciones se realizan mediante cdigo en los eventos adecuados: MouseDown, DragOver, DragDrop, dando los valores adecuados a las propiedades DragMode y DragIcon, y utilizando el mtodo 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 ratn dependiendo de si el objeto sobre el que se encuentra el cursor en ese momento es vlido para soltar o no. El evento DragDrop sucede al concluir una operacin de arrastrar y soltar. El evento DragOver requiere los argumentos que se muestran a continuacin: 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 Parmetro
Source X, Y State

Valores posibles
contiene el objeto que est siendo arrastrado indican la posicin del objeto arrastrado dentro del sistema de coordenadas del objeto sobre el que se est arrastrando Vale: 0 - si est entrando; 1 - si est saliendo; 2 - si permanece dentro del mismo objeto.

Nota: el evento DragOver pertenece al objeto sobre el que se arrastra, no al objeto que es arrastrado.

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 travs del cdigo, con el mtodo Drag, en modo de arrastre manual o si se usar el modo automtico en una operacin de arrastrar. Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos Sintaxis:

Mg. Ing. Ftima Martnez

ControlOrigen.DragMode [= nmero]

Donde nmero puede tomar los valores 0 (Manual, valor predeterminado) 1 (Automtico).

vbManual
Drop.

se debe emplear el mtodo Drag para iniciar una operacin Drag & Drop.

vbAutomatic haciendo clic botn izquierdo sobre el objeto se inicia la operacin Drag &

En principio parece ms prctico tener esta propiedad en 1(Automtico). Sin embargo, pese a que en el caso de establecerla en 0 (Manual), se debe utilizar el mtodo Drag para iniciar el proceso, es preferible porque se controla mejor el Drag&Drop . Otro inconveniente de tener la propiedad en automtico, es no se sabe si lo que se quiere hacer es establecer el foco en ese control o iniciar una operacin de
Drag&Drop.

Tambin 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 vlido. Si no se especifica esta propiedad, el desplazamiento se expresa mediante un rectngulo del tamao del control origen. Por lo tanto es preferible poner un icono en esta propiedad. El valor de esta propiedad puede establecerse en tiempo de diseo, eligiendo el icono en el cuadro de Propiedades del control origen, o en tiempo de ejecucin, cargndolo mediante la funcin LoadPicture :

ControlOrigen.DragIcon = LoadPicture (C :\Iconos\Icono1.ico)


El archivo que se cargue debe tener extensin .ico. y formato de icono.

IV.11.ii.

METODO Drag

Con el mtodo Drag, que tienen los controles, se puede controlar exactamente en qu momento se desea producir el inicio y el final del Drag & Drop. El mtodo Drag lleva un argumento numrico llamado Action el cual determina si se Inicia (1), Termina (2) o Cancela (0) una operacin de arrastre de cualquier objeto excepto los controles Line, Menu, Shape o Timer. Sintaxis:

ControlOrigen.Drag TipoAccin

ControlOrigen es el nombre del control donde se inici la operacin Drag&Drop. TipoAccin es un valor o una constante que especifica la accin a realizar, segn se describe a continuacin: Pgina 118

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008 Constante


vbCancel vbBeginDrag vbEndDrag

CAPITULO IV Pgina 119 Descripcin

Valor
0 1 2

Cancela la operacin de arrastre. Inicia el arrastre del objeto (Predeterminada). Termina el arrastre y suelta el objeto.

Nota: El mtodo Drag para controlar una operacin de arrastrar se requiere nicamente cuando la propiedad DragMode del control origen tiene el valor Manual (0).

Sin embargo puede utilizarse el mtodo Drag tambin cuando tenga el valor 1 (vbAutomatic). Razn por la que se recomienda DragMode = Manual (0):

Si en un control, por ejemplo un TextBox, tiene DragMode = 1 (vbAutomatic), ser difcil 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 operacin Drag & Drop.

Recordemos que Drag & Drop solamente es una manifestacin visual de algo que se est produciendo, pero ese algo deberemos programarlo. Un ejemplo tpico 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 vlida para ambos controles) y al final de la operacin 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 ratn para cambiar el texto. En cambio si ese control tiene DragMode = 1 (vbAutomatic), no se podr. La operacin de arrastre mediante el mtodo Drag comienza en el evento MouseDown del control pasndole el valor: Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Text1.Drag vbBeginDrag End sub Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

IV.11.iii. EVENTO DragOver


Cuando una operacin de arrastrar y soltar D & D est en progreso y el cursor del ratn pasa por encima de un control o un formulario, se produce el evento DragOver de ese control o formulario ( Surez Bernardo, L; 1998). Dependiendo del tipo de control, DragOver captura los siguientes parmetros:

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 parmetros: Parmetro
Source (Origen) X, Y

Descripcin
Control que se est arrastrando, es decir en el que se inicia Drag & Drop. Coodenadas que especifican la posicin horizontal (X) y vertical (Y) actual del puntero del mouse dentro del control o formulario destino. Valor entero que indica el Estado de transicin del control que se est arrastrando en relacin al formulario o control destino. Si el control de origen fuese parte de un arreglo de controles, Index contiene el ndice de ese control.

Estado (State)

Index (Indice)

Comentarios:

Dentro del procedimiento puede hacerse referencia a las propiedades y mtodos del argumento Source, por ejemplo, Source.Visible = False. Las coordenadas X, Y se expresan siempre en trminos del sistema de coordenadas del destino tal y como se establece en las propiedades ScaleHeight , ScaleWidth, ScaleLeft y ScaleTop. Valores del Estado: Estado
0 = Entra.

Descripcin
Se produce cuando entra el cursor del ratn al otro control o Formulario. Tambin se genera en el control

Pgina 120

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 121

origen en el instante que se hace clic en el ratn, inicindose de esta forma el D & D. 1 = Deja 2 = Sobre Se produce cuando el cursor sale del control o Formulario. 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 mrgenes que admite la aplicacin, 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 mrgenes aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar en ese control. Es tpico poner la seal de trafico de Prohibido cuando el dato transportado no se puede soltar sobre el control sobre el que estamos pasando el cursor del ratn. (Como el control origen se pasa como parmetro 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 aplicacin ( Surez 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 variacin 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 botn Reinicia (predeterminado) inicializa nuevamente todos los valores y borra las cajas de texto. El botn Salir termina con la aplicacin 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.

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

Declaracin de las variables:


Option Explicit Dim pepe As String Dim icono1 As Picture, Icono2 As Picture, Icono3 As Picture, Icono4 As Picture

Cdigo 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

Cdigo 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

Cdigo 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) 'Funcin 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

Cdigo del evento Click del botn Reinicia:


Private Sub cmdReinicia_Click() 'Botn predeterminado 'Reinicializa en el icono del Osito Text1.DragIcon = Icono3 'Borra las cajas de texto Text1 = ""

Pgina 122

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008


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

CAPITULO IV Pgina 123

IV.11.iv. EVENTO DragDrop


Ocurre cuando se completa una operacin de arrastrar y soltar como resultado de arrastrar un control sobre un formulario o control y liberar el botn del mouse o utilizar el mtodo Drag con su argumento accin establecido en 2 (Drop). Dependiendo del tipo de control donde se suelte el objeto dragueado, DragDrop captura los siguientes parmetros idnticos 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 operacin 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 operacin Drag & Drop no hace otra cosa que lo que se puede ver en la interface grfica. Debe programar el Procedimiento para el evento DragDrop con el cdigo necesario para que se realice la operacin deseada. 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).

18. Ejemplo de DragDrop Para arrastrar una imagen

Declaracin de variables:
Option Explicit Dim DY As Single Dim DX As Single

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

Cdigo 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 Source.Move X - DX , Y - DY Source.Drag vbEndDrag Source.ZOrder End Sub 'Se hace visible el objeto 'nueva posicin del objeto 'Termina el proceso y suelta el objeto 'Determina el orden, el objeto delante del formulario

Cdigo 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 DX = X: DY = Y Image1.Drag vbBeginDrag 'Si se hace clic en el botn izquierdo 'se cargan las variables con las coordenadas 'Permite la operacin de Drag & Drop

'Oculta el control. Si no lo hace el formulario no detectara, 'que se ha soltado si el puntero del ratn no sale del control. Image1.Visible = False End If End Sub

Cdigo 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 Image1.ZOrder End If End Sub Image1.Drag vbEndDrag 'Pone visible nuevamente el objeto Image 'Determina el orden del objeto adelante 'Termina la operacin de arrastrar y suelta el objeto

Cdigo del evento Click del botn Salir:


Private Sub cmdSalir_Click() End End Sub

Cdigo del evento Click del botn Reinicializa:


Private Sub cmdReiniciar_Click()

Image1.Visible = True Image1.Left = DX Image1.Top = DY End Sub

'Deja visible la imagen 'Inicializa en la posicin original

Pgina 124

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 125

19. Ejemplo de DragDrop. En el ejemplo distintas imgenes son arrastradas en el formulario Los objetos tienen la propiedad DragMode=1 (Automtico).

Cdigo del evento Load del Formulario: Inicializa


Private Sub Form_Load() 'Pone en 1 (Automtico) el valor de la propiedad DragMode 'la operacin Drag & Drop inicia haciendo clic botn izquierdo sobre el objeto. Picture1.DragMode = 1 Picture2.DragMode = 1 Picture3.DragMode = 1 End Sub

Cdigo 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 operacin de arrastre mediante el mtodo Drag, pasndoles el valor vbBeginDrag. En el evento DragDrop, que tiene un parmetro llamado Source, se verifica si es el control indicado, elimina el tem del List1 y agrega el item al List2. Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

Se debe especificar el archivo del icono a mostrar en la operacin de arrastre en el evento Load del formulario o en tiempo de diseo en la propiedad DragIcon de ambos ListBox.

Cdigo del evento Load sobre el Formulario: Inicializa


Private Sub Form_Load() Dim i As Integer 'Agrega los meses del ao 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

Cdigo del evento MouseDown de List1:


Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Inicia la operacin de arrastre, es decir el drag para List1 List1.Drag vbBeginDrag End Sub

Cdigo 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

Cdigo 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

Cdigo 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

Pgina 126

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 127

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

Cdigo del evento clic del botn 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 ao 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 aplicacin que realice las cuatro operaciones matemticas, para ello inserta en un formulario: tres etiquetas, tres cajas de texto, un marco y tres botones de opcin, tal como se muestra en la figura. Considera lo siguiente: a) Al iniciar la ejecucin el marco debe estar invisible y el foco en el cuadro de texto donde ingresa la primera cantidad. b) No debe permitirse, en modo ejecucin, que el tamao del formulario se modifique y tampoco que aparezca el men de control en la barra de ttulos de la ventana.

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

c) Slo 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 [ E n t e r ] y slo 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 clculo se realizar si se selecciona una opcin y el Resultado se presentar con el formato apropiado. Las otras operaciones pueden realizarse una por una y luego pasarse a realizar Otro Clculo con la tecla [E n t e r ]. g) El botn Otro Clculo borra el contenido de las cajas de texto, pone el foco en la primera y pone invisible el marco. h) El botn Salir termina la aplicacin con la tecla [E S C ]. i) Antes de cerrar el formulario se preguntar con una ventana de mensaje si se quiere salir de la aplicacin.

Nota: utiliza el mtodo SetFocus, el evento KeyPress, LostFocus y QueryUnload.

2) Mover la foto:

Crea una aplicacin 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 diseo, debe presentar u lista siempre na visible, no desplegable y permitir seleccionar elementos de la lista. b) Al iniciar la aplicacin el foco estar en la caja combinada y la primera opcin se encontrar seleccionada; la imagen se hallar en la parte media del formulario. c) Establezca la propiedad correspondiente para que el botn Mover ejecuta su procedimiento al presionar [E n t e r ] una vez hecha la seleccin. d) El botn Mover permitir ejecutar la accin del cambio de posicin de la imagen a los distintos extremos segn la opcin seleccionada en la caja combinada. e) El botn Restaurar permitir que la imagen regrese a la posicin inicial dentro de la ventana y restaurar las propiedades iniciales de los controles.

Pgina 128

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008

CAPITULO IV Pgina 129

f) No debe permitirse modificar el tamao del formulario en tiempo de ejecucin. g) Se deber terminar con la aplicacin presionando el botn X de la ventana. Antes de salir debe preguntar si est seguro mostrando una caja de mensaje. h) Programa tambin en el evento apropiado para salir al presionar la tecla [ESC]. Nota: utiliza el mtodo 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 aplicacin determina la posicin 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 botn Restaura volver a hacer aparecer la imagen en la posicin original. Nota: utiliza el mtodo Drag, el evento DragOver y DragDrop.

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

BIBLIOGRAFA CONSULTADA Y RECURSOS EN LA WEB Nombre


Microsoft Visual Basic 6.0. Manual de Referencia Cmo saber los eventos que producen los formularios y controles Los eventos producidos al pulsar las teclas: KeyPress, KeyDown, KeyUp Otros eventos: GotFocus, LostFocus, Change.Arrastrar y soltar (Drag & Drop) DragOver y DragDrop Curso de Visual Basic Avanzado Aprenda Visual Basic como si estuviera en primero Fundamentos de programacin en Visual Basic Guia del Estudiante. Cap. 9. EL DRAG & DROP (Arrastrar y Soltar)

Autor/Ao
Birnios, B. y Birnios, M.; 2003 Som, G, 1998

Edicin, Editorial / Direccin del Sitio


Manuales USERS; MP Ediciones; Buenos Aires Argentina. http://www.elguille.info/vb/cursos_vb/basico/basico 23.htm; (accedido 02/08/2007). http://www.elguille.info/vb/cursos_vb/basico/basico 24.htm; (accedido 02/08/2007)

Som, G, 1998

Som, G, 1998

http://www.elguille.info/vb/cursos_vb/basico/basico 25.htm; (accedido 02/08/2007)

http://www.wikilearning.com/dragover_y_dragdropwkccp-16856-57.htm; (accedido 27/08/2007) Ordovs Oromenda, J. y www.infomanuales.com/Manuales/VisualBasic/Visu Lema Osca, V.; 1999 alBasic.asp (accedido 02/08/2007) Garca de Jaln y otros; 1999 http://www.tecnun.es/asignaturas/Informat1/ayudainf /aprendainf/VisualBasic6/vbasic60.pdf (accedido

Matta Gonzales, Danny http://www.cs.us.es/cursos/ai-2003/VB/VB.pdf A. (accedido 21/07/2007) Surez Bernardo, L.; 1998 http://www.monografias.com/trabajos2/guiavb/guiav b.shtml (accedido 02/08/2007)

Pgina 130

Potrebbero piacerti anche