Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
IV.1. Eventos generales.................................................................96 IV.2. Para saber los eventos que producen los controles .................96 IV.3. Secuencia de eventos ............................................................97 IV.4. Ciclo de vida de un formulario ...............................................97 IV.4.i. IV.4.i.1. IV.4.i.2. IV.4.i.3. IV.4.i.4. IV.4.i.5. IV.4.i.6. IV.4.ii. Eventos para arrancar una aplicacin ..............................98 Creado.........................................................................98 Cargado .......................................................................98 Mostrado......................................................................99 Eventos para terminar una aplicacin............................99 Descargado ..................................................................99 Eliminado................................................................... 101 Ejemplo del ciclo de vida de un formulario...................... 102
IV.5. Otros eventos para Formulario ............................................ 104 IV.6. Eventos LostFocus y GotFocus ............................................. 104 IV.7. Evento MouseDown, MouseUp y MouseMove ......................... 105 IV.8. Evento Click y DblClick ....................................................... 108 IV.9. Evento KeyPress ................................................................ 109 IV.9.i. IV.9.ii. IV.10. IV.11. IV.11.ii. IV.11.iii. IV.11.iv. IV.12. Pasar a otro control sin usar la tecla Tab ....................... 113 Usar la tecla ESC para salir ........................................... 113 Eventos KeyDown y KeyUp ............................................ 114 Evento DragDrop y DragOver ........................................ 116 METODO Drag ............................................................ 118 EVENTO DragOver ...................................................... 120 EVENTO DragDrop ..................................................... 123 Ejercicios propuestos .................................................... 127
LABORATORIO II - AO 2008
Pgina 94
CAPITULO IV Pgina 95
Visual Basic es un lenguaje orientado a eventos ya que la mayor parte del cdigo a escribir corresponde a los procedimientos o funciones que se activan luego de producidos ciertos eventos (Birnios, B. y Birnios, M.; 2003:85). En este captulo se darn a conocer los eventos ms habituales de Visual Basic. Cabe aclarar que VB tiene muchas ms posibilidades de las que aqu se presentan. Se ha dicho, en el Captulo I, que los eventos son acciones que el usuario puede efectuar sobre el control y son reconocidas por ste. Ante un evento sobre un determinado control, VB arranca una determinada funcin o procedimiento que realiza la accin programada por el usuario para ese evento concreto. Un evento tiene la siguiente forma general: Sub Objeto_Evento([argumentos]) - Sentencias End Sub Sentencias son las programadas por el usuario y se ejecutarn cuando ocurra el evento. Los eventos son, entonces, notificaciones que el objeto enva de que un suceso de importancia ha ocurrido. Estos son muy utilizados sobre todo en los controles. Argumentos son los datos que se pasan al procedimiento Sub para que se ejecuten las sentencias. Los eventos deben ser seleccionados desde la ventana del Editor de Cdigo que aparece cuando se hace doble Clic sobre el control. El cdigo describe los sucesos que se ejecutarn cuando suceda el evento sentarse. Sub Silla_Sentarse() Peso es Variable Si Peso es mayor a 100kg, entonces: Silla.Romper Sillas.Patas=0 Sino Silla.Soportar Fin de Secuencia Si End Sub
1. Ejemplo de Eventos El objeto silla puede tener un evento Sentarse. Las acciones para este evento sern:
IV.1.
Eventos generales
El usuario de Windows est familiarizado con los eventos pero es posible que nunca se haya detenido a pensar en ello. A continuacin se presentan los eventos ms comunes que reconoce VB. Cada clase de objeto tiene sus propios eventos, pero no todos los objetos soportan los mismos eventos; algunos no estn disponibles en los dems. En el caso de los eventos del ratn, casi la mayora los aceptan. Para saber qu eventos puede recibir un control determinado se lo selecciona y luego se pulsa la tecla F1 de la Ayuda, de esta manera se abre una ventana que explica el control y permite acceder a los eventos que soporta. El evento Click es el principal de todos los controles, p ero en una aplicacin se pueden producir muchos eventos generados por el usuario o incluso el programa puede generar otros. La siguiente tabla muestra los eventos ms importantes comunes a varios controles. Evento
Change DblClick DragDrop DragOver GotFocus KeyDown KeyPress KeyUp Load LostFocus MouseDown MouseMove MouseUp UnLoad
Se produce cuando
El usuario modifica el estado de un control. El usuario pulsa dos veces un objeto con el botn primario del mouse. El usuario arrastra un control con el botn primario del mouse. Un objeto se arrastra sobre un control. Un objeto recibe el foco. Se pulsa una tecla mientras un objeto tiene el foco. Se pulsa y se suelta una tecla mientras un objeto tiene el foco. Se suelta una tecla mientras un objeto tiene el foco. Se carga un objeto en memoria. Un objeto perdi el foco. Se puls un botn del mouse sobre un objeto. Se movi el cursor del mouse sobre un objeto. Se solt un botn del mouse sobre un objeto. Se descarga un objeto de memoria.
IV.2.
Para saber los eventos que 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
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).
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.
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
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.
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
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.
Cuando un formulario se cierra o elimina se producen los siguientes eventos en este orden: QueryUnload, Unload y Terminate . Se dispara por un evento Unload, antes de ejecutar el cdigo para este evento. Ofrece la posibilidad de detener el cierre de QueryUnload un formulario. Ideal cuando se cierra el formulario y hay datos que no se guardaron. UnLoad Terminate Se dispara cuando el usuario cierra el formulario y est a punto de descargarse. Se produce cuando se elimina de memoria el formulario.
IV.4.i.5.
Descargado
Una vez terminado el proceso de descarga el formulario no es visible, y sus componentes no son accesibles. Este proceso se produce cuando se cierra el formulario: pulsando el botn cerrar, ejecutando el mtodo Unload del formulario, etc. El proceso de descarga de un formulario genera a su vez dos eventos en el siguiente orden: QueryUnload y Unload. En general, se aprovechan para Mg. Ing. Ftima Martnez
liberar la memoria ocupada por los elementos que pertenecen al formulario antes de que este se cierre, salvar el trabajo que est pendiente de guardado, etc. El evento Unload se desencadena porque un usuario cierra el formulario mediante el botn cerrar o el comando Cerrar del men de control o una sentencia Unload2. En los dos eventos podemos detener el proceso de descarga estableciendo el valor del parmetro Cancel a cualquier nmero distinto de 0.
Nota Si se cierra la aplicacin mediante un botn de comando Salir o con un End , no se pasa por el evento Unload. Cuando se finaliza la aplicacin con la sentencia End no se desencadena ningn evento de los formularios
El parmetro Cancel, es un entero que determina si el formulario es descargado. Si Cancel = 0, el formulario se descarga. Si Cancel = True se impide que el formulario sea descargado. Antes de que se intente cerrar el formulario se pregunta mediante una caja de mensaje. En caso afirmativo se cierra el formulario de lo contrario no ha pasado nada: 2. Ejemplo del uso del evento Unload Sub Form_Unload(Cancel As Integer) If MsgBox(Esta seguro de cerrar la ventana?, VbYesNo + vbQuestion, Mensaje)= vbNo Then Cancel = True End If End Sub Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If MsgBox("Est seguro de salir de la aplicacin?", vbYesNo, "Atencin") = vbNo Then Cancel = True End If End Sub
Descarga un formulario de memoria. Su sintaxis Unload NombreDelFormulario. Use la palabra Me para referirse al formulario actual: Unload Me
Pgina 100
IV.4.i.6.
Eliminado
Aunque est descargado un formulario, mientras existe cualquier referencia al mismo, no est totalmente eliminado de memoria. Cuando se lo elimina se genera el evento Terminate y el formulario desaparece de memoria.
4. Ejemplo completo de los eventos: Initialize, Activate y QueryUnload Botn Salir para terminar la aplicacin.
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.
PROGRAMADOR UNIVERSITARIO LABORATORIO II - VISUAL BASIC AO 2008 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.
MsgBox "Formulario1: Se Muestra", vbInformation, "Evento Paint" Print "Formulario1" End Sub Private Sub Form_Terminate() MsgBox "Formulario1: Finaliza", , "Primer Formulario" End Sub Private Sub Form_Unload(Cancel As Integer) MsgBox "Formulario1: Se Descarga", , "Primer Formulario" End Sub 'Escribe sobre el formulario actual
IV.5.
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.
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
cada comento ese control, ventana o formulario es el que dispone del foco (focus) (Garca de Jaln y otros; 1999:50). El control que tiene el foco aparece resaltado con letra negrita, con un contorno ms vivo o con el cursor titilando en l. El foco puede pasar de un objeto a otro por cdigo, porque el usuario ha cliqueado en l o ha pulsado la tecla [Tab]. Cuando un control se convierte en activo y recibe el foco, produce el evento GotFocus; de igual forma, cuando deja de ser el control activo, hace sonar la alarma mediante el evento LostFocus.
Nota El mtodo SetFocus permite dar el foco al objeto al que se aplica.
El control en el que suele usarse estos eventos, de forma ms habitual, es el TextBox. Private Sub txtNombre_LostFocus() 'Chequea que no est vaco If txtNombre = "" Then 'Si esta vaco no pasa a otro control Beep 'pitea 'mantiene el foco txtNombre.SetFocus Else 'Si no est vaco pasa el foco txtCodigo.SetFocus End If End Sub Private Sub txtCodigo_GotFocus() txtCodigo.PasswordChar = "?" txtCodigo.FontName = "Arial" txtCodigo.FontSize = 14 txtCodigo.FontBold = True End Sub
7. Ejemplo de LostFocus
El siguiente cdigo evitar que un cuadro de texto llamado txtNombre est vaco antes de pasar a otro control.
8. Ejemplo de GotFocus El siguiente cdigo inicializa las propiedades del control cuando tenga el foco.
IV.7.
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
posicin dentro del control (X, Y) y si se est pulsando la tecla [S h i f t ], [C t r l ] o [A l t] (Shift). Para un objeto formulario: Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) El evento MouseUp se produce cuando se suelta el botn que haba sido pulsado. Los parmetros son los mismos que para MouseDown, pero en este caso lo que se detecta es cuando se suelta el botn pulsado. Vamos a ver los parmetros y algunos de los valores disponibles. Parmetro
Button
Valores posibles
Indica el botn que se est pulsando. Puede tener los siguientes valores: 1 se est pulsando o soltado el botn izquierdo, 2 se est pulsando o soltado el derecho, 4 se est pulsando o soltado el botn central. Slo se controla un botn a la vez. Indica si se est pulsando algunas de las teclas: [Shift], [Ctrl] o [Alt]. El valor devuelto corresponde con: 1 se est pulsando la tecla [Shift] 2 se est pulsando [Control] 4 se est pulsando [Alt] Se permiten combinaciones de estos valores, es decir que si se pulsan varias de esas teclas, los valores sern: 3 se estn pulsando [Shift] y [Ctrl], 5 se estn pulsando [Shift] y [Alt], 6 se estn pulsando [Ctrl] y [Alt], 7 se estn pulsando las tres teclas. Indica las coordenadas de la posicin del puntero del ratn dentro del control. Es importante saber que estos valores son slo dentro del control en cuestin, no referente al formulario o la pantalla.
Shift
X, Y
El evento MouseDown se suele usar, entre otras cosas, para mostrar mens emergentes (PopUpMenus), normalmente controlando que se haya pulsado el botn derecho (cuando Button vale 2). El evento MouseMove se produce cada vez que se mueve el ratn sobre un control o formulario. Los parmetros de este procedimiento son los mismos que en los otros referentes al ratn: Para cualquier control por ejemplo en un formulario:
Pgina 106
Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Option Explicit Dim Now As Boolean
tipo True/False
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.
10. Ejercicio que inicia preguntando si Est conforme con el sueldo que gana. Seguro que la mayora va a contestar que No, entonces mediante un truco cuando quieran hacer Click en el Botn de No, este se mueve a una nueva posicin aleatoriamente entre las medidas de ancho y alto del formulario. Mg. Ing. Ftima Martnez
Capitulo IV: Manejo de Eventos Con el Botn Si, salimos del programa.
IV.8.
El evento Click se produce cuando se hace clic en un control. Es una combinacin del MouseDown seguido de un evento MouseUp y por ltimo Click . Se producen los tres eventos en ese orden: primero se presiona, despus se suelta y por ltimo se produce el clic. El DblClick se produce cuando se hace una doble pulsacin, un doble clic. Normalmente se producen en este orden: primero el MouseDown, seguido de un MouseUp, a continuacin un Click seguido de un DblClick y por ltimo un
MouseUp.
Private Sub Form_Click() Print "Se ha pulsado sobre el formulario (Click)" End Sub Private Sub Form_DblClick() Print "Doble pulsacin en el formulario (DblClick)" End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Print "Se ha pulsado el botn del ratn (MouseDown)" End Sub
Pgina 108
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Print "Se ha soltado el botn del ratn (MouseUp)" End Sub
IV.9.
Evento KeyPress
Este evento se produce cada vez que se pulsa una tecla, al menos una tecla normal, las especiales no se consideran normales y no se suelen detectar en este evento. (Som, G.; 1998). Con el evento KEYPRESS se pueden detectar todas las teclas las alfanumricas y otros caracteres, adems de la tecla [E N T E R ], salvo la tecla [TAB] ya que es una tecla especial. La informacin que acepta este evento como parmetro es KeyAscii, indica el cdigo de la tecla pulsada. Este cdigo da un valor numrico, no una cadena. Por ejemplo, para un control cuadro de texto llamado Text1: Text1_KeyPress(KeyAscii As Integer)
Nota Para saber el valor de las teclas se puede pulsar [F2 ] para abrir el Examinador de objetos y buscar las constantes de KeyCode . Tambin en la ayuda se busca la palabra KeyCode .
Si se pulsa la tecla A mayscula, KeyAscii valdr 65, ya que ese es su valor ASCII. Los valores Ascii se pueden saber usando la funcin ASC y hacer una comparacin de este tipo: Para un control cuadro de texto llamado Text1: If KeyAscii = Asc("A") Then MsgBox Se ha pulsado la A mayscula End if Suele detectarse la pulsacin de la tecla [ENTER], entre otras cosas, porque emite un pitido cada vez que se pulsa Por ejemplo en las cajas de texto, para evitar ese "pitido", se puede hacer esto: If KeyAscii = vbKeyReturn Then KeyAscii = 0 'Eliminamos el pitido End If
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
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.
txtDatos(Index + 1).SetFocus
Pgina 110
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].
Pgina 112
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.
Nota: Tener en cuenta al utilizar KeyPress en un formulario, para controlar la pulsacin de las teclas, que si un botn para salir tiene asignada TRUE en la propiedad Cancel, el formulario no procesarn antes esas pulsaciones.
IV.10.
para
tener un mayor control en las teclas pulsadas. La principal diferencia con el evento KeyPress es que los cdigos no son ASCII , sino cdigos de teclado. Los parmetros por ejemplo para un control cuadro de texto llamado Text1: Text1_ KeyDown(KeyCode As Integer, Shift As Integer )
Parmetro
KeyCode Shift
Valores posibles
Cdigo de la tecla. Puede coincidir en algunos casos con el cdigo ASCII , no siempre. Sus valores se pueden ver presionando la tecla [F2]. Indica si se est pulsando algunas de las teclas: [S h i f t ], [C t r l ] o [A l t ]. Sus valores son los mismos que para el evento de ratn.
Para que un formulario procese estos eventos Keyxxx a nivel de formulario, antes que los controles, debe tener la propiedad KeyPreview en True.
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
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.
End If End Sub Private Sub txtSiguiente_KeyDown(KeyCode As Integer, Shift As Integer) 'Caja de texto Inferior If KeyCode = vbKeyUp Then lblTecla = "Flecha arriba" txtPrim.SetFocus 'Pasa el foco al control anterior ElseIf KeyCode = vbKeyDown Then lblTecla = "Flecha abajo" cmdSalir.SetFocus End If End Sub 'Pasa el foco al control siguiente
Cdigo del evento KeyPress para salir con [ESC] o para saltar con [ENTER]:
Private Sub Form_KeyPress(KeyAscii As Integer) If KeyAscii = vbKeyEscape Then Unload Me ElseIf KeyAscii = vbKeyReturn Then KeyAscii = 0 SendKeys "{TAB}" End If End Sub 'Se ha pulsado ESC 'Se descarga el formulario 'Se ha pulsado ENTER 'Se borra la tecla pulsada para que no "pite" 'Se enva una pulsacin TAB para pasar a otro control
Nota: Tener en cuenta al utilizar algn evento Keyxxx en un formulario, para controlar la pulsacin de las teclas, que si el botn en cuestin tiene asignada TRUE en la propiedad Default, el formulario no procesarn antes esas pulsaciones.
IV.11.
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
punto de destino se suelta el botn del ratn y se deja caer lo que habamos tomado en el punto de origen (Surez Bernardo, L; 1998). Para realizar esto, Visual Basic dispone de propiedades, mtodos y eventos. El efecto de tomar algo de un control se denomina DragOver, y el efecto de dejar caer se denomina DragDrop. El Drag & Drop tiene un efecto visual muy didctico, pero en realidad no toma nada del control origen ni lo suelta al llegar a destino. Estas acciones se realizan mediante cdigo en los eventos adecuados: MouseDown, DragOver, DragDrop, dando los valores adecuados a las propiedades DragMode y DragIcon, y utilizando el mtodo Drag. El evento DragOver sucede mientras se est arrastrando un objeto sobre un control. Suele utilizarse para variar la forma del cursor que se mueve con el ratn dependiendo de si el objeto sobre el que se encuentra el cursor en ese momento es vlido para soltar o no. El evento DragDrop sucede al concluir una operacin de arrastrar y soltar. El evento DragOver requiere los argumentos que se muestran a continuacin: Para un control cuadro de texto llamado Text1: Private Sub Text1_DragOver(Source As Control, _ X As Single, Y As Single, State As Integer) ... End Sub Parmetro
Source X, Y State
Valores posibles
contiene el objeto que est siendo arrastrado indican la posicin del objeto arrastrado dentro del sistema de coordenadas del objeto sobre el que se est arrastrando Vale: 0 - si est entrando; 1 - si est saliendo; 2 - si permanece dentro del mismo objeto.
Nota: el evento DragOver pertenece al objeto sobre el que se arrastra, no al objeto que es arrastrado.
IV.11.i.
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
ControlOrigen.DragMode [= nmero]
Donde nmero puede tomar los valores 0 (Manual, valor predeterminado) 1 (Automtico).
vbManual
Drop.
se debe emplear el mtodo Drag para iniciar una operacin Drag & Drop.
vbAutomatic haciendo clic botn izquierdo sobre el objeto se inicia la operacin Drag &
En principio parece ms prctico tener esta propiedad en 1(Automtico). Sin embargo, pese a que en el caso de establecerla en 0 (Manual), se debe utilizar el mtodo Drag para iniciar el proceso, es preferible porque se controla mejor el Drag&Drop . Otro inconveniente de tener la propiedad en automtico, es no se sabe si lo que se quiere hacer es establecer el foco en ese control o iniciar una operacin de
Drag&Drop.
Tambin poseen la propiedad DragIcon que establece un icono personalizado para las operaciones de arrastre de ese control. Sintaxis:
ControlOrigen.DragIcon [= icono]
Donde icono es cualquier referencia a una imagen de icono vlido. Si no se especifica esta propiedad, el desplazamiento se expresa mediante un rectngulo del tamao del control origen. Por lo tanto es preferible poner un icono en esta propiedad. El valor de esta propiedad puede establecerse en tiempo de diseo, eligiendo el icono en el cuadro de Propiedades del control origen, o en tiempo de ejecucin, cargndolo mediante la funcin LoadPicture :
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
Valor
0 1 2
Cancela la operacin de arrastre. Inicia el arrastre del objeto (Predeterminada). Termina el arrastre y suelta el objeto.
Nota: El mtodo Drag para controlar una operacin de arrastrar se requiere nicamente cuando la propiedad DragMode del control origen tiene el valor Manual (0).
Sin embargo puede utilizarse el mtodo Drag tambin cuando tenga el valor 1 (vbAutomatic). Razn por la que se recomienda DragMode = Manual (0):
Si en un control, por ejemplo un TextBox, tiene DragMode = 1 (vbAutomatic), ser difcil que ste tome el foco y si se consigue no se podr seleccionar el texto que tiene, ya que VB no sabe si se quiere seleccionar el texto o se desea iniciar una operacin Drag & Drop.
Recordemos que Drag & Drop solamente es una manifestacin visual de algo que se est produciendo, pero ese algo deberemos programarlo. Un ejemplo tpico del uso de Drag & Drop es llevar un texto que tiene una caja de texto a otra mediante D & D. Para ello se declara una variable en la cual se carga ese dato (hacerlo en el lugar donde sea vlida para ambos controles) y al final de la operacin D & D, se introduce ese valor en el TextBox final. La carga de la variable se puede realizar en el procedimiento MouseDown del control origen, ya que D & D comienza haciendo clic en el control origen. Si en ese momento dicho control tiene la propiedad DragMode = 0 (vbManual) el mismo toma el foco y se lo puede arrastrar con el ratn para cambiar el texto. En cambio si ese control tiene DragMode = 1 (vbAutomatic), no se podr. La operacin de arrastre mediante el mtodo Drag comienza en el evento MouseDown del control pasndole el valor: Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Text1.Drag vbBeginDrag End sub Mg. Ing. Ftima Martnez
Si se trata de un Control:
Private Sub Control_DragOver([Indice As Integer,]Origen As Control, X As Single, Y As Single, Estado As Integer) Los parmetros: Parmetro
Source (Origen) X, Y
Descripcin
Control que se est arrastrando, es decir en el que se inicia Drag & Drop. Coodenadas que especifican la posicin horizontal (X) y vertical (Y) actual del puntero del mouse dentro del control o formulario destino. Valor entero que indica el Estado de transicin del control que se est arrastrando en relacin al formulario o control destino. Si el control de origen fuese parte de un arreglo de controles, Index contiene el ndice de ese control.
Estado (State)
Index (Indice)
Comentarios:
Dentro del procedimiento puede hacerse referencia a las propiedades y mtodos del argumento Source, por ejemplo, Source.Visible = False. Las coordenadas X, Y se expresan siempre en trminos del sistema de coordenadas del destino tal y como se establece en las propiedades ScaleHeight , ScaleWidth, ScaleLeft y ScaleTop. Valores del Estado: Estado
0 = Entra.
Descripcin
Se produce cuando entra el cursor del ratn al otro control o Formulario. Tambin se genera en el control
Pgina 120
origen en el instante que se hace clic en el ratn, inicindose de esta forma el D & D. 1 = Deja 2 = Sobre Se produce cuando el cursor sale del control o Formulario. Se produce cuando se est moviendo el cursor sobre el control o el Formulario destino.
Puede emplearse el procedimiento DragOver para comprobar si el valor que transportamos puede depositarse sobre el control o formulario por el que estamos pasando, si el valor que llevamos est dentro de los mrgenes que admite la aplicacin, etc. Es muy llamativo por ejemplo, cambiar el color del control que va a recibir el valor traspasado si este valor se sale de los mrgenes aceptables. O cambiar la propiedad DragIcon del control origen cuando ese dato no se puede depositar en ese control. Es tpico poner la seal de trafico de Prohibido cuando el dato transportado no se puede soltar sobre el control sobre el que estamos pasando el cursor del ratn. (Como el control origen se pasa como parmetro al procedimiento DragOver con el nombre Origen basta con poner Origen.DragIcon = XXX) Recuerde en este caso que al abandonar ese control debe restaurar el icono original. Para ello es til cargar varias variables con los distintos iconos que se van a usar y luego igualar la propiedad DragIcon del control origen a una u otra variable, dependiendo de los valores u otros factores de la aplicacin ( Surez Bernardo, L; 1998). En el siguiente ejemplo, se declaran 4 variables tipo Picture que van a almacenar cuatro iconos distintos. Se disponen en el formulario de dos cajas de texto a la izquierda que muestran la variacin de las coordenadas del objeto transportado; dos cajas de texto a la izquierda. La superior, Text1, contiene un dato que ser transportado a la segunda Text2, si el valor ingresado es 1000 o superior, en caso contrario no ser depositado en sta y el icono del mouse cambia. En Text1 se inicia el proceso de arrastre en el evento MouseDown y en Text2 (sobre el que pasa el control) se programa el evento DragOver. El botn Reinicia (predeterminado) inicializa nuevamente todos los valores y borra las cajas de texto. El botn Salir termina con la aplicacin y finaliza el proceso de arrastre.
17. Ejemplo de DragDrop Arrastra un valor ingresado en una caja de texto hacia otra y lo deposita en ella si ese valor es superior a 999. En caso contrario no lo deposita y el icono cambia.
Pgina 122
Private Sub Control_DragOver([Indice As Integer,]Origen As Control, X As Single, Y As Single) Utilice un procedimiento de evento DragDrop para controlar qu ocurre tras completarse una operacin de arrastrar. Por ejemplo, puede mover el contenido del control origen a un nuevo lugar o copiar un archivo de un lugar a otro, depositar un valor sobre un control etc. Recuerde que la operacin Drag & Drop no hace otra cosa que lo que se puede ver en la interface grfica. Debe programar el Procedimiento para el evento DragDrop con el cdigo necesario para que se realice la operacin deseada. En un formulario se tiene un objeto imagen llamado Image1, este es arrastrado dentro de la ventana y reubicado en distintos lugares posibles. La propiedad DragMode del objeto est en 0 (Manual).
Declaracin de variables:
Option Explicit Dim DY As Single Dim DX As Single
'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
Pgina 124
19. Ejemplo de DragDrop. En el ejemplo distintas imgenes son arrastradas en el formulario Los objetos tienen la propiedad DragMode=1 (Automtico).
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
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 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 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
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
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.
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.
2) Mover la foto:
Crea una aplicacin que permita mover una imagen a las cuatro esquinas del formulario. Inserta en el formulario una caja combinada, una caja de imagen y dos botones de comando. Considera lo siguiente: a) La caja combinada, cargada en tiempo de diseo, debe presentar u lista siempre na visible, no desplegable y permitir seleccionar elementos de la lista. b) Al iniciar la aplicacin el foco estar en la caja combinada y la primera opcin se encontrar seleccionada; la imagen se hallar en la parte media del formulario. c) Establezca la propiedad correspondiente para que el botn Mover ejecuta su procedimiento al presionar [E n t e r ] una vez hecha la seleccin. d) El botn Mover permitir ejecutar la accin del cambio de posicin de la imagen a los distintos extremos segn la opcin seleccionada en la caja combinada. e) El botn Restaurar permitir que la imagen regrese a la posicin inicial dentro de la ventana y restaurar las propiedades iniciales de los controles.
Pgina 128
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.
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.
Autor/Ao
Birnios, B. y Birnios, M.; 2003 Som, G, 1998
Som, G, 1998
Som, G, 1998
http://www.wikilearning.com/dragover_y_dragdropwkccp-16856-57.htm; (accedido 27/08/2007) Ordovs Oromenda, J. y www.infomanuales.com/Manuales/VisualBasic/Visu Lema Osca, V.; 1999 alBasic.asp (accedido 02/08/2007) Garca de Jaln y otros; 1999 http://www.tecnun.es/asignaturas/Informat1/ayudainf /aprendainf/VisualBasic6/vbasic60.pdf (accedido
Matta Gonzales, Danny http://www.cs.us.es/cursos/ai-2003/VB/VB.pdf A. (accedido 21/07/2007) Surez Bernardo, L.; 1998 http://www.monografias.com/trabajos2/guiavb/guiav b.shtml (accedido 02/08/2007)
Pgina 130