Vous êtes sur la page 1sur 7

Eventos (Gua de programacin de C#)

Los eventos proporcionan un medio de que una clase u objeto informe a otras clases u objetos cuando sucede algo relevante. La clase que enva (o produce) el evento recibe el nombre de editor y las clases que reciben (o controlan) el evento se denominan suscriptores. En una aplicacin de formularios Windows Forms o Web en C# tpica, se suscribe a eventos generados por controles como botones y cuadros de lista. Puede utilizar el entorno de desarrollo integrado (IDE) Visual C# para examinar los eventos que publica un control y seleccionar los que desea controlar. El IDE agrega automticamente un mtodo de controlador de eventos vaco y el cdigo para suscribirse al evento. Para obtener ms informacin, vea Cmo: Suscribir y cancelar la suscripcin a eventos (Gua de programacin de C#).

Informacin general de eventos


Los eventos tienen las propiedades siguientes:
y y y y y

y y

El editor determina cundo se produce un evento; los suscriptores determinan qu operacin se realiza en respuesta al evento. Un evento puede tener varios suscriptores. Un suscriptor puede controlar varios eventos de varios editores. No se llama nunca a los eventos que no tienen suscriptores. Los eventos se utilizan normalmente para sealar acciones del usuario como hacer clic en un botn o seleccionar un men en interfaces grficas de usuario. Si un evento tiene varios suscriptores, se invocan los controladores de eventos sincrnicamente cuando se produce el evento. Para invocar de forma asincrnica los eventos, vea Llamar a mtodos sincrnicos de forma asincrnica. Los eventos se pueden utilizar para sincronizar subprocesos. En la biblioteca de clases .NET Framework, los eventos se basan en el delegado EventHandler y en la clase base EventArgs. TIPOS DE EVENTOS

Una accin, reconocida por un objeto, para la cual puede escribir cdigo de respuesta. Los eventos pueden estar generados por una accin del usuario, como hacer clic con el mouse o presionar una tecla, por cdigo de programa o por el sistema, como ocurre con los cronmetros. Form (Objeto), Forms (Coleccin) Un objeto Form es una ventana o un cuadro de dilogo que forma parte de la interfaz de usuario de una aplicacin.

Forms es una coleccin cuyos elementos representan cada formulario cargado en una aplicacin. La coleccin incluye el formulario MDI, el formulario secundario MDI y formularios no MDI de la aplicacin. La coleccin Forms tiene una nica propiedad, Count, que especifica el nmero de elementos de la coleccin. Sintaxis Form Forms(ndice) El marcador de posicin ndice representa un entero entre 0 y Forms.Count - 1. Comentarios Puede usar la coleccin Forms para iterar a travs de todos los formularios cargados en una aplicacin. Identifica una variable global intrnseca denominada Forms. Puede pasar Forms(ndice) a una funcin cuyo argumento se especifica como una clase Forms. Los formularios tienen propiedades que determinan aspectos de su apariencia (como posicin, tamao y color) y aspectos de su comportamiento (como si puede ajustar o no su tamao). Los formularios tambin pueden responder a eventos iniciados por un usuario o desencadenados por el sistema. Por ejemplo, podra escribir cdigo en el procedimiento de evento Click de un formulario que permitiera al usuario cambiar el color de un formulario haciendo clic en l. Adems de propiedades y eventos, puede emplear mtodos para manipular formularios mediante cdigo. Por ejemplo, puede usar el mtodo Move para cambiar la ubicacin y el tamao de un formulario. Un tipo especial de formulario, el formulario MDI, puede contener otros formularios llamados formularios secundarios MDI. Un formulario MDI se crea con el comando Agregar formulario MDI del men Proyecto; un formulario secundario MDI se crea eligiendo Nuevo formulario en el men Archivo y, a continuacin, estableciendo la propiedad MDIChild a True. Puede crear mltiples instancias de formularios en cdigo si utiliza la palabra clave New en instrucciones Dim, Set y Static. Al disear formularios, establezca la propiedad BorderStyle para definir el borde del formulario y establezca la propiedad Caption para colocar texto en la barra de ttulo. En el cdigo puede usar los mtodos Hide y Show para hacer que los formularios sean invisibles o visibles en tiempo de ejecucin. Nota Si establece BorderStyle a 0 se eliminar el borde. Si desea que el formulario tenga borde sin barra de ttulo, cuadro del men Control, botn Maximizar y botn Minimizar, elimine texto de la propiedad Caption y establezca a False las propiedades ControlBox, MaxButton y MinButton. Form es un tipo de datos Object. Puede declarar variables como de tipo Form antes de

establecerlas a una instancia de un tipo de formulario que se ha declarado en tiempo de diseo. Del mismo modo, puede pasar un argumento a un procedimiento como de tipo Form. Los formularios pueden actuar como origen en una conversacin DDE, con un control Label, PictureBox o TextBox proporcionando los datos. Puede tener acceso a la coleccin de controles de un Form mediante la coleccin Controls. Por ejemplo, para ocultar todos los controles de un Form puede usar cdigo similar al siguiente: For Each Control in Form1.Controls Control.Visible = False Next Control

GENERACION Y PROPAGACION DE EVENTOS


Tomemos el applet, EventosPro.java, que aparece en la figura siguiente. Consta de dos instancias de la clase Button, embebidas dentro de una instancia de la clase Panel. Esta instancia est a su vez embebida dentro de otra instancia de la clase Panel. Esta ltima instancia de la clase Panel est situada junto a una instancia de la clase TextArea, y ambas estn embebidas dentro de una instancia de la clase Applet. La figura siguiente presenta los elementos que conforman este applet en forma de rbol, con el TextArea y Button como hojas y la instancia de Applet como raiz. Cuando un usuario interacta con el applet, el sistema Java crea una instancia de la clase Event y rellena sus datos miembro con la informacin necesaria para describir la accin. Es en ese momento cuando el sistema Java permite al applet controlar el evento. Este control comienza por el Componente que recibe inicialmente el evento (por ejemplo, el botn que ha sido pulsado) y se desplaza hacia arriba en el rbol de Componentes, componente a componente, hasta que alcanza al Contenedor de la raz del rbol. Durante este camino, cada Componente tiene oportunidad de ignorar el evento o reaccionar ante l en una (o ms) de las forma siguientes:
y y y

Modificar los datos miembros de la instancia de Event Entrar en accin y realizar clculos basados en la informacin contenida en el evento Indicar al sistema Java que el evento no debera propagarse ms arriba en el rbol

El sistema Java pasa informacin del evento a un Componente a travs del mtodo handleEvent() del Componente. Todos los mtodos handleEvent() deben ser de la forma:
public boolean handleEvent( Event evt )

Un controlador de eventos solamente necesita una informacin: una referencia a la instancia de la clase Event que contiene la informacin del evento que se ha producido. El valor devuelto por el mtodo handleEvent() es importante. Indica al sistema Java si el evento ha sido o no completamente controlado por el controlador. Un valor true indica que el evento ha sido controlado y que su propagacin debe detenerse. Un valor false indica que el evento ha sido ignorado, o que no ha sido controlado en su totalidad y debe continuar su propagacin hacia arriba en el rbol de Componentes. Veamos la descripcin de una accin con el applet de la figura anterior. El usuario pulsa el botn "Uno". El sistema run-time del lenguaje Java capturar la informacin sobre el evento (el nmero de clicks, la localizacin del click, la hora en que se ha producido la pulsacin y el Componente que ha recibido el click) y empaqueta todos esos datos en una instancia de la clase Event. El sistema Java comienza entonces por el Componente que ha sido pulsado (en este caso, el botn "Uno") y, a travs de una llamada al mtodo handleEvent() del Componente, ofrece a ste la posibilidad de reaccionar ante el evento. Si el Componente no controla el evento, o no lo hace completamente (indicado por un valor de retorno false), el sistema Java presentar la instancia de Event al siguiente Componente por encima en el rbol (en este caso, una instancia de la clase Panel). El sistema Java contina de este mismo modo hasta que el evento es controlado en su totalidad o ya no hay Componentes a los que informar. En la figura siguiente mostramos el camino recorrido por el evento en su intento de que algn Componente lo controle. Cada Componente del applet aade una lnea al objeto TextArea indicando que ha recibido un evento. Luego permite que el evento se propague al siguiente Componente. El cdigo del controlador de eventos usado en el ejemplo es el que muestran las siguientes lneas:
public boolean handleEvent( Event evt) { if( evt.id == Event.ACTION_EVENT ) ta.appendText( "Panel " + str + " recibe action...\n" ); else if( evt.id == Event.MOUSE_DOWN ) ta.appendText( "Panel " + str + " recibe mouse_down...\n" ); return super.handleEvent( evt ); }

METODOS DE CONTROL DE EVENTOS


El mtodo handleEvent() es un lugar para que el programador pueda insertar cdigo para controlar los eventos. A veces, sin embargo, un Componente solamente estar interesado en eventos de un cierto tipo (por ejemplo, eventos del ratn). En estos casos, el programador puede colocar el cdigo en un mtodo de ayuda, en lugar de colocarlo en el mtodo handleEvent(). No hay mtodos de ayuda para ciertos tipos de eventos, aqu est la lista de los que estn disponibles para los programadores:
action( Event evt,Object obj ) gotFocus( Event evt,Object obj ) lostFocus( Event evt,Object obj ) mouseEnter( Event evt,int x,int y ) mouseExit( Event evt,int x,int y ) mouseMove( Event evt,int x,int y ) mouseUp( Event evt,int x,int y ) mouseDown( Event evt,int x,int y ) mouseDrag( Event evt,int x,int y ) keyDown( Event evt,int key ) keyUp( Event evt,int key )

false indicar que el mtodo de ayuda no maneja el evento. La implementacin del mtodo handleEvent() proporcionada por la clase Component invoca a cada mtodo de ayuda. Por esta razn, es importante que las implementaciones redefinidas del mtodo handleEvent() en clases derivadas, siempre finalicen con la sentencia:
return( super.handleEvent( evt ) );

El siguiente trozo de cdigo ilustra esta regla.


public boolean handleEvent( Event evt ) { if( evt.target instanceof MiBoton ) { // Hace algo... return true; } return( super.handleEvent( evt ) ); }

No seguir esta regla tan simple har que no se invoquen adecuadamente los mtodos de ayuda. El applet EventosRaton.java, que controla los eventos de ratn exclusivamente a travs de cdigo insertado en sus mtodos de ayuda; va dibujando una lnea (rubber band) entre el ltimo punto donde se ha producido un click de ratn y la posicin actual del cursor.

Creacin de los eventos Ya pasamos lo mas difcil que era la declaracin de propiedades, ahora viene lo mas fcil, si ustedes se meten en el cdigo del formulario e intentan ver los eventos del TEXTBOX_ESPECIAL, vern que no ven todos lo eventos, sino unos pocos; ahora nuestra misin es hacer que se vean los eventos que nosotros usamos en un TEXBOX. Para eso inserten las siguientes lneas de cdigo en la declaracin de variables (DE NUESTRO CONTROL): Public Event Changed() Public Event MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Public Event MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Public Event Keypress(KeyAscii As Integer) Public Event KeyDown(KeyCode As Integer, Shift As Integer) Public Event KeyUP(KeyCode As Integer, Shift As Integer) Public Event Click() Public Event DbClick() NOTA: ustedes pueden aadir mas eventos, yo solamente aad los mas usados. Ahora, lo que acabamos de hacer es declarar los eventos, pero como lo invocamos!, bueno lo que hacemos es que en cada evento del TEXBOX que tenemos un nuestro control, aadimos lo siguiente: RaiseEvent Nombre_del_Evento Por ejemplo en el Evento KeyPress de Text1 (Este TextBox es el que esta adentro de nuestro control) aadimos lo siguiente: Private Sub Text1_KeyPress(KeyAscii As Integer) RaiseEvent Keypress(KeyAscii) End Sub En keyup:

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer) RaiseEvent KeyUP(KeyCode, Shift) End Sub En MouseMove: Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) RaiseEvent MouseMove(Button, Shift, X, Y) End Sub Y as sucesivamente...... (Hganlo en todos los eventos que declare arriba) Con esto nuestro control tiene algunos de los eventos del TEXTBOX original y su misma funcionalidad. NOTA: todos los eventos que invocan con RaiseEvent deben de estar declarados previamente. Vieron que era mas simple, ahora vayamos al formulario de nuestro proyecto, quitemos el control viejo e insertemos un nuevo control con las modificaciones hechas, ahora si se meten en el cdigo del formulario y seleccionan a nuestro control, y verifican los eventos notaran que aparecen los eventos que ya venan por defecto y los que nosotros aadimos, cada vez hacemos un control mas REAL. Bueno ya tenemos un control DECENTE, pero ustedes se estarn preguntando que carrizo estoy haciendo, este control es igualito al TEXTBOX normal, y peor por que tiene menos propiedades y eventos que el original, HAAAAA!!!! lo que sucede es que ahora es que vamos a codificar lo bueno.

Vous aimerez peut-être aussi