martes, 31 de enero de 2012

Eventos - Tutorial 4

Hola mis amigos, como para no perder ritmo voy cumplir a medias, lo de RoutedEvent lo estoy armando pero voy lento para que sea fácil ya que son muchos conceptos y antes me interesaría explicar otras cositas como por ejemplo, estos dos delegados que seguro les van a llamar mucho la atención:

•    Action(Of T)
•    Func(Of TResult)

Estos 2 tipos de delegados tiene muchas variantes yo voy a explicar solamente estos, pero creo que va a ser suficiente como para que los otros los entiendan sin ninguna dificultad, la dirección de la ayuda de los amigos de Microsoft es: http://msdn.microsoft.com/es-es/library/018hxwa8.aspx


Ahí vamos, Action(Of T) es un delegado al que le podemos pasar un parámetro, esto nos da la posibilidad de evitar tener que hacer esto public delegate void Mesajoto(string message); entonces yo con Action(Of T) puedo tener infinitas posibilidades, que les quiero decir?? que si quiero pasar un strin, int o una clase lo hago directamente con Action( mi tipo de datos) y me evito tener que declarar un delegado especifico, pero también esta como antes habíamos dicho la posibilidad de hacer un public delegate void DelegadoGenerico(object obj); pero lo que nos da Action y les voy a poner un ejemplo extremo que es Action(Of T1, T2, T3, T4, T5, T6, T7, T8, T9) donde el delegado en este caso no devuelve ningún valor y acepta 9 parámetros del tipo que más les guste.


Es una alternativa interesante pero el detalle a tener en cuenta es que este tipo de delegado nunca devuelve ningún valor, para esto tenemos a Func(Of TResult), es muy similar al anterior con la diferencia de que en este caso, el método que encapsula no tiene parámetros y devuelve un valor, un ejemplo seria public delegate bool EsVerdadero(); acá se ve el caso de un delegado que devuelve un valor booleano true/false. También tiene muchas variantes pero eso se los voy a dejar a ustedes, se que si entendieron esto no les va a costar nada ver los otros ejemplos.

Espero haya quedado claro vuelvo a retomar ya que arranque saliéndome de la pista con los 2 conceptos esos pero sé que les va a servir, es mejor que sobre y no que falte, dejando de lado los refranes vamos a seguir por el camino y vamos a conocer bien a EventHandler, vamos a pensar en como si fuera una minita que se parte de buena, así nos interesamos muchísimo en ella jajaja.


Bueno EventHandler es un delegado, que representa un método que controlará un evento que no tienen datos de evento.

Mas fácil hagan de cuenta que EventHandler es igual  a escribir

public delegate void EventHandler(Object sender, EventArgs e);


Si miran bien y se acuerdan del tutorial numero 3 corresponde a como estandarizábamos el diseño de los eventos, 2 parámetros,  si no se acurdan revisen el tutorial anterior.

Con esto lo que les quiero decir es que si necesitamos un evento donde no tengamos que pasar información declaramos un evento como el siguiente:

 public event EventHandler SimpleEventHandler;

La clase EventArgs que no contiene datos de evento, pero si necesitamos parar datos relacionados al evento, tenemos la posibilidad de usar EventHandler(Of TEventArgs), podríamos tener el siguiente ejemplo:

public event EventHandler<PersonaEventArgs> ListaPersonas;

public class PersonaEventArgs: EventArgs
    {
        //Código que en el próximo tutorial voy a poner.
    }

 

Lo que quiero mostrar es que si pasamos como parámetro una clase la misma tiene que heredar de EventArgs, porque es la clase base para las clases que contienen datos de eventos.

Bueno gente me despido, espero les sirva de algo ya que es una distracción y un gusto como digo siempre compartir lo poco que se con ustedes, yo aprendo día a día muchísimo en los blogs y en los foros, y quiero hacer mi pequeño aporte con estos tutos, ahora si hasta la próxima un saludo, y en el siguiente tutorial voy a subir un ejemplo.

jueves, 19 de enero de 2012

Eventos - Tutorial 3

Hola mis amigos antes de seguir con este hermoso tema voy a contarles que hice un código bien simple, en el que para cargar un vehículo necesitan al dueño del mismo y lo seleccionan de una grilla al hacer clic en el botón seleccionar se pasa el dato a la pantalla de vehículo, es ejemplo es básico pero da una idea del uso que podemos darles. Descargar Código de Ejemplo.

Descarguen prueben, modifiquen, jueguen con el código así se aprende y cualquier duda me consultan, no hay ningún problema.

Vamos a tocar el tema de cómo Estandarizar un diseño de eventos, digamos que como vimos C# acepta cualquier diseño de delegado, pero los muchachos de .NET nos recomiendan el diseño de delegados con 2 argumentos. Si miran cualquier ejemplo de evento de C#,  hay 2 argumentos un ejemplo es el siguiente controlador más fácil método donde ponemos el código cuando se dispara un evento el caso más típico es el clic de un botón:

  1. El evento es el “Clic”
  2. Hay un disparador, que salta cuando hacemos… si clic sobre el botón.
  3. Tenemos un método donde ponemos lo que va a pasar cuando se haga clic, un ejemplo  podría ser el código del botón “seleccionar” del ejemplo.


















En este caso se ve lo que les digo object, es el objeto que desencadena el evento y RoutedEventArgs es el objeto relacionado con el evento. En este caso como estoy usando WPF en vez de WinForm el objeto es RouterEventArgs, sino seria un objeto del tipo EventArgs. Vamos a conversar sobre WPF mas adelante.
Bueno si les pregunto cuales son los 2 elementos, ustedes con carita de feliz cumpleaños responden:


Bueno si les pregunto cuales son los 2 elementos, ustedes con carita de feliz cumpleaños responden:

•    Una referencia al objeto que desencadeno el evento.
•    Un objeto que contiene datos relacionados con el evento.


Bueno el punto 2 tiene el siguiente punto a considerar, pero antes aclaro que al usar WPF ese objeto es RouterEventArgs, cuyo espacio de nombres es System.Windows, en el caso de WinForm es como ya dijimos EventArgs y su espacio de nombre es System.


Lo que es definitiva quiero decir es que tiene que heredar de alguna de esas clases dependiendo en la tecnología que estén para el caso de WinForm es únicamente EventArgs, para WPF cualquiera de los 2 casos, dejemos acá porque me estoy metiendo en terreno minado el próximo tutorial vamos a tocar este tema.


En definitiva la idea seria algo así:








Creo que hasta acá vamos 10 puntos voy a armar el mismo ejemplo con los delegados de esta manera, y para la próxima clase vamos a ver la diferencia que tiene WPF con los “RouterEventArgs”, como pasar parámetros personalizados, así que tenemos para seguir aprendiendo, un abrazo y cuando tenga un tiempo cargo el siguiente tuto.

miércoles, 11 de enero de 2012

Eventos - Tutorial 2

Hola a todos, me tome unas vacaciones y para publicar este articulo prácticamente tuve que volver a entender yo como era el tema de los eventos y delegados jajá, bueno en el primer tutorial hicimos una primera aproximación de cómo crear un evento, seguro se están preguntando como utilizo el evento, antes de responder a esa preguntita, vamos a poner más en claro lo que es un Delegado no les voy a mentir me leí mas de un libro y para mi mala suerte también  la ayuda de Microsoft, es muy completa pero pesadísima de seguir en mi humilde opinión.

Ya estamos así que  vamos a empezar con el amigo Delegado:
Un Delegado es un tipo que define una firma de método. Lo que dice la frase es que si se crea una instancia de un delegado se lo puede asociar con cualquier método que tenga una firma compatible.

Si no te queda muy claro lo que es una “Firma”, no se hagan drama ahora lo vamos a ver con un ejemplo para que la cosa quede más clara:

Supongamos que tenemos un método como este:


public int Sumar(int x, int y)
{
   int resutado = x + y;

   return resultado;
}

Este método se lo puede asignar a una instancia de un delegado de tipo Calcular que es el que representa a la Firma. Para más claridad vamos a poner un ejemplo:

//Creamos la instancia del delegado
Calcular calculito = Sumar;
//Invoco al delegado
int resultadoSuma = calculito(2,5);

Entonces podemos decir que invocar a un delegado es como invocar a un método, si podeos decir que es más o menos así. Pero vamos a aclarar las líneas anteriores para que sea todo transparente, que términos estoy metiendo se ve el que fernet saca mi poeta interior jajaja.
La primera línea es una abreviatura de:

Calcular calculito = new Calcular(Sumar);


y calculito(2,5); es igual a poner Calculito.Invoke(2,5);

En definitiva creo o espero que con esto quede más o menos claro lo que es un delegado, hay muchísimas más cosas pero las iremos viendo más adelante.

Bueno con lo que sabemos hasta acá alcanza como para poder entender el siguiente ejemplito, pero antes aclaro que cuando termine con los tutoriales de Eventos y Delegados voy a poner un código de ejemplo para que sea todo más claro, ahora explico el ejemplo:

Tenemos una ventana llamada “CargarVehiculo” y otra “SeleccionarPersona”, lo que necesitamos para cargar un vehículo es seleccionar el dueño del vehículo, de mas esta decir que las personas ya están cargadas en la Base de Datos.

La mecánica es que en la pantalla CargarVehiculo vamos a tener un botón para seleccionar una persona, para hacer esto vamos lanzar un evento para capturar esa persona y del otro lado el disparador, sé que no suena muy fácil y yo ya a las 3 de la mañana no estoy tan ágil para explicar, sepan disculpar pero con el ejemplo todo va a quedar más claro.

Solución:
Bueno en la pantalla SeleccionarPersona definimos el evento, es decir todo lo que se explico en el tutorial 1.
En la pantalla CargarVehiculo vamos a lanzar el evento y poner el código.

Este código esta en CargarVehiculo:

WinBuscaPersona SeleccionarPersona = new WinBuscaPersona();
SeleccionarPersona.MiEntidadSeleccionada += new WinBuscaPersona.MiSeleccion(miEmpresaSeleccionada);
SeleccionarPersona.ShowDialog();

//Si miran bien este método coincide con el delegado del tutorial 1.
void miEmpresaSeleccionada(object Entidad)
{
   //Mi código
}


Este código esta en SeleccionarPersona (mas lo definido en el tutorial 1)

OnMiEntidadSeleccionada(personita);
Close();

Hasta acá llegue siguiéremos con más de Eventos y Delegados, en el tutorial 3 y les voy a poner el código de todo lo aprendido para que sigamos siendo amigos, un abrazo.

Access