Dentro del.net los eventos se utilizan para notificar a nuestros objetos que se ha producido algún tipo de hecho al que nos hemos suscrito.



Documentos relacionados
MANUAL DE AYUDA MODULO TALLAS Y COLORES

Pruebas de unidad con JUnit

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

El control de la tesorería consiste en gestionar desde la aplicación los cobros y pagos generados a partir de las facturas de venta y de compra.

Delegados y eventos en Visual Basic 2005

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

Uso de Visual C++ Pre-Practica No. 3

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

Introducción a la programación orientada a objetos

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

Ejercicios - Persistencia en Android: ficheros y SQLite

efactura Online La fibra no tiene competencia

Manual para la utilización de PrestaShop

INDICE. 1. Introducción El panel Entities view El panel grafico Barra de botones Botones de Behavior...

Las propiedades de la clase en java es el equivalente a las variables globales en lenguajes estructurados como el C.

Manual de uso. Manual de uso - citanet 1

Aplicaciones Windows con Microsoft Visual Studio

Modulo 1 El lenguaje Java

5.2.- Configuración de un Servidor DHCP en Windows 2003 Server

Tutorial Enterprise Architect 7.5 Versión en español

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

REDES DE ÁREA LOCAL. APLICACIONES Y SERVICIOS EN WINDOWS

Instalar y configurar W3 Total Cache

Creación de materiales didácticos Aplicaciones para dispositivos móviles Lección 4

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

MANUAL DE CS-ALMACENES

CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO

ESTÁNDAR DESEMPEÑO BÁSICO Recopila información, la organiza y la procesa de forma adecuada, utilizando herramientas tecnológicas.

Procesador de texto Apunte N 7

Guía de instalación y uso. RestMaster Pocket

OPERACIONES EN MOSTRADOR

ENTORNO DE DESARROLLO MICROSOFT.NET 2010

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación

Novedades PhotoGestion 5

Gestión de Retales WhitePaper Noviembre de 2009

Uso de varias pantallas y pantalla Splash

Este es un ejemplo muy sencillo, un esquema de empleados que trabajan en proyectos, en una relación muchos a muchos.

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

UAM MANUAL DE EMPRESA. Universidad Autónoma de Madrid

Un pequeñísimo tutorial para explicar cómo darse de alta al MEJOR SISTEMA de compartición, backup... en la web.

MANUAL DE AYUDA MÓDULO PDA ALMACEN E INVENTARIO

Manual de uso de la Web

C.F.G.S. DESARROLLO DE APLICACIONES INFORMÁTICAS. MÓDULO: Diseño y realización de servicios de presentación en entornos gráficos.

Facturación Automática de Ventas WhitePaper Noviembre de 2006

Instalación de ActivePerl en MS Windows

Adaptación al NPGC. Introducción. NPGC.doc. Qué cambios hay en el NPGC? Telf.: Fax.:

Combinar correspondencia (I)

Gestión de Subtotales en Documentos de Venta WhitePaper Febrero de 2007

GESTINLIB GESTIÓN PARA LIBRERÍAS, PAPELERÍAS Y KIOSCOS DESCRIPCIÓN DEL MÓDULO DE KIOSCOS

8. Sentencia return y métodos

Cómo creo las bandejas del Registro de Entrada /Salida y de Gestión de Expedientes?

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.

Practica A. Crear y Administrar Grupos

L U I S P A T I Ñ O IN FOR M Á T I C A SIS T E M A S AVA N Z A DOS

Para crear una actividad, pulsamos sobre la pestaña actividades

Esta extensión está obsoleta a partir de PHP 5.5.0, y será eliminada en el futuro

Guía nuevo panel de clientes Hostalia

MÓDULO 3 HERRAMIENTAS EN LA NUBE: ANFIX

Enviar Felicitación Navideña por con Off. 2007

AGREGAR UN EQUIPO A UNA RED Y COMPARTIR ARCHIVOS CON WINDOWS 7

Manual del programador

Un poco de culturilla...1 Crear un servicio Web...1 Usar servicios web...6

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Software Criptográfico FNMT-RCM

Programación Orientada a Objetos en C#.NET CAPÍTULO 8 E V E N T O S. Ing. Bruno López Takeyas, M.C.

MIGRACIÓN NEXUS 8 A A3ERP 9

Copia de Seguridad en windows

MANUAL PARA GESTIÓN DE INCIDENCIAS INFORMÁTICAS

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

ÍTEMS DEL MENÚ CREACIÓN Y GESTIÓN (Última revisión: lunes, 9 de marzo de 2009)

CONFIGURACION AVANZADA DE MOZILLA THUNDERBIRD

Copias de seguridad con SQL Server 2005 WhitePaper Febrero de 2008

Para crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas.

Curso de Java POO: Programación orientada a objetos

Año: 2008 Página 1 de 18

U.E JUAN DE VELASCO CREAR DATOS EN SQL

PLANTILLAS DE DOCUMENTOS EN WORD 2007

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Modelo de Objetos Distribuidos

FOCO- LIQUIDACIÓN: DUDAS MÁS FRECUENTES

Ejercicios - Persistencia en Android: proveedores de contenidos y SharedPreferences

MANUAL APLICACIÓN. SOFTWARE GESTIÓN DE CLÍNICAS DENTALES

MANUAL DE AYUDA. SAT Móvil (Movilidad del Servicio Técnico)

Resumen. Funcionamiento. Advertencia

TUTORIAL APLICACIONES EVOLUTION CON ACTIVEX EVOLINK

INSTALACIÓN DE SIESTTA 2.0 EN UN HOSTING (Ejemplo para Guebs.com)

Quitar de un Directorio Activo Un Servidor que es el Maestro de Operaciones En Windows 2000 Server y Windows Server 2003

TEMA 2 WINDOWS XP Lección 4 BLOC DE NOTAS

CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

Hay varios tipos de cuentas, POP3, IMAP y SMTP, aquí hablaremos de las POP3 por ser las más usadas.

15 CORREO WEB CORREO WEB

Versión Página 2 de 29

GUÍA RED SOCIAL LINKEDIN

PS.Vending Almacén Pocket PC

GUÍA RÁPIDA DE TRABAJOS CON ARCHIVOS.

Transcripción:

Eventos ala.net Recientemente ha surgido en los grupos de C# una duda sobre si los eventos que usa el.net son del mismo tipo que los que nosotros podemos crear y usar. La respuesta obvia y evidente es que sí, son exactamente lo mismo y funcionan de la misma forma. Aprovechando que el otro día encontré algo sobre esto en el libro de C++/CLI in Action de Nishtant Sivakumar voy a parafrasear el contenido aquí con bastante adiciones propias. Básicamente un evento es un manejador que contiene un delegado y que se suele utilizar para que algún objeto notifique a otro de que se producido un hecho. Es una visión ampliada de la función callback típica de Win32. Dentro del.net los eventos se utilizan para notificar a nuestros objetos que se ha producido algún tipo de hecho al que nos hemos suscrito. Imaginemos que queremos que el.net nos notifique cada vez que el usuario pulse una tecla en un campo de edición. La solución políticamente oficial es la de crear un método de nuestra ficha y asociar dicho método al evento de la siguiente manera: private void textbox1_keypress(object sender, KeyPressEventArgs e) El bloque de código de arriba representa el método que se invocará cuando se produzca el evento de la pulsación de la tecla. Es un método normal y corriente perteneciente a una ficha pero que presenta una firma concreta: recibe un parámetro de tipo Object y otro que es un objeto de una clase llamada KeyPressEventArgs. Pero el editor del Visual Studio ha hecho más trabajo por nosotros: this.textbox1.keypress += new System.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress); Dentro del método InitializeComponent() ha añadido la línea de arriba. Lo que está haciendo es asociar nuestro método con el evento KeyPress del objeto que representa nuestra caja de edición. KeyPress es un evento, que se asocia a un delegado del tipo KeyPressEventHandler, que realmente es nuestro método, es decir, la parte new lo que hace es añadir nuestro método a la lista de eventos KeyPress de la instancia del componente TextBox. Personalmente pienso que la notación es bastante desafortunada, ya que realmente estamos llamando a una serie de métodos ocultos que el compilador sustituye por nuestro código. Para decirlo fácil: KeyPress es una bolsa que contiene una lista de delegados que se llamarán en el mismo orden en que se introdujeron, y nosotros estamos añadiendo a esa bolsa nuestro propio delegado para que se llame cuando sea necesario. Luego, internamente, y a nivel del sistema operativo y de Win32, dicho objeto comparte entre todos los objetos del mismo tipo existentes en la aplicación, una función llamada función del bucle de mensajes que Windows ejecuta cada vez que se produce algo en un objeto de ese tipo. Dicha

función recibe lo que se llama mensajes de Windows, que no es otra cosa que una serie de variables del tipo unsigned long y que contienen datos sobre la situación producida. Esta función ha de atender a, por ejemplo, al mensajes WM_CHAR, que es el mensaje que Windows envía a dicha función cuando el usuario ha pulsado una tecla. La atención a dicho mensaje consiste en averiguar qué objeto de todos los existentes es el que ha recibido la pulsación y en ejecutar o lanzar el evento correspondiente, en nuestro caso y para.net, invocar la lista de delegados almacenada en el KeyPress de nuestro TextBox. NOTA: Al comenzar a explicar esto he dicho la solución políticamente oficial con toda intención, ya que de hecho no estamos obligados a utilizar los eventos de esta forma. Podemos disponer de eventos para todo lo que queramos, ya sea para componentes visuales o no. Ahora el ejemplo del libro (en C#) Una vez que hemos visto cómo el.net trabaja con los eventos que representan mensajes de Windows, vamos a parafrasear lo que viene en el libro citado, pasándolo de C++/CLI a C#. En primer lugar creamos la clase que va a servir de parámetro al evento al estilo.net: public class FindWordEventArgs: EventArgs private string m_word; private int m_index; public string Word get return m_word; set m_word = value; public int Index get return m_index; set m_index = value; public FindWordEventArgs(string word,int index) Word=word; Index=index; Observamos que nuestra clase hereda de EventArgs, que es la clase base para el paso de argumentos a los eventos del.net. En la documentación se puede ver una rica y compleja jerarquía de clases para representar (y encapsular) la mayoría de los mensajes de Windows, introduciendo en dicha clase los elementos necesarios para que podamos reaccionar a dicho mensaje. Después definimos la firma de nuestro delegado: public delegate void FindWordHandler(FindWordEventArgs args); Y ahora la propia clase que contiene el evento: public class WordFinder private string str; public WordFinder(string s) str=s;

public void Find(string word) int index = 0; foreach(string w in str.split(' ')) if (word.compareto(w) == 0) OnFindWord(new FindWordEventArgs(w, index)); index++; public event FindWordHandler OnFindWord; Lo interesante está en el método Find. Observamos que cuando encontramos una coincidencia, realizamos la llamada al evento OnFindWord, al que le pasamos una nueva instancia de la clase que encapsula los datos del mensaje. En este caso, FindWordEventArgs podría representar al KeyPressEventArgs del mensaje de Windows, ya que contiene lo que nos interesa: la información que se nos pasa en el evento para que nuestro método pueda reaccionar. La última línea es mágica: public event FindWordHandler OnFindWord; Esta línea lleva dentro de sí una buena cantidad de código oculto; de hecho se encarga de realizar las siguientes acciones: Añadir un nuevo delegado a la lista. Quitar un delegado existente de la lista. Invocar todos los delegados de la lista, si los hubiera. Crear y borrar todo el espacio necesario para las operaciones de arriba. Como siempre, dentro del.net hay mucha magia que a los programadores de C++ no nos gusta, pero que a veces nos resulta útil. Ahora vamos a crear una clase que va a utilizar una instancia de WordFinder (igual que antes usábamos una de un TextBox) y que va a instalar un delegado en la lista de eventos del evento OnFindWord: public class ProgrammingLanguages public void WordFoundHandler(FindWordEventArgs args) Console.WriteLine("Word Found: 0 in position 1", args.word,args.index); public void SearchWord(string word) WordFinder wf = new WordFinder("C++ VB Java Cobol C++ Java Fortran C++ Lisp"); wf.onfindword += new FindWordHandler(WordFoundHandler); wf.find(word);

Las cosas están claras dentro del método SearchWord: Creamos un objeto del tipo WordFinder (como el IDE del Visual Studio nos crea una instancia al TextBox dentro de InitializeComponents), añadimos nuestro método que será invocado como un evento por la clase y que nos notificará que se ha encontrado una palabra, y finalmente buscamos la palabra C++. Cada vez que aparezca dicha palabra en la cadena, se disparará el evento. Y es así de fácil. Código oculto (otra vuelta de tuerca) Pero vamos a avanzar un poco más. Vamos a crear un evento que sólo permita almacenar un delegado, y de paso vamos a mostrar algo de ese código oculto que el compilador de C# añade para nosotros. Lo primero a añadir es la línea private FindWordHandler _FindWordHandler; que nos va a servir para almacenar el delegado que invocará el evento (una de las cosas que si no decimos nada, hace el propio C#). Luego, cambiamos la línea public event FindWordHandler OnFindWord; por public event FindWordHandler OnFindWord add if(_findwordhandler==null) _FindWordHandler=value; remove _FindWordHandler = null; De esta forma estamos definiendo (y sobrescribiendo) el comportamiento por defecto. Si nos damos cuenta la sintaxis es similar a la de las propiedades, pero con otras palabras reservadas. Con add definimos qué ocurre cuando se añade un delegado al evento: en nuestro caso, si el delegado de almacén está vacío, asignamos el evento y no hacemos nada si ya está asignado, pero podríamos lanzar una excepción o hacer cualquier otra cosa. Con remove eliminamos el delegado, pero seguimos teniendo libertad para hacer lo que nos de la gana ahí dentro. El código por defecto, según la documentación, debería ser: public event FindWordHandler OnFindWord

add _FindWordHandler+=value; remove _FindWordHandler -= value; Que lo que hace es añadir y eliminar el delegado respectivamente. Y ahora, sin manos (es decir, en C++/CLI) Voy ahora a repasar de forma rápida el ejemplo del libro, centrándome sólo en un par de detalles. Primero el código completo: #include "stdafx.h" using namespace System; ref class FindWordEventArgs:EventArgs public: property String ^Word; property int Index; FindWordEventArgs(String ^word,int index) Word=word; Index=index; ; delegate void FindWordHandler(FindWordEventArgs ^); ref class WordFinder String ^str; FindWordHandler ^_FindWordHandler; public: WordFinder(String ^s):str(s),_findwordhandler(nullptr) void Find(String ^word) int index=0; for each(string ^w in str->split(' ')) if(word->compareto(w)==0) OnFindWord(gcnew FindWordEventArgs(w,index)); index++; event FindWordHandler ^OnFindWord void add(findwordhandler ^handler) if(_findwordhandler==nullptr) _FindWordHandler=handler; void remove(findwordhandler ^) _FindWordHandler=nullptr; void raise(findwordeventargs ^args)

; if(_findwordhandler) _FindWordHandler(args); ref class ProgrammingLanguages void WordFoundHandler(FindWordEventArgs ^args) Console::WriteLine("Word Found: 0 in position 1", args->word,args->index); public: void SearchWord(String ^word) WordFinder ^wf = gcnew WordFinder( "C++ VB Java Cobol C++ Java Fortran C++ Lisp"); wf->onfindword += gcnew FindWordHandler(this,&ProgrammingLanguages::WordFoundHandler); wf->find(word); ; int main(array<system::string ^> ^args) ProgrammingLanguages l; l.searchword("c++"); return 0; Aparte de las propiedades por defecto en la definición de la clase FindWordEventArgs, otra cosa interesante es que también podemos implementar el método raise del evento, pudiendo afinar mucho más nuestro evento. Y eso es todo.