capitulo4_eventos

38
LABORATORIO II - AÑO 2008 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 aplicación .............................. 98 IV.4.i.1. Creado ......................................................................... 98 IV.4.i.2. Cargado ....................................................................... 98 IV.4.i.3. Mostrado ...................................................................... 99 IV.4.i.4. Eventos para terminar una aplicación ............................ 99 IV.4.i.5. Descargado .................................................................. 99 IV.4.i.6. Eliminado................................................................... 101 IV.4.ii. Ejemplo del ciclo de vida de un formulario ...................... 102 IV.5. Otros eventos para Formulario ............................................ 104 IV.6. Eventos LostFocus y GotFocus ............................................. 104 IV.7. Evento MouseDown, MouseUp y MouseMove ......................... 105 IV.8. Evento Click y DblClick ....................................................... 108 IV.9. Evento KeyPress ................................................................ 109 IV.9.i. Pasar a otro control sin usar la tecla Tab ....................... 113 IV.9.ii. Usar la tecla ESC para salir ........................................... 113 IV.10. Eventos KeyDown y KeyUp ............................................ 114 IV.11. Evento DragDrop y DragOver ........................................ 116 IV.11.i. Las propiedades DragMode y DragIcon........................... 117 IV.11.ii. METODO Drag ............................................................ 118 IV.11.iii. EVENTO DragOver ...................................................... 120 IV.11.iv. EVENTO DragDrop ..................................................... 123 IV.12. Ejercicios propuestos .................................................... 127

Upload: garfiolp

Post on 30-Jul-2015

123 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Capitulo4_Eventos

LABORATORIO II - AÑO 2008

C A P I T U L O I V

I N D I C E D E C O N T E N I D O

IV. MANEJO DE EVENTOS...........................................................95

IV.1. Eventos generales.................................................................96

IV.2. Para saber los eventos que producen los controles .................96

IV.3. Secuencia de eventos ............................................................97

IV.4. Ciclo de vida de un formulario...............................................97

IV.4.i. Eventos para arrancar una aplicación ..............................98

IV.4.i.1. Creado.........................................................................98

IV.4.i.2. Cargado .......................................................................98

IV.4.i.3. Mostrado......................................................................99

IV.4.i.4. Eventos para terminar una aplicación............................99

IV.4.i.5. Descargado..................................................................99

IV.4.i.6. Eliminado...................................................................101

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

IV.5. Otros eventos para Formulario............................................104

IV.6. Eventos LostFocus y GotFocus .............................................104

IV.7. Evento MouseDown, MouseUp y MouseMove .........................105

IV.8. Evento Click y DblClick.......................................................108

IV.9. Evento KeyPress ................................................................109

IV.9.i. Pasar a otro control sin usar la tecla Tab .......................113

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

IV.10. Eventos KeyDown y KeyUp ............................................114

IV.11. Evento DragDrop y DragOver ........................................116

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

IV.11.ii. METODO Drag ............................................................118

IV.11.iii. EVENTO DragOver......................................................120

IV.11.iv. EVENTO DragDrop .....................................................123

IV.12. Ejercicios propuestos ....................................................127

Page 2: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 94

Page 3: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 95

Mg. Ing. Fátima Martínez

IV. MANEJO DE EVENTOS

Visual Basic es un lenguaje orientado a eventos ya que la mayor parte del código a escribir corresponde a los procedimientos o funciones que se activan luego de producidos ciertos eventos (Birnios, B. y Birnios, M.; 2003:85).

En este capítulo se darán a conocer los eventos más habituales de Visual Basic. Cabe aclarar que VB tiene muchas más posibilidades de las que aquí se presentan.

Se ha dicho, en el Capítulo I, que los eventos son acciones que el usuario puede efectuar sobre el control y son reconocidas por éste. Ante un evento sobre un determinado control, VB arranca una determinada función o procedimiento que realiza la acción programada por el usuario para ese evento concreto. Un evento tiene la siguiente forma general:

Sub Objeto_Evento([argumentos]) - Sentencias

End Sub

Sentencias son las programadas por el usuario y se ejecutarán cuando ocurra el evento. Los eventos son, entonces, notificaciones que el objeto envía de que un suceso de importancia ha ocurrido. Estos son muy utilizados sobre todo en los controles.

Argumentos son los datos que se pasan al procedimiento Sub para que se ejecuten las sentencias.

Los eventos deben ser seleccionados desde la ventana del Editor de Código que aparece cuando se hace doble Clic sobre el control. El código describe los sucesos que se ejecutarán cuando suceda el evento sentarse.

1. Ejemplo de Eventos

El objeto silla puede tener un evento Sentarse. Las acciones para este evento serán:

Sub Silla_Sentarse() Peso es Variable Si Peso es mayor a 100kg, entonces: Silla.Romper

Sillas.Patas=0 Sino

Silla.Soportar Fin de Secuencia Si End Sub

Page 4: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 96

IV.1. Eventos generales

El usuario de Windows está familiarizado con los eventos pero es posible que nunca se haya detenido a pensar en ello. A continuación se presentan los eventos más comunes que reconoce VB. Cada clase de objeto tiene sus propios eventos, pero no todos los objetos soportan los mismos eventos; algunos no están disponibles en los demás. En el caso de los eventos del ratón, casi la mayoría los aceptan.

Para saber qué eventos puede recibir un control determinado se lo selecciona y luego se pulsa la tecla F1 de la Ayuda, de esta manera se abre una ventana que explica el control y permite acceder a los eventos que soporta.

El evento Click es el principal de todos los controles, pero en una aplicación se pueden producir muchos eventos generados por el usuario o incluso el programa puede generar otros.

La siguiente tabla muestra los eventos más importantes comunes a varios controles.

Evento Se produce cuando

Change El usuario modifica el estado de un control.

DblClick El usuario pulsa dos veces un objeto con el botón primario del mouse.

DragDrop El usuario arrastra un control con el botón primario del mouse.

DragOver Un objeto se arrastra sobre un control.

GotFocus Un objeto recibe el foco.

KeyDown Se pulsa una tecla mientras un objeto tiene el foco.

KeyPress Se pulsa y se suelta una tecla mientras un objeto tiene el foco.

KeyUp Se suelta una tecla mientras un objeto tiene el foco.

Load Se carga un objeto en memoria.

LostFocus Un objeto perdió el foco.

MouseDown Se pulsó un botón del mouse sobre un objeto.

MouseMove Se movió el cursor del mouse sobre un objeto.

MouseUp Se soltó un botón del mouse sobre un objeto.

UnLoad Se descarga un objeto de memoria.

IV.2. Para saber los eventos que producen los controles

Para saber los eventos que un control puede aceptar, al menos los que el Visual Basic nos permite, en la ventana de código, en la parte izquierda se selecciona el control o formulario y en la derecha están los eventos que se pueden codificar.

Page 5: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 97

Mg. Ing. Fátima Martínez

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

IV.3. Secuencia de eventos

Hasta ahora se han visto eventos individuales, pero en general una acción del usuario puede desencadenar una secuencia de eventos. Para controlar con éxito la aparición y el comportamiento de los formularios (y también de los controles) en tiempos de ejecución, debe comprenderse en qué orden se disparan los eventos.

Es importante también comprender que un evento inicia automáticamente con frecuencia a otro evento, produciendo un efecto en cascada. Por ejemplo un evento KeyPress no puede ser disparada sin disparar también lo eventos KeyUp y KeyDown.

Conocer la secuencia de activación de los eventos permite decidir dónde ubicar el código en respuestas a un evento.

IV.4. Ciclo de vida de un formulario

Comprender el ciclo de vida de un formulario es básico para el programador de Visual Basic, puesto que son estos elementos los que permitirán al usuario interactuar con la aplicación. Sólo comprendiendo qué acciones podrán realizarse sobre los formularios y en qué momentos podremos controlar

Se despliegan los objetos del formulario.

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

Page 6: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 98

adecuadamente la ejecución de nuestros programas1. (Ordovás Oromendía y Lema Osca; 1999: 8).

En la vida de un formulario puede pasar por cinco estados diferentes. En orden cronológico son: creado, cargado, mostrado, descargado, eliminado.

IV.4.i. Eventos para arrancar una aplicación

Cuando se arranca un aplicación, o más concretamente cuando se visualiza por primera vez un formulario se producen los siguientes eventos consecutivos: Initialize, Load, Activate y Paint.

Initialize Inicializa datos cuando se carga el formulario.

Load Se emplea para el código de inicialización adicional. Comienza cargando el formulario en memoria.

Activate Cuando el formulario pasa a ser la ventana activa. Sólo puede ocurrir cuando un objeto es visible.

Paint

Se ejecuta cada vez que algún objeto o sector del formulario necesita ser coloreado. Si la propiedad AutoRedraw (booleana) tiene el valor True no se dispara nunca, por lo que no hace falta agregar código a Paint.

IV.4.i.1. Creado

El formulario existe como objeto, pero todavía no es visible. Cuando un formulario está siendo creado, se genera el evento Initialize. En esta fase del proceso de carga de un formulario no podemos actuar sobre los objetos que lo componen. (Ordovás Oromendía y Lema Osca; 1999: 5)

Se suele utilizar el evento Initialize para inicializar variables definidas a nivel de módulo que tiene lugar antes que el Load.

IV.4.i.2. Cargado

Cuando se inicia el proceso de carga de un formulario, se genera el evento Load. Ya se puede acceder a los controles del formulario, pero todavía no esta visible. Un formulario se encuentra en este estado en el proceso de carga, cuando se oculta o cuando se establece a False su propiedad Visible.

1 Jorge Ordovás Oromendía y Vicente Lema Osca; 1999; Curso de Visual Basic Avanzado;

Page 7: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 99

Mg. Ing. Fátima Martínez

El evento Load se suele utilizar para dar valores a sus propiedades y a los controles contenidos en él.

IV.4.i.3. Mostrado

Es el estado normal de un formulario. Podemos acceder a todos los elementos que lo componen y podemos actuar sobre ellos, pues el formulario esta visible. Durante este estado, cada vez que hay que repintar el formulario (por ejemplo, cuando una ventana que se ha situado sobre éste desaparece) se genera el evento Paint. Además, si el formulario recupera el foco después de haberlo perdido (por ejemplo, al cambiar a otra aplicación con [Alt]+[Tab] y volver después al formulario), se genera el evento Activate.

IV.4.i.4. Eventos para terminar una aplicación

Cuando un formulario se cierra o elimina se producen los siguientes eventos en este orden: QueryUnload, Unload y Terminate.

QueryUnload

Se dispara por un evento Unload, antes de ejecutar el código para este evento. Ofrece la posibilidad de detener el cierre de un formulario. Ideal cuando se cierra el formulario y hay datos que no se guardaron.

UnLoad Se dispara cuando el usuario cierra el formulario y está a punto de descargarse.

Terminate Se produce cuando se elimina de memoria el formulario.

IV.4.i.5. Descargado

Una vez terminado el proceso de descarga el formulario no es visible, y sus componentes no son accesibles. Este proceso se produce cuando se cierra el

formulario: pulsando el botón cerrar, ejecutando el método Unload del formulario, etc.

El proceso de descarga de un formulario genera a su vez dos eventos en el siguiente orden: QueryUnload y Unload. En general, se aprovechan para

Nota El evento Load no se puede utilizar para dibujar o imprimir sobre el formulario porque todavía no está disponible para esas operaciones. Para

realizarlas se utiliza en cambio el evento Paint u otro posterior, por

ejemplo GotFocus, pero no Load.

Page 8: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 100

liberar la memoria ocupada por los elementos que pertenecen al formulario antes de que este se cierre, salvar el trabajo que esté pendiente de guardado, etc.

El evento Unload se desencadena porque un usuario cierra el formulario mediante el botón cerrar ý o el comando Cerrar del menú de control o una sentencia Unload2.

En los dos eventos podemos detener el proceso de descarga estableciendo el valor del parámetro Cancel a cualquier número distinto de 0.

El parámetro Cancel, es un entero que determina si el formulario es descargado. Si Cancel = 0, el formulario se descarga. Si Cancel = True se impide que el formulario sea descargado.

2. Ejemplo del uso

del evento Unload

Antes de que se intente cerrar el formulario se pregunta mediante una caja de mensaje. En caso afirmativo se cierra el formulario de lo contrario no ha pasado nada: Sub Form_Unload(Cancel As Integer)

If MsgBox(“¿Esta seguro de cerrar la ventana?”, VbYesNo + vbQuestion, “Mensaje”)= vbNo Then

Cancel = True End If

End Sub

3. Ejemplo del uso de

QueryUnload

Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If MsgBox("¿Está seguro de salir de la aplicación?", vbYesNo, "Atención") = vbNo Then

Cancel = True End If

End Sub

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

Nota Si se cierra la aplicación mediante un botón de comando Salir o con

un End, no se pasa por el evento Unload. Cuando se finaliza la aplicación con la sentencia End no se desencadena ningún evento de los formularios

Page 9: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 101

Mg. Ing. Fátima Martínez

IV.4.i.6. Eliminado

Aunque esté descargado un formulario, mientras existe cualquier referencia al mismo, no está totalmente eliminado de memoria. Cuando se lo elimina se genera el evento Terminate y el formulario desaparece de memoria.

4. Ejemplo completo de los eventos:

Initialize, Activate y QueryUnload

Botón Salir para terminar la aplicación.

Código de los eventos: Option Explicit

Dim inicio As Integer, finaliza As Integer

Private Sub cmdSalir_Click()

'Botón de comando Salir

Unload Me 'Sentencia para terminar la aplicación

End Sub

Private Sub Form_Activate()

'Determina desde donde se selecciona el texto

txtTexto.SelStart = inicio 'Inicio de la selección primer caracter

txtTexto.SelLength = finaliza 'donde termina la selección al final del texto

End Sub

Private Sub Form_Initialize()

'Carga la caja de texto

txtTexto = "Texto seleccionado"

'Inicializa las variables

inicio = 0 'valor donde inicia la selección

finaliza = Len(txtTexto) 'largo del texto

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

'Antes de salir pregunta si quiere finalizar

If MsgBox("¿Esta seguro que desea finalizar?", vbYesNo, "Finaliza") = vbNo Then

Page 10: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 102

Cancel = True

End If

End Sub

5. Ejemplo completo de los

eventos: Initialize, Activate, QueryUnload, Unload y Terminate

Termina la aplicación desde el botón cerrar de la ventana o el comando Cerrar del menú Control.

Código de los eventos: Option Explicit

Dim inicio As Integer, finaliza As Integer

Private Sub Form_Activate()

txtTexto.SelStart = inicio

txtTexto.SelLength = finaliza

End Sub

Private Sub Form_Initialize()

txtTexto = "Texto seleccionado"

inicio = 0

finaliza = Len(txtTexto)

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If MsgBox("¿Esta seguro que desea salir?", vbYesNo + vbQuestion, "Finaliza") = vbNo Then

Cancel = True

End If

End Sub

Private Sub Form_Terminate()

'Termina la aplicación y quita de la memoria el formulario

MsgBox "Finaliza la aplicación", vbCritical, "Atención!"

End Sub

Private Sub Form_Unload(Cancel As Integer)

'Descarga el formulario

MsgBox "Se descarga el formulario", vbExclamation, "Atención!"

End Sub

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

Este es un ejemplo (Ordovás Oromendía. y Lema Osca; 1999:12) para mostrar los estados por los que pasa un formulario durante su ciclo de vida. Además, se comprobará cómo un formulario no se elimina de memoria hasta que no se liberan todas las referencias al mismo en el programa.

Page 11: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 103

Mg. Ing. Fátima Martínez

1. Se crean dos formularios: Form1 y Form2.

2. En el formulario 1, insertaremos código en las subrutinas Initialize, Load, Activate, Paint, QueryUnload, Unload y Terminate, para que cada vez que se lance el evento correspondiente mostremos un mensaje con el nombre del formulario y el nombre del evento. En el evento Paint se escribe sobre el formulario el nombre del formulario mediante el método Print.

3. Añadiremos código en el evento Click del botón para mostrar el formulario 2. También mantendremos una referencia al formulario 2 (para evitar que se lance su evento Terminate al cerrarse).

4. Insertaremos código en las subrutinas Load, Paint, Unload y Terminate del formulario 2, para mostrar un mensaje con el nombre del formulario y del evento que se produce en cada caso.

6. Ejemplo completo de los

eventos: Initialize, Load, Activate, Paint, QueryUnload, Unload y Terminate

Se reconocen los eventos que un formulario puede recibir, así como el orden en el que se reciben.

Código de los eventos del Formulario 1: Private Sub cmdMostrar_Click()

Formulario2.Show 'Carga y muestra el formulario 2

Form1.Hide 'Oculta el formulario 1

End Sub

Private Sub Form_Activate()

MsgBox "Formulario1: Se Activa", vbInformation, "Evento Activate"

End Sub

Private Sub Form_Initialize()

MsgBox "Formulario1: Se Inicializa", vbInformation, "Evento Initialize"

End Sub

Sub Form_Load()

MsgBox "Formulario1: Se Carga", vbInformation, "Evento Load"

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

MsgBox "Formulario1: Antes de descargar", , "Primer Formulario"

End Sub

Page 12: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 104

Private Sub Form_Paint()

MsgBox "Formulario1: Se Muestra", vbInformation, "Evento Paint"

Print "Formulario1" 'Escribe sobre el formulario actual

End Sub

Private Sub Form_Terminate()

MsgBox "Formulario1: Finaliza", , "Primer Formulario"

End Sub

Private Sub Form_Unload(Cancel As Integer)

MsgBox "Formulario1: Se Descarga", , "Primer Formulario"

End Sub

Código de los eventos del Formulario 2: Private Sub Form_Load()

MsgBox "Formulario2: Se Carga", , "Segundo Formulario"

End Sub

Private Sub Form_Paint()

MsgBox "Formulario2: Se Muestra", , "Segundo Formulario"

Print "Formulario2" 'escribe sobre el formulario actual

End Sub

Private Sub Form_Terminate()

MsgBox "Formulario2: Finaliza", , "Segundo Formulario"

End Sub

Private Sub Form_Unload(Cancel As Integer)

MsgBox "Formulario2: Se Descarga", , "Segundo Formulario"

Form1.Show 'Muestra el formulario 1

End Sub

IV.5. Otros eventos para Formulario

Otro evento para un formulario es Resize: se dispara cuando se modifica el tamaño del formulario o cuando se carga por primera vez. Esto permite realizar acciones como mover o cambiar el tamaño de los controles de un formulario cuando han cambiado sus dimensiones.

El evento que realiza la operación inversa a Activate es Deactivate, ocurre cuando un formulario deja de ser la ventana activa. Estos eventos son adecuados para iniciar o finalizar acciones del formulario. Por ejemplo, en el evento Activate podríamos escribir código para resaltar el texto de un determinado cuadro de texto; con el evento Deactivate podríamos guardar los cambios efectuados en un archivo o en una base de datos.

IV.6. Eventos LostFocus y GotFocus

En todas las aplicaciones de Windows, en cualquiera de sus versiones, siempre hay un único control, formulario o ventana que puede recibir entradas desde teclado. En

Page 13: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 105

Mg. Ing. Fátima Martínez

cada comento ese control, ventana o formulario es el que dispone del foco (focus) (García de Jalón y otros; 1999:50).

El control que tiene el foco aparece resaltado con letra negrita, con un contorno más vivo o con el cursor titilando en él. El foco puede pasar de un objeto a otro por código, porque el usuario ha cliqueado en él o ha pulsado la tecla [Tab].

Cuando un control se convierte en activo y recibe el foco, produce el evento GotFocus; de igual forma, cuando deja de ser el control activo, hace sonar la alarma mediante el evento LostFocus.

El control en el que suele usarse estos eventos, de forma más habitual, es el TextBox.

7. Ejemplo de LostFocus

El siguiente código evitará que un cuadro de texto llamado txtNombre esté vacío antes de pasar a otro control.

Private Sub txtNombre_LostFocus() 'Chequea que no esté vacío If txtNombre = "" Then 'Si esta vacío no pasa a otro control Beep 'pitea 'mantiene el foco txtNombre.SetFocus Else 'Si no está vacío pasa el foco txtCodigo.SetFocus End If End Sub

8. Ejemplo de GotFocus

El siguiente código inicializa las propiedades del control cuando tenga el foco.

Private Sub txtCodigo_GotFocus() txtCodigo.PasswordChar = "?" txtCodigo.FontName = "Arial" txtCodigo.FontSize = 14 txtCodigo.FontBold = True End Sub

IV.7. Evento MouseDown, MouseUp y MouseMove

El evento MouseDown se produce cuando se pulsa un botón del ratón. Con los parámetros que tiene este evento se puede conocer el botón pulsado (Button), la

Nota El método SetFocus permite dar el foco al objeto al que se aplica.

Page 14: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 106

posición dentro del control (X, Y) y si se está pulsando la tecla [Sh i f t ], [Ct r l ] o [A l t] (Shift).

Para un objeto formulario:

Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

El evento MouseUp se produce cuando se suelta el botón que había sido pulsado. Los parámetros son los mismos que para MouseDown, pero en este caso lo que se detecta es cuando se suelta el botón pulsado.

Vamos a ver los parámetros y algunos de los valores disponibles.

Parámetro Valores posibles

Button Indica el botón que se está pulsando. Puede tener los siguientes valores: 1 → se está pulsando o soltado el botón izquierdo, 2 → se está pulsando o soltado el derecho, 4 → se está pulsando o soltado el botón central. Sólo se controla un botón a la vez.

Shift Indica si se está pulsando algunas de las teclas: [Shift], [Ctrl] o [Alt].

El valor devuelto corresponde con:

1 → se está pulsando la tecla [Shift]

2 → se está pulsando [Control]

4 → se está pulsando [Alt]

Se permiten combinaciones de estos valores, es decir que si se pulsan varias de esas teclas, los valores serán:

3 → se están pulsando [Shift] y [Ctrl],

5 → se están pulsando [Shift] y [Alt],

6 → se están pulsando [Ctrl] y [Alt],

7 → se están pulsando las tres teclas.

X, Y Indica las coordenadas de la posición del puntero del ratón dentro del control. Es importante saber que estos valores son sólo dentro del control en cuestión, no referente al formulario o la pantalla.

El evento MouseDown se suele usar, entre otras cosas, para mostrar menús emergentes (PopUpMenus), normalmente controlando que se haya pulsado el botón derecho (cuando Button vale 2).

El evento MouseMove se produce cada vez que se mueve el ratón sobre un control o formulario.

Los parámetros de este procedimiento son los mismos que en los otros referentes al ratón:

Para cualquier control por ejemplo en un formulario:

Page 15: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 107

Mg. Ing. Fátima Martínez

Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

9. Ejemplo de

MouseDown y MouseUp

Este ejemplo se utiliza para dibujar sobre un formulario.

Option Explicit Dim Now As Boolean ‘Declara una variable del

tipo True/False

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

'Empieza a dibujar, presiona el mouse sobre el formulario

Now = True 'Activa el dibujo. End Sub Private Sub Form_MouseUp(Button As Integer,

Shift As Integer, X As Single, Y As Single)

'Termina de dibujar, levanta el mouse

Now = False 'Desactiva el dibujo. End Sub Private Sub Form_MouseMove(Button As Integer,

Shift As Integer, X As Single, Y As Single)

If Now Then PSet (X, Y) 'Método gráfico, dibuja un punto.

End If End Sub

Private Sub Form_Load() ‘Inicializa en la carga DrawWidth = 5 'Propiedad del formulario actual, pincel ancho.

ForeColor = RGB(0, 0, 255) 'Propiedad del formulario actual, color del dibujo.

End Sub

10. Ejercicio que inicia preguntando si

“Está conforme con el sueldo” que gana. Seguro que la mayoría va a contestar que “No”, entonces mediante un truco cuando quieran hacer Click en el Botón de No, este se mueve a una nueva posición aleatoriamente entre las medidas de ancho y alto del formulario.

Page 16: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 108

Con el Botón Si, salimos del programa.

Código de los eventos de cada botón: Private Sub cmdNo_Click()

MsgBox "Sufre el mismo mal que millones de Argentinos!!"

End Sub

Private Sub cmdUno_Click()

End

End Sub

Código del evento MouseMove del botón ‘NO’: Private Sub cmdNo_MouseMove(Button As Integer, Shift As Integer, X As

Single, Y As Single)

'Mueve el control para que no puedan hacer clic en él

'Transforma en entero con la función CInt() el valor de las coordenadas X y de Y

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

End Sub

IV.8. Evento Click y DblClick

El evento Click se produce cuando se hace clic en un control.

Es una combinación del MouseDown seguido de un evento MouseUp y por último Click. Se producen los tres eventos en ese orden: primero se presiona, después se suelta y por último se produce el clic.

El DblClick se produce cuando se hace una doble pulsación, un doble clic.

Normalmente se producen en este orden: primero el MouseDown, seguido de un MouseUp, a continuación un Click seguido de un DblClick y por último un MouseUp.

11. Ejemplo de

Click y DoubleClick

Private Sub Form_Click() Print "Se ha pulsado sobre el formulario (Click)"

End Sub Private Sub Form_DblClick()

Print "Doble pulsación en el formulario (DblClick)"

End Sub Private Sub Form_MouseDown(Button As Integer,

Shift As Integer, X As Single, Y As Single)

Print "Se ha pulsado el botón del ratón (MouseDown)"

End Sub

Page 17: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 109

Mg. Ing. Fátima Martínez

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Print "Se ha soltado el botón del ratón (MouseUp)"

End Sub

IV.9. Evento KeyPress

Este evento se produce cada vez que se pulsa una tecla, al menos una tecla normal, las especiales no se consideran normales y no se suelen detectar en este evento. (Som, G.; 1998).

Con el evento KEYPRESS se pueden detectar todas las teclas las alfanuméricas y otros caracteres, además de la tecla [E N T E R ], salvo la tecla [TAB] ya que es una tecla especial.

La información que acepta este evento como parámetro es KeyAscii, indica el código de la tecla pulsada. Este código da un valor numérico, no una cadena. Por ejemplo, para un control cuadro de texto llamado Text1:

Text1_KeyPress(KeyAscii As Integer)

Si se pulsa la tecla A mayúscula, KeyAscii valdrá 65, ya que ese es su valor ASCII.

Los valores Ascii se pueden saber usando la función ASC y hacer una comparación de este tipo:

Para un control cuadro de texto llamado Text1: If KeyAscii = Asc("A") Then

MsgBox “Se ha pulsado la A mayúscula” End if

Suele detectarse la pulsación de la tecla [ENTER], entre otras cosas, porque emite un pitido cada vez que se pulsa

Ejemplo del

KeyPress en cajas de texto

Por ejemplo en las cajas de texto, para evitar ese "pitido", se puede hacer esto: If KeyAscii = vbKeyReturn Then KeyAscii = 0 'Eliminamos el pitido End If

Con esta asignación KeyAscii = 0 , se le indica a VB que no se ha pulsado nada o al menos se le dice que no tenga en cuenta que se ha pulsado esa tecla.

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

Page 18: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 110

12. Ejemplo del KeyPress, GotFocus y

QueryUnload

En este ejemplo se programan los controles para que el cursor avance con [ENTER] al ingresar los datos.

La caja de texto de Fecha de Hoy se carga automática, desde el evento GotFocus, con la fecha actual (del sistema) y está todo el tiempo bloqueada.

Las cajas de texto: Nombre, Apellido y Nombre completo, pertenecen a un arreglo de cajas de texto txtDatos(i).

A partir de Nombre se programa el evento KeyPress para que pase al siguiente control y de allí al botón Mostrar que concatena el nombre con el apellido.

La aplicación termina con el botón Salir o con la tecla [ESC]. Antes se pregunta si se desea finalizar, para ello se programa la descarga del formulario con el evento QueryUnload.

Código del evento KeyPress para el arreglo:

Private Sub txtDatos_KeyPress(Index As Integer, KeyAscii As Integer)

'Se utiliza ENTER para pasar al siguiente control

If KeyAscii = 13 Then 'Si la tecla presionada es ENTER

If Index < 1 Then 'Que no pase del Indice 1 del arreglo

txtDatos(Index + 1).SetFocus 'Pasa el foco al siguiente elemento del arreglo

Else

cmdMostrar.SetFocus 'Si no pasa el foco al siguiente control

End If

End If

End Sub

Código del evento GotFocus para la caja de texto Fecha:

Private Sub txtFecha_GotFocus()

'Se introduce automáticamente la fecha

txtFecha.Text = Format(Now, "dd-mm-yyyy") ‘Función para dar formato a la fecha

txtDatos(0).SetFocus 'Vuelve el foco al primer elemento del arreglo

End Sub

Código del evento QueryUnload para descargar el Formulario:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

If MsgBox("¿Está seguro que desea salir?", vbYesNo, "Finalizar") = vbNo Then

Page 19: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 111

Mg. Ing. Fátima Martínez

Cancel = True

'Detiene la descarga del formulario

txtDatos(0).SetFocus 'Pone el foco en el 1º cuadro de texto del arreglo

End If

End Sub

Código del botón Salir:

Private Sub cmdSalir_Click()

Unload Me ‘Instrucción para descargar

End Sub

Código del botón Limpiar:

Private Sub cmdLimpiar_Click()

'Borra todos los elementos del arreglo de cajas de texto

For i = 0 To 2

txtDatos(i) = ""

Next i

txtDatos(0).SetFocus 'Pasa el foco al primer elemento

End Sub

Código del botón Mostrar:

Private Sub cmdMostrar_Click()

'el botón Muestra concatena Nombre y Apellido

For i = 0 To 1

txtDatos(2) = txtDatos(2) & " " & txtDatos(i)

Next i

cmdLimpiar.SetFocus 'Muestra y pasa al siguiente control

End Sub

13. Ejemplo del evento KeyPress

En este ejemplo se usa el evento KeyPress en el cuadro de texto “Otro color”.

Detecta si la tecla presionada es [ENTER].

Page 20: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 112

Código de todos los botones: Private Sub cmdAgrega_Click()

'si caja de texto no esta vacía

If txtElem <> "" Then

'Se agrega al final de lista

lstColores.AddItem txtElem

'Se vacia el contenido de caja de texto

txtElem = ""

End If

' Actualiza el valor de los índices

lblTotal = lstColores.ListCount

lblActual = lstColores.ListIndex

lstColores.SetFocus 'Vuelve el foco a las lista de colores

End Sub

Private Sub cmdElimina_Click()

'Si hay un elemento seleccionado

If lstColores.ListIndex <> -1 Then

'Elimina el elemento actual

lstColores.RemoveItem lstColores.ListIndex

End If

' Actualiza el valor de los índices

lblTotal = lstColores.ListCount

lstColores.ListIndex = 0

lblActual = lstColores.ListIndex

lstColores.SetFocus 'Vuelve el foco a las lista de colores

End Sub

Private Sub cmdModif_Click()

'Si hay un elemento seleccionado

If lstColores.ListIndex <> -1 Then

'El elemento actual es ubicado en el cuadro de texto

txtElem = lstColores.List(lstColores.ListIndex)

lblActual = lstColores.ListIndex 'Actualiza el indice del elemento actual

txtElem.SetFocus 'lleva el foco al cuadro de texto

End If

End Sub

Private Sub cmdSalir_Click()

End

End Sub

Private Sub Form_Load()

lstColores.ListIndex = 0

lblActual = lstColores.ListIndex

lblTotal = lstColores.ListCount

End Sub

Private Sub lstColores_Click()

lblActual = lstColores.ListIndex

End Sub

Page 21: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 113

Mg. Ing. Fátima Martínez

Código del evento KeyPress : Private Sub txtElem_KeyPress(KeyAscii As Integer)

'Si se presiona la tecla Enter en el cuadro de texto

If KeyAscii = 13 Then

lstColores.RemoveItem lstColores.ListIndex 'Elimina de la lista

'Agrega en el índice Actual lo que tiene el cuadro de texto

lstColores.AddItem txtElem, lblActual.Caption

lstColores.SetFocus 'lleva el foco a la lista de colores

End If

End Sub

IV.9.i. Pasar a otro control sin usar la tecla Tab

Cuando se pulsa [E N T E R ] se puede pasar al siguiente control, de la misma forma que si se hubiera pulsado la tecla T A B . Para conseguirlo, la propiedad

TabStop de los controles debe estar activa, (si tiene el valor FALSE no se puede usar T A B para cambiar de control). Además se debe decir a Windows que se ha pulsado T A B no [E N T E R ]; esto con el código:

14. Ejemplo para

pasar a otro control sin la tecla [TAB]

Para pasar al siguiente control como si se pulsara la tecla TAB: Private Sub text1_KeyPress(KeyAscii As Integer)

If KeyAscii = vbKeyReturn Then SendKeys ("{TAB}") KeyAscii = 0 'Elimina el pitido

End if End Sub

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

Si se tiene un botón de comando encargado de cerrar el programa con la propiedad Cancel = TRUE, se puede ejecutar su acción pulsando la tecla [ESC] .

Otra manera es mediante un procedimiento a nivel de formulario para detectar si la tecla presionada es [ESC] . Primero se debe modificar la propiedad del

formulario KeyPreview a True de manera de que éste procese el evento KeyPress en el formulario antes que los otros controles.

15. Ejemplo

KeyPress

Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyEscape Then 'Se ha pulsado ESC Unload Me 'Se descarga el formulario

Nota: Se usa la instrucción SendKeys para que envíe una tecla [TAB]. Para conocer otras teclas a enviar con SendKeys consultar la Ayuda.

Page 22: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 114

para salir con la tecla [ESC]

ElseIf KeyAscii = vbKeyReturn Then 'Se ha pulsado ENTER 'Se borra la tecla pulsada para que no "pite" KeyAscii = 0 SendKeys "{TAB}" 'Se envía una pulsación TAB

End If End Sub

IV.10. Eventos KeyDown y KeyUp

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

para tener un mayor control en las teclas pulsadas. La principal diferencia con el evento KeyPress es que los códigos no son ASCII , sino códigos de teclado.

Los parámetros por ejemplo para un control cuadro de texto llamado Text1:

Text1_ KeyDown(KeyCode As Integer, Shift As Integer )

Parámetro Valores posibles

KeyCode Código de la tecla. Puede coincidir en algunos casos con el código ASCII, no siempre. Sus valores se pueden ver presionando la tecla [F2].

Shift Indica si se está pulsando algunas de las teclas: [S h i f t ], [C t r l ] o [A l t]. Sus valores son los mismos que para el evento de ratón.

Para que un formulario procese estos eventos Keyxxx a nivel de formulario, antes que los controles, debe tener la propiedad KeyPreview en True.

16. Ejemplo de KeyDown

En el ejemplo se ejecuta el evento KeyDown en las cajas de texto para detectar las teclas de movimiento: Incio, Fin, Flecha abajo, Flecha arriba, Flecha a la derecha, Flecha a la izquierda, Borra a la derecha.

La aplicación empieza posicionado el cursor en la 2º caja de texto. De allí pasa

Nota: Tener en cuenta al utilizar KeyPress en un formulario, para controlar la pulsación de las teclas, que si un botón para salir tiene asignada TRUE en la propiedad Cancel, el formulario no procesarán antes esas pulsaciones.

Page 23: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 115

Mg. Ing. Fátima Martínez

a la Anterior con Flecha abajo y a la Siguiente con Flecha arriba . La etiqueta superior informa cuál es la tecla de movimiento presionada.

Se programa el evento en el formulario el evento KeyPress para pasar de un control a otro con la tecla [ENTER] (la propiedad Preview del formulario está en True).

El botón Salir finaliza con la aplicación, también si se pulsa la tecla [ESC] programada en el evento KeyPress.

Código para el evento KeyDown: Private Sub txtAnterior_KeyDown(KeyCode As Integer, Shift As Integer)

'caja de texto Superior

If KeyCode = vbKeyDown Then

lblTecla = "Flecha abajo"

txtPrim.SetFocus 'Pasa el foco al control siguiente

End If End Sub Private Sub txtPrim_KeyDown(KeyCode As Integer, Shift As Integer)

'Inicia en esta caja de texto

If KeyCode = vbKeyHome Then

lblTecla = "De Inicio"

ElseIf KeyCode = vbKeyEnd Then

lblTecla = "De Fin"

ElseIf KeyCode = vbKeyLeft Then

lblTecla = "Flecha a la izquierda"

ElseIf KeyCode = vbKeyRight Then

lblTecla = "Flecha a la derecha"

ElseIf KeyCode = vbKeyBack Then

lblTecla = "Borra a la derecha"

ElseIf KeyCode = vbKeyDown Then

lblTecla = "Flecha abajo"

txtSiguiente.SetFocus 'Pasa el foco al control siguiente

ElseIf KeyCode = vbKeyUp Then

lblTecla = "Flecha arriba"

txtAnterior.SetFocus 'Pasa el foco al control anterior

Page 24: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 116

End If End Sub Private Sub txtSiguiente_KeyDown(KeyCode As Integer, Shift As Integer)

'Caja de texto Inferior

If KeyCode = vbKeyUp Then

lblTecla = "Flecha arriba"

txtPrim.SetFocus 'Pasa el foco al control anterior

ElseIf KeyCode = vbKeyDown Then

lblTecla = "Flecha abajo"

cmdSalir.SetFocus 'Pasa el foco al control siguiente

End If End Sub

Código del evento KeyPress para salir con [ESC] o para saltar con [ENTER]:

Private Sub Form_KeyPress(KeyAscii As Integer)

If KeyAscii = vbKeyEscape Then 'Se ha pulsado ESC

Unload Me 'Se descarga el formulario

ElseIf KeyAscii = vbKeyReturn Then 'Se ha pulsado ENTER

KeyAscii = 0 'Se borra la tecla pulsada para que no "pite"

SendKeys "{TAB}" 'Se envía una pulsación TAB para pasar a otro control

End If

End Sub

IV.11. Evento DragDrop y DragOver

Una de las peculiaridades del entorno Windows es “arrastrar y soltar objetos”, de este modo se copian ficheros, se cambian objetos de lugar (iconos, la barra de tareas, etc.)

El Drag & Drop es una forma visual de representar el movimiento de algo. Para ello se toma algo de una parte de la interface gráfica, mediante la operación de colocar el puntero del ratón y pulsar su botón izquierdo sobre ese algo que se quiere tomar. Sin dejar de pulsar el botón izquierdo del ratón se desliza (se arrastra) el puntero del ratón hasta el punto de la interface gráfica donde lo queremos dejar. Ese punto puede ser un control o un formulario. Una vez en el

Nota: Tener en cuenta al utilizar algún evento Keyxxx en un formulario, para controlar la pulsación de las teclas, que si el botón en cuestión tiene asignada TRUE en la propiedad Default, el formulario no procesarán antes esas pulsaciones.

Page 25: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 117

Mg. Ing. Fátima Martínez

punto de destino se suelta el botón del ratón y se “deja caer” lo que habíamos tomado en el punto de origen (Suárez Bernardo, L; 1998).

Para realizar esto, Visual Basic dispone de propiedades, métodos y eventos.

El efecto de “tomar” algo de un control se denomina DragOver, y el efecto de dejar caer se denomina DragDrop.

El Drag & Drop tiene un efecto visual muy didáctico, pero en realidad no toma nada del control origen ni lo suelta al llegar a destino. Estas acciones se realizan mediante código en los eventos adecuados: MouseDown, DragOver, DragDrop, dando los valores adecuados a las propiedades DragMode y DragIcon, y utilizando el método Drag.

El evento DragOver sucede mientras se está arrastrando un objeto sobre un control. Suele utilizarse para variar la forma del cursor que se mueve con el ratón dependiendo de si el objeto sobre el que se encuentra el cursor en ese momento es válido para soltar o no. El evento DragDrop sucede al concluir una operación de arrastrar y soltar.

El evento DragOver requiere los argumentos que se muestran a continuación:

Para un control cuadro de texto llamado Text1: Private Sub Text1_DragOver(Source As Control, _ X As Single, Y As Single, State As Integer)

. . . End Sub

Parámetro Valores posibles

Source contiene el objeto que está siendo arrastrado

X, Y indican la posición del objeto arrastrado dentro del sistema de coordenadas del objeto sobre el que se está arrastrando

State Vale: 0 - si está entrando; 1 - si está saliendo; 2 - si permanece dentro del mismo objeto.

IV.11.i. Las propiedades DragMode y DragIcon

Los controles tienen una propiedad llamada DragMode que establece si el arrastre se iniciará y finalizará a través del código, con el método Drag, en modo de arrastre manual o si se usará el modo automático en una operación de arrastrar.

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

Page 26: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 118

Sintaxis: ControlOrigen.DragMode [= número] Donde número puede tomar los valores 0 (Manual, valor predeterminado) ó 1 (Automático).

• vbManual se debe emplear el método Drag para iniciar una operación Drag & Drop.

• vbAutomatic haciendo clic botón izquierdo sobre el objeto se inicia la operación Drag &

Drop.

En principio parece más práctico tener esta propiedad en 1(Automático). Sin embargo, pese a que en el caso de establecerla en 0 (Manual), se debe utilizar el método Drag para iniciar el proceso, es preferible porque se controla mejor el Drag&Drop.

Otro inconveniente de tener la propiedad en automático, es no se sabe si lo que se quiere hacer es establecer el foco en ese control o iniciar una operación de Drag&Drop.

También poseen la propiedad DragIcon que establece un icono personalizado para las operaciones de arrastre de ese control.

Sintaxis: ControlOrigen.DragIcon [= icono] Donde icono es cualquier referencia a una imagen de icono válido.

Si no se especifica esta propiedad, el desplazamiento se expresa mediante un rectángulo del tamaño del control origen. Por lo tanto es preferible poner un icono en esta propiedad.

El valor de esta propiedad puede establecerse en tiempo de diseño, eligiendo el icono en el cuadro de Propiedades del control origen, o en tiempo de ejecución, cargándolo mediante la función LoadPicture :

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

El archivo que se cargue debe tener extensión .ico. y formato de icono.

IV.11.ii. METODO Drag

Con el método Drag, que tienen los controles, se puede controlar exactamente en qué momento se desea producir el inicio y el final del Drag & Drop.

El método Drag lleva un argumento numérico llamado Action el cual determina si se Inicia (1), Termina (2) o Cancela (0) una operación de arrastre de cualquier objeto excepto los controles Line, Menu, Shape o Timer.

Sintaxis: ControlOrigen.Drag TipoAcción

ControlOrigen es el nombre del control donde se inició la operación Drag&Drop.

TipoAcción es un valor o una constante que especifica la acción a realizar, según se describe a continuación:

Page 27: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 119

Mg. Ing. Fátima Martínez

Constante Valor Descripción

vbCancel 0 Cancela la operación de arrastre.

vbBeginDrag 1 Inicia el arrastre del objeto (Predeterminada).

vbEndDrag 2 Termina el arrastre y suelta el objeto.

Sin embargo puede utilizarse el método Drag también cuando tenga el valor 1 (vbAutomatic).

Razón por la que se recomienda DragMode = Manual (0):

• Si en un control, por ejemplo un TextBox, tiene DragMode = 1 (vbAutomatic), será difícil que éste tome el foco y si se consigue no se podrá seleccionar el texto que tiene, ya que VB no sabe si se quiere seleccionar el texto o se desea iniciar una operación Drag & Drop.

Recordemos que “Drag & Drop solamente es una manifestación visual de algo que se está produciendo, pero ese algo deberemos programarlo”.

Un ejemplo típico del uso de Drag & Drop es llevar un texto que tiene una caja de texto a otra mediante D & D. Para ello se declara una variable en la cual se carga ese dato (hacerlo en el lugar donde sea válida para ambos controles) y al final de la operación D & D, se introduce ese valor en el TextBox final.

La carga de la variable se puede realizar en el procedimiento MouseDown del control origen, ya que D & D comienza haciendo clic en el control origen. Si en ese momento dicho control tiene la propiedad DragMode = 0 (vbManual) el mismo toma el foco y se lo puede arrastrar con el ratón para cambiar el texto. En cambio si ese control tiene DragMode = 1 (vbAutomatic), no se podrá.

La operación de arrastre mediante el método Drag comienza en el evento MouseDown del control pasándole el valor: Private Sub Text1_MouseDown(Button As Integer, Shift

As Integer, X As Single, Y As Single) Text1.Drag vbBeginDrag

End sub

Nota: El método Drag para controlar una operación de arrastrar se requiere únicamente cuando la propiedad DragMode del control origen tiene el valor Manual (0).

Page 28: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 120

IV.11.iii. EVENTO DragOver

Cuando una operación de arrastrar y soltar D & D está en progreso y el cursor del ratón pasa por encima de un control o un formulario, se produce el evento DragOver de ese control o formulario (Suárez Bernardo, L; 1998).

Dependiendo del tipo de control, DragOver captura los siguientes parámetros:

• Si se trata de un Formulario convencional:

Private Sub Form_DragOver(Origen As Control, X As Single, Y As Single, Estado As Integer)

• Si se trata de un Control:

Private Sub Control_DragOver([Indice As Integer,]Origen As Control, X As Single, Y As Single, Estado As Integer)

Los parámetros:

Parámetro Descripción

Source (Origen) Control que se está arrastrando, es decir en el que se inicia Drag & Drop.

X, Y Coodenadas que especifican la posición horizontal (X) y vertical (Y) actual del puntero del mouse dentro del control o formulario destino.

Estado (State) Valor entero que indica el Estado de transición del control que se está arrastrando en relación al formulario o control destino.

Index (Indice) Si el control de origen fuese parte de un arreglo de controles, Index contiene el índice de ese control.

Comentarios: • Dentro del procedimiento puede hacerse referencia a las propiedades y

métodos del argumento Source, por ejemplo, Source.Visible = False.

• Las coordenadas X, Y se expresan siempre en términos del sistema de coordenadas del destino tal y como se establece en las propiedades ScaleHeight , ScaleWidth, ScaleLeft y ScaleTop.

• Valores del Estado:

Estado Descripción

0 = Entra. Se produce cuando entra el cursor del ratón al otro control o Formulario. También se genera en el control

Page 29: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 121

Mg. Ing. Fátima Martínez

origen en el instante que se hace clic en el ratón, iniciándose de esta forma el D & D.

1 = Deja Se produce cuando el cursor sale del control o Formulario.

2 = Sobre Se produce cuando se está moviendo el cursor sobre el control o el Formulario destino.

Puede emplearse el procedimiento DragOver para comprobar si el valor que transportamos puede depositarse sobre el control o formulario por el que estamos pasando, si el valor que llevamos está dentro de los márgenes que admite la aplicación, etc. Es muy llamativo por ejemplo, cambiar el color del control que va a recibir el valor traspasado si este valor se sale de los márgenes aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar en ese control. Es típico poner la señal de trafico de Prohibido cuando el dato transportado no se puede soltar sobre el control sobre el que estamos pasando el cursor del ratón. (Como el control origen se pasa como parámetro al procedimiento DragOver con el nombre Origen basta con poner Origen.DragIcon = XXX) Recuerde en este caso que al abandonar ese control debe restaurar el icono original. Para ello es útil cargar varias variables con los distintos iconos que se van a usar y luego igualar la propiedad DragIcon del control origen a una u otra variable, dependiendo de los valores u otros factores de la aplicación (Suárez Bernardo, L; 1998).

En el siguiente ejemplo, se declaran 4 variables tipo Picture que van a almacenar cuatro iconos distintos. Se disponen en el formulario de dos cajas de texto a la izquierda que muestran la variación de las coordenadas del objeto transportado; dos cajas de texto a la izquierda. La superior, Text1, contiene un dato que será transportado a la segunda Text2, si el valor ingresado es 1000 o superior, en caso contrario no será depositado en ésta y el icono del mouse cambia. En Text1 se inicia el proceso de arrastre en el evento MouseDown y en Text2 (sobre el que pasa el control) se programa el evento DragOver. El botón Reinicia (predeterminado) inicializa nuevamente todos los valores y borra las cajas de texto. El botón Salir termina con la aplicación y finaliza el proceso de arrastre.

17. Ejemplo de DragDrop

Arrastra un valor ingresado en una caja de texto hacia otra y lo deposita en ella si ese valor es superior a 999. En caso contrario no lo deposita y el icono cambia.

Page 30: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 122

Declaración de las variables: Option Explicit Dim pepe As String Dim icono1 As Picture, Icono2 As Picture, Icono3 As Picture, Icono4 As Picture

Código del evento Load: Private Sub Form_Load() 'Se cargan los íconos y se inicializa el icono del control origen Set icono1 = LoadPicture("drag1.ico") 'Flecha a la derecha Set Icono2 = LoadPicture("drag2.ico") 'Flecha a la izquierda Set Icono3 = LoadPicture("drop3.ico") 'Osito Set Icono4 = LoadPicture("drop4.ico") 'Stop Text1.DragIcon = Icono3 'Inicia el icono Osito

End Sub

Código del evento MouseDown del control Origen: Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As

Single) 'Inicia el proceso de arrastre pepe = Text1 ‘se carga en la variable Pepe con lo ingresado en Text1 Text1.Drag vbBeginDrag 'Inicia el proceso de arrastre

End Sub

Código del evento DragOver del control Destino: Private Sub Text2_DragOver(Source As Control, X As Single, Y As Single, State As

Integer) 'En el control destino se cambia el icono si el valor de 'la variable transportada (pepe) es mayor de 999 txtCoord(0) = Str(X) 'Función para transformar un valor en string txtCoord(1) = Str(Y) If Val(pepe) > 999 Then 'Si el valor ingresado supera los 999 'Cambia el icono a Flecha a la izquierda Source.DragIcon = Icono2 Text2 = Text1 Else 'Caso contrario cambia a Stop Source.DragIcon = Icono4 End If End Sub

Código del evento Click del botón Reinicia: Private Sub cmdReinicia_Click() 'Botón predeterminado 'Reinicializa en el icono del Osito Text1.DragIcon = Icono3 'Borra las cajas de texto Text1 = ""

Page 31: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 123

Mg. Ing. Fátima Martínez

Text2 = "" txtCoord(0) = "" txtCoord(1) = "" Text1.SetFocus 'Pone el foco en la primera caja de texto Text1.Drag vbCancel 'cancela el proceso de arrastre End Sub

IV.11.iv. EVENTO DragDrop

Ocurre cuando se completa una operación de arrastrar y soltar como resultado de arrastrar un control sobre un formulario o control y liberar el botón del mouse o utilizar el método Drag con su argumento acción establecido en 2 (Drop).

Dependiendo del tipo de control donde se suelte el objeto “dragueado”, DragDrop captura los siguientes parámetros idénticos a los de DragOver:

• Si se suelta en un Formulario convencional:

Private Sub Form_DragDrop(Origen As Control, X As Single, Y As Single)

• Si se suelta en un Control diferente:

Private Sub Control_DragOver([Indice As Integer,]Origen As Control, X As Single, Y As Single)

Utilice un procedimiento de evento DragDrop para controlar qué ocurre tras completarse una operación de arrastrar. Por ejemplo, puede mover el contenido del control origen a un nuevo lugar o copiar un archivo de un lugar a otro, depositar un valor sobre un control etc.

Recuerde que la operación Drag & Drop no hace otra cosa que lo que se puede ver en la interface gráfica. Debe programar el Procedimiento para el evento DragDrop con el código necesario para que se realice la operación deseada.

18. Ejemplo de DragDrop

Para arrastrar una imagen

En un formulario se tiene un objeto imagen llamado Image1, este es arrastrado dentro de la ventana y reubicado en distintos lugares posibles.

La propiedad DragMode del objeto está en 0 (Manual).

Declaración de variables:

Option Explicit Dim DY As Single Dim DX As Single

Page 32: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 124

Código del evento DragDrop sobre el Formulario: Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)

'Se suelta sobre el formulario

Source.Visible = True 'Se hace visible el objeto

Source.Move X - DX , Y - DY 'nueva posición del objeto

Source.Drag vbEndDrag 'Termina el proceso y suelta el objeto

Source.ZOrder 'Determina el orden, el objeto delante del formulario End Sub

Código del evento MouseDown de la Imagen: Inicia el proceso Private Sub image1_MouseDown(Button As Integer, Shift As Integer, X As Single,

Y As Single) 'Inicia el proceso de arrastre

If Button = vbLeftButton Then 'Si se hace clic en el botón izquierdo

DX = X: DY = Y 'se cargan las variables con las coordenadas

Image1.Drag vbBeginDrag 'Permite la operación de Drag & Drop

'Oculta el control. Si no lo hace el formulario no detectaría,

'que se ha soltado si el puntero del ratón no sale del control.

Image1.Visible = False

End If End Sub

Código del evento MouseUp de la Imagen: suelta el mouse Private Sub image1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y

As Single)

If Button = vbLeftButton Then

Image1.Visible = True 'Pone visible nuevamente el objeto Image

Image1.ZOrder 'Determina el orden del objeto adelante

Image1.Drag vbEndDrag 'Termina la operación de arrastrar y suelta el objeto

End If End Sub

Código del evento Click del botón Salir: Private Sub cmdSalir_Click() End End Sub

Código del evento Click del botón Reinicializa: Private Sub cmdReiniciar_Click()

Image1.Visible = True 'Deja visible la imagen Image1.Left = DX 'Inicializa en la posición original Image1.Top = DY End Sub

Page 33: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 125

Mg. Ing. Fátima Martínez

19. Ejemplo de DragDrop.

En el ejemplo distintas imágenes son arrastradas en el formulario Los objetos tienen la propiedad DragMode=1 (Automático).

Código del evento Load del Formulario: Inicializa Private Sub Form_Load() 'Pone en 1 (Automático) el valor de la propiedad DragMode 'la operación Drag & Drop inicia haciendo clic botón izquierdo sobre el objeto. Picture1.DragMode = 1 Picture2.DragMode = 1 Picture3.DragMode = 1 End Sub

Código del evento DragDrop sobre el Formulario: Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) 'Se redefinen las posiciones Source.Move (X - Source.ScaleWidth / 2), (Y - Source.ScaleHeight / 2) End Sub

20. Ejemplo de DragDrop entre listas

Se arrastra un elemento de una lista a otra y de esta a la anterior. Las listas tienen la propiedad DragMode = 0 (Manual).

En un formulario se tienen dos listas List1 y List2. Se arrasta un elemento de List1 hacia List2. En el MouseDown de List1 comienza la operación de arrastre mediante el método Drag, pasándoles el valor vbBeginDrag. En el evento DragDrop, que tiene un parámetro llamado Source, se verifica si es el control indicado, elimina el ítem del List1 y agrega el item al List2.

Page 34: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 126

Se debe especificar el archivo del icono a mostrar en la operación de arrastre en el evento Load del formulario o en tiempo de diseño en la propiedad DragIcon de ambos ListBox.

Código del evento Load sobre el Formulario: Inicializa Private Sub Form_Load() Dim i As Integer 'Agrega los meses del año en List1 For i = 1 To 12 List1.AddItem MonthName(i) Next 'IMPORTANTE: ESPECIFCAR EL ARCHIVO DE ÍCONO ‘QUE SE VA A MOSTRAR CUANDO SE EJECUTE EL DRAG List1.DragIcon = LoadPicture("Drag1.ico") List2.DragIcon = LoadPicture("Drag2.ico") End Sub

Código del evento MouseDown de List1: Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As

Single) 'Inicia la operación de arrastre, es decir el drag para List1 List1.Drag vbBeginDrag End Sub

Código del evento DragDrop sobre la lista List1 de los elementos de List2 'Al soltar el item en List1 se agrega al mismo y se elimina el del List2 Private Sub List1_DragDrop(Source As Control, X As Single, Y As Single) ‘Se suelta el elemento de la lista 2 en la lista 1 'Si el control es el List2 entonces OK. If Source Is List2 Then If List2.ListIndex <> -1 Then 'Se agrega el elemento de la lista 2 en la lista 1 List1.AddItem List2.List(List2.ListIndex) 'Se borra de la lista 2 el elemento arrastrado List2.RemoveItem List2.ListIndex End If End If End Sub

Código del evento MouseDown de List1: Private Sub List2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As

Single) List2.Drag vbBeginDrag 'Comienza el Drag para el List2 End Sub

Código del evento DragDrop sobre la lista List2 de los elementos de List1 'Al soltar el item en List2, se agrega al mismo y se elimina el del List1

Page 35: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 127

Mg. Ing. Fátima Martínez

Private Sub List2_DragDrop(Source As Control, X As Single, Y As Single) 'Si el control es el List1 entonces If Source Is List1 Then If List1.ListIndex <> -1 Then 'Se agrega en la lista 2 el elemento de la lista 1 List2.AddItem List1.List(List1.ListIndex) 'Se borra de la lista 1 el elemento arrastrado List1.RemoveItem List1.ListIndex End If End If End Sub

Código del evento clic del botón Reinicializar: Private Sub cmdRein_Click() ‘Regresa las listas a sus valores iniciales List1.Clear ‘Borra todos los elementos Dim i As Integer 'Agrega los meses del año en List1 For i = 1 To 12 List1.AddItem MonthName(i) Next List2.Clear ‘Borra todos los elementos End Sub

IV.12. Ejercicios propuestos

1) Calculadora:

Crea una aplicación que realice las cuatro operaciones matemáticas, para ello inserta en un formulario: tres etiquetas, tres cajas de texto, un marco y tres botones de opción, tal como se muestra en la figura. Considera lo siguiente:

a) Al iniciar la ejecución el marco debe estar invisible y el foco en el cuadro de texto donde ingresa la primera cantidad.

b) No debe permitirse, en modo ejecución, que el tamaño del formulario se modifique y tampoco que aparezca el menú de control en la barra de títulos de la ventana.

Page 36: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 128

c) Sólo es permitido ingresar hasta 5 caracteres en las dos cantidades con las que se opera.

d) Se programará la caja de texto para que pase el foco al siguiente control con la tecla [En te r ] y sólo si en la primera cantidad se ha ingresado algo.

e) Luego de llenado los dos primeros cuadros de texto, el marco se pondrá en visible y el foco pasará a una de las operaciones pero sin seleccionarse.

f) El cálculo se realizará si se selecciona una opción y el Resultado se presentará con el formato apropiado. Las otras operaciones pueden realizarse una por una y luego pasarse a realizar Otro Cálculo con la tecla [En te r ].

g) El botón Otro Cálculo borra el contenido de las cajas de texto, pone el foco en la primera y pone invisible el marco.

h) El botón Salir termina la aplicación con la tecla [ESC ].

i) Antes de cerrar el formulario se preguntará con una ventana de mensaje si se quiere salir de la aplicación.

Nota: utiliza el método SetFocus, el evento KeyPress, LostFocus y QueryUnload.

2) Mover la foto:

Crea una aplicación que permita mover una imagen a las cuatro esquinas del formulario. Inserta en el formulario una caja combinada, una caja de imagen y dos botones de comando. Considera lo siguiente:

a) La caja combinada, cargada en tiempo de diseño, debe presentar una lista siempre visible, no desplegable y permitir seleccionar elementos de la lista.

b) Al iniciar la aplicación el foco estará en la caja combinada y la primera opción se encontrará seleccionada; la imagen se hallará en la parte media del formulario.

c) Establezca la propiedad correspondiente para que el botón Mover ejecuta su procedimiento al presionar [En te r ] una vez hecha la selección.

d) El botón Mover permitirá ejecutar la acción del cambio de posición de la imagen a los distintos extremos según la opción seleccionada en la caja combinada.

e) El botón Restaurar permitirá que la imagen regrese a la posición inicial dentro de la ventana y restaurará las propiedades iniciales de los controles.

Page 37: Capitulo4_Eventos

PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC

AÑO 2008

C A P I T U L O I V

Página 129

Mg. Ing. Fátima Martínez

f) No debe permitirse modificar el tamaño del formulario en tiempo de ejecución.

g) Se deberá terminar con la aplicación presionando el botón X de la ventana. Antes de salir debe preguntar si está seguro mostrando una caja de mensaje.

h) Programa también en el evento apropiado para salir al presionar la tecla [ESC].

Nota: utiliza el método SetFocus y el Move, el evento KeyPress y el evento QueryUnload.

3) Llevar a Devil a la casa:

En este ejercicio practica el “dragueo” de una imagen llamada Devil. Arrastra a Devil hacia la imagen de la casa. Considera lo siguiente:

a) Devil tiene la propiedad DragMode = 0 (Manual).

b) Al iniciar la aplicación determina la posición inicial de la imagen dentro del formulario.

c) Debes mostrar la imagen en el proceso Drga & Drop sobre el formulario.

d) Cuando Devil llegue a la casa deberá desaparecer.

e) El botón Restaura volverá a hacer aparecer la imagen en la posición original.

Nota: utiliza el método Drag, el evento DragOver y DragDrop.

Page 38: Capitulo4_Eventos

Capitulo IV: Manejo de Eventos Mg. Ing. Fátima Martínez

Página 130

BIBLIOGRAFÍA CONSULTADA Y RECURSOS EN LA WEB

Nombre Autor/Año Edición, Editorial / Dirección del Sitio

Microsoft Visual Basic 6.0. Manual de Referencia

Birnios, B. y Birnios, M.; 2003

Manuales USERS; MP Ediciones; Buenos Aires – Argentina.

Cómo saber los eventos que producen los formularios y controles

Som, G, 1998 http://www.elguille.info/vb/cursos_vb/basico/basico23.htm; (accedido 02/08/2007).

Los eventos producidos al pulsar las teclas: KeyPress, KeyDown, KeyUp

Som, G, 1998 http://www.elguille.info/vb/cursos_vb/basico/basico24.htm; (accedido 02/08/2007)

Otros eventos: GotFocus, LostFocus, Change.Arrastrar y soltar (Drag & Drop)

Som, G, 1998 http://www.elguille.info/vb/cursos_vb/basico/basico25.htm; (accedido 02/08/2007)

DragOver y DragDrop http://www.wikilearning.com/dragover_y_dragdrop-wkccp-16856-57.htm; (accedido 27/08/2007)

Curso de Visual Basic Avanzado

Ordovás Oromendía, J. y Lema Osca, V.; 1999

www.infomanuales.com/Manuales/VisualBasic/VisualBasic.asp (accedido 02/08/2007)

Aprenda Visual Basic como si estuviera en primero

García de Jalón y otros; 1999

http://www.tecnun.es/asignaturas/Informat1/ayudainf/aprendainf/VisualBasic6/vbasic60.pdf (accedido

Fundamentos de programación en Visual Basic

Matta Gonzales, Danny A.

http://www.cs.us.es/cursos/ai-2003/VB/VB.pdf (accedido 21/07/2007)

Guia del Estudiante. Cap. 9. EL DRAG & DROP (Arrastrar y Soltar)

Suárez Bernardo, L.; 1998

http://www.monografias.com/trabajos2/guiavb/guiavb.shtml (accedido 02/08/2007)