Está en la página 1de 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.

Eventos para arrancar una aplicacin ..............................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 aplicacin............................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

LABORATORIO II - AO 2008

Capitulo IV: Manejo de Eventos

Pgina 94

Mg. Ing. Ftima Martnez

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.

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

Mg. Ing. Ftima Martnez

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

IV.1.

Mg. Ing. Ftima Martnez

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

Se produce cuando

Change

El usuario modifica el estado de un control.

DblClick

El usuario pulsa dos veces un objeto con el botn primario del mouse.

DragDrop

El usuario arrastra un control con el botn 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 botn del mouse sobre un objeto.

MouseMove

Se movi el cursor del mouse sobre un objeto.

MouseUp

Se solt un botn 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 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

Inicializa datos cuando se carga el formulario.

Load

Se emplea para el cdigo de inicializacin adicional. Comienza


cargando el formulario en memoria.

Activate

Cuando el formulario pasa a ser la ventana activa. Slo puede


ocurrir cuando un objeto es visible.

Paint

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.

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

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

3. Ejemplo del uso de


QueryUnload

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

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

IV.4.i.6.

CAPITULO IV
Pgina 101

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

'Inicio de la seleccin primer caracter

txtTexto.SelLength = finaliza

'donde termina la seleccin al final del texto

End Sub
Private Sub Form_Initialize()
'Carga la caja de texto
txtTexto = "Texto seleccionado"
'Inicializa las variables
inicio = 0
finaliza = Len(txtTexto)

'valor donde inicia la seleccin


'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

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

Cancel = True
End If
End Sub

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

CAPITULO IV
Pgina 103

1. Se crean dos formularios: Form1 y Form2.


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

'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

Mg. Ing. Ftima Martnez

Capitulo IV: Manejo de Eventos

Mg. Ing. Ftima Martnez

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

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"

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

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.

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

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

Valores posibles

Button

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.

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

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)

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

Mg. Ing. Ftima Martnez

Con el Botn Si, salimos del programa.

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

(Width

cmdNo.Width)), CInt(Rnd * (Height

End Sub

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.

11. Ejemplo de
Click y
DoubleClick

Pgina 108

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

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

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

12. Ejemplo del KeyPress, GotFocus y


QueryUnload

Mg. Ing. Ftima Martnez

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

'Si la tecla presionada es ENTER


'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

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

Funcin para dar formato a la fecha

'Vuelve el foco al primer elemento del arreglo

End Sub

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

CAPITULO IV

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

Cdigo del botn Salir:


Private Sub cmdSalir_Click()
Unload Me

Instruccin para descargar

End Sub

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

'Pasa el foco al primer elemento

End Sub

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

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

Mg. Ing. Ftima Martnez

Pgina 111

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

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

Pgina 112

'Actualiza el indice del elemento actual

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

'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). 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 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

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.

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

Valores posibles

KeyCode

Cdigo de la tecla. Puede coincidir en algunos casos con el cdigo 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 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

'Pasa el foco al control siguiente

ElseIf KeyCode = vbKeyUp Then


lblTecla = "Flecha arriba"
txtAnterior.SetFocus

Mg. Ing. Ftima Martnez

'Pasa el foco al control anterior

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

'Pasa el foco al control siguiente

End If
End Sub

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

'Se ha pulsado ESC


'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 enva una pulsacin TAB para pasar a otro control

End If
End Sub

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

Valores posibles

Source
X, Y

contiene el objeto que est siendo arrastrado

State

Vale: 0 - si est entrando; 1 - si est saliendo; 2 - si permanece dentro del


mismo objeto.

indican la posicin del objeto arrastrado dentro del sistema de coordenadas del
objeto sobre el que se est arrastrando

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

Mg. Ing. Ftima Martnez

ControlOrigen.DragMode [= nmero]

Sintaxis:

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


(Automtico).

vbManual

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

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

Drop.

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.

ControlOrigen.DragIcon [= icono]

Sintaxis:

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

Valor

CAPITULO IV
Pgina 119
Descripcin

vbCancel

Cancela la operacin de arrastre.

vbBeginDrag

Inicia el arrastre del objeto


(Predeterminada).

vbEndDrag

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

Descripcin

Source (Origen)

Control que se est arrastrando, es decir en el que


se inicia Drag & Drop.

X, Y

Coodenadas que especifican la posicin 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 transicin del


control que se est arrastrando en relacin 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


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.

Pgina 120

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

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

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

CAPITULO IV
Pgina 123

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

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

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

'Se hace visible el objeto

Source.Move X - DX , Y - DY

'nueva posicin del objeto

Source.Drag vbEndDrag

'Termina el proceso y suelta el objeto

Source.ZOrder
End Sub

'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

'Si se hace clic en el botn izquierdo


'se cargan las variables con las coordenadas

Image1.Drag vbBeginDrag

'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

'Pone visible nuevamente el objeto Image


'Determina el orden del objeto adelante

Image1.Drag vbEndDrag

'Termina la operacin de arrastrar y suelta el objeto

End If
End Sub

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

Pgina 124

'Deja visible la imagen


'Inicializa en la posicin original

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 una lista siempre
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)

Pgina 130

Autor/Ao

Edicin, Editorial / Direccin del Sitio

Birnios, B. y Birnios,
M.; 2003

Manuales USERS; MP Ediciones; Buenos Aires


Argentina.

Som, G, 1998

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

Som, G, 1998

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

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)

También podría gustarte