RSS

Archivos Mensuales: febrero 2009

Enlazando el evento MenuItem.Click con Reflection

Las limitaciones a las que nos vemos sometidos habitualmente los desarrolladores de Compact Framework, sobre todo si trabajamos sobre código manejado, suelen resultar muchas veces frustrantes, frustantes en el sentido de que algo que podíamos hacer de una manera sencilla en cualquier aplicación de escritorio no funciona de igual modo en la plataforma móvil.

Una de esas cosas, que de paso utilizo para el ejemplo, es poder enlazar el evento Click de un elemento MenuItem del cual desconozco su método asociado (en este caso OnClick), desde una función en código.

Lo más sencillo sería, venga va, si tienes el código fuente pues no seas desastre y mira el método que tienes asociado al evento click del MenuItem y a correr… está claro que es lo más sencillo ¿no? Pero si estás desarrollando un control que requiere ejecutar lo que el desarrollador enlace al evento Click del MenuItem la cosa se complica. Resulta que el método OnClick del MenuItem en Compact Framework esta declarado internamente como "Protected Internal vitual" así que nos olvidamos de poder invocarlo… y tampoco podemos recuperar el EventHandle al que esta asociado el evento Click del MenuItem.

Código interno del metodo OnClick dentro del control MenuItem

protected internal virtual void OnClick(EventArgs e)
{
    if (this.Click != null)
    {
        this.Click(this, e);
    }
}

Pues utilizando un poquito de reflection, podemos asociar el evento a nuestro propio código utilizando tan solo unas líneas de código.

En el ejemplo estamos asociando que cuando se dispare nuestro metodo, al que hemos llamado quickMenuItem.click, se ejecute también el método OnClicK del MenuItem que pasemos por código y por consiguiente se dispare el EventHandle asociado al click del MenuItem

using System.Reflection;
(…)
//Creamos un EventHandler y lo instanciamos con la definición del evento Click del menuItem que deseemos
EventHandler click = (EventHandler)GetPrivateField(menuItemX, "Click");
quickMenuItem.Click += click;
(…)

//Recuperamos el campo privado a enlazar
private object GetCampoPrivado(object obj, string campo)
{

      //Prestar especial atención a los atributos
      FieldInfo fi = obj.GetType().GetField(campo, BindingFlags.NonPublic|BindingFlags.GetField|BindingFlags.Instance);
      return fi.GetValue(obj);
}

Esto es realmente sencillo, y nos muestra que muchas de las limitaciones con las que nos encontramos tienen una fácil solución.

Anuncios
 
Deja un comentario

Publicado por en 23 febrero, 2009 en Desarrollo, Trucos

 

Como utilizar la camara de la PDA desde un tasklet

[Dynamics Mobile discontinuado Ver más aquí]

En determinado tipo de aplicaciones es necesario realizar capturas desde la cámara de nuestro dispositivo, y si pudiésemos remitir de una forma automatizada dichas fotos a nuestro ERP, fotos de entrega de mercancía, de las piezas a cambiar en nuestra aplicación de mantenimiento.

Con Dynamics Mobile esto es sencillo, en este artículo vamos a ver cómo podemos crear un Tasklet, integrar la cámara de nuestra PDA y manejarla desde el Tasklet.

Tasklet Camara

Puedes encontrar el código fuente con la solución completa y la guía para seguir este tutorial.

Como utilizar la camara de tu PDA en un Tasklet [ PDF 9 Páginas 424 KB (434.176 bytes)]

Solución de ejemplo [20,0 KB (20.480 bytes)]

 
Deja un comentario

Publicado por en 14 febrero, 2009 en Dynamics Mobile