Datapayasadas

Julio 28, 2008

Evitando el parpadeo molesto en los ListView

Archivado en: C# — Etiquetas:, — Matías @ 10:06 am

Buenas,

No se si habrán notado que, por lo general, al actualizar frecuentemente un ListView (al menos en .Net Framework 2.0) se puede apreciar cierto parpadeo que puede llegar a resulta bastante molesto.
La situación rara vez se soluciona utilizando los métodos BeginUpdate() y EndUpdate(), incluso pueden empeorarla.

Investigando un poquito encontré en donde radica el problema: parece ser que la sobrecarga del método Update() del control está mal implementada, entonces actúa como si fuera un Refresh().

Un Update() debería hacer que el control redibuje solo la región invalidada, mientras que un Refresh() debería redibujar toda el área asignada al control, es decir, el control en su totalidad.

Por decirlo de algún modo, si queremos cambiar el color de fondo de un item en particular (propiedad BackColor), solo ese item debería ser redibujado. Desafortunadamente, esto no sucede … o mejor dicho, sucede pero no como debería; el ListView intenta redibujar toda la superficie a pesar de que solo hemos modificado un item.

Afortunadamente existe una forma de evitar esto, solo debemos hacer lo siguiente:

public class ListViewM : System.Windows.Forms.ListView
{
    public ListViewM()
    {
        // Activamos el DoubleBuffering
        // http://en.wikipedia.org/wiki/Double_buffering
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

        // Activamos el evento OnNotifyMessage, asi tenemos la oportunidad
        // de filtrar los mensajes de Windows antes de que lleguen al WndProc
        // del formulario
        this.SetStyle(ControlStyles.EnableNotifyMessage, true);
    }

    protected override void OnNotifyMessage(Message m)
    {
        // Filtramos el mensaje WM_ERASEBKGND

        if (m.Msg != 0x14)
        {
            base.OnNotifyMessage(m);
        }
    }
}

Espero esta información les sea útil.

Hasta la próxima.

Fuentes:

http://geekswithblogs.net/cpound/archive/2006/02/27/70834.aspx

http://forums.msdn.microsoft.com/en-US/search/?q=ListView%20Flicker

Julio 23, 2008

JSON: ¿El XML libre de grasas?

Archivado en: C# — Etiquetas:, , — Matías @ 6:21 pm

Buenas,

Hace unos días comencé con un proyectito personal (que posteriormente voy a subir a este sitio) en el cual me encontré por primera vez con la necesidad de usar JSON. Como me sonaban las siglas, pero como no tenía la mas remota idea de que era, decidí recurrir a la Wikipedia en primer lugar, y luego googlear un ratito.
Lo que pude sacar en limpio es:

  • JSON es un acrónimo de JavaScript Object Notation. Es un subconjunto de la notación literal de objetos de Javascript, pero que no requiere el uso de Javascript.
  • Se utiliza como formato ligero para el intercambio de datos, esto es porque tiene una sintaxis más compacta que XML.
  • Suele ser utilizado conjuntamente con AJAX en sitios web (Google Maps usa una mezcla de AJAX con JSON y XML).
  • No existe información que pueda ser representada en XML, que no pueda ser representada en JSON. La inversa también se cumple.
  • JSON es independiente del lenguaje que utilicemos. Existen numerosas librerías para distintos lenguajes que nos simplifican la tarea de parseo y generación de datos con este formato: http://json.org/. La implementación para .Net (Framework 2.0) que he estado probando es la de James Newton-King y realmente esta muy bien lograda (y documentada!).

El título de éste artículo puede resultar es un tanto amarillo, o al menos exagerado en ciertas situaciones … es claro que si utilizamos tecnologías de compresión (como ser gzip) para enviar datos en formato XML o JSON al usuario, cualquier diferencia de tamaño se ve drásticamente reducida.

Sin embago, hay que reconocer, que JSON representa estructura de datos de una forma mucho más simple, especialmente porque fue diseñado para el intercambio de datos, y no como un lenguaje de marcado de propósito general (como XML).

Bien, ahora veamos un ejemplo sencillo de como serializar y deserializar una instancia de una clase sencilla en JSON.

Digamos que tenemos una clase Usuario, de la siguiente forma:

public class Usuario
{
    public string Nombre;
    public string Apellido;
    public int IdUsuario;
}

Vamos a crear una instancia de esa clase y la vamos a serializar utilizando JSON:

Usuario usu = new Usuario();
usu.Nombre = "Juan";
usu.Apellido = "Ceta";
usu.IdUsuario = 1;
string usuarioJSON = JavaScriptConvert.SerializeObject(usu);

Si inspeccionamos el contenido de usuarioJSON (que es simplemente un string) vamos a encontrar lo siguiente, que es nada menos que la instancia usu de la clase Usuario serializada.

{"Nombre":"Juan","Apellido":"Ceta","IdUsuario":1}

Para deserializarla simplemente hacemos:

Usuario usu2 = JavaScriptConvert.DeserializeObject<Usuario>(usuarioJSON);

El objeto usu2 ahora tendra el mismo contenido que tenía usu.

¿Simple, no?

Convengamos que esta no es la única forma de realizar el proceso, pero esto no es más que una introducción.

Si quieren profundizar más ya saben: Google es su amigo.

Julio 17, 2008

Aplicaciones en 3 capas

Archivado en: C# — Etiquetas:, , , — pabloide86 @ 6:11 pm

Buenassssamigos…son varias las consultas que me han llegado sobre como realizar una aplicación utilizando la famosa arquitectura de 3 capas. Voy a intentar ser lo mas breve posible para que se entienda el concepto y luego les dejo un ejemplo con codigo fuente para descargar!

La separación en capas es mas un concepto lógico que físico. Se trata de dividir a un programa, o mejor dicho agrupar componentes que cumplen funciones similares para lograr que el código sea mas compacto , para eliminar problemas a la hora de introducir una modificación, para tener mas flexibilidad a la hora de cambiar las partes que componen un sistema, etc.

(más…)

Julio 11, 2008

Realizando búsquedas simples sobre colecciones

Archivado en: C# — Etiquetas:, , — Matías @ 11:18 pm

Buenas,

Hoy voy a contarles un poquito como realizar búsquedas sencillas sobre colecciones genéricas en C#.

Imaginemos que tenemos una clase con la siguiente estructura:

public class Usuario
{
    public string Nombre;
    public string Apellido;
    public int IdUsuario;
}

Ahora, podríamos tener una lista con varias instancias de esa clase, llamemosla usuarios:

List<Usuario> usuarios = new List<Usuario>();

Hasta acá nada loco … entonces, si quisiéramos buscar alguna instancia en particular sobre esa lista, como por ejemplo, el usuario cuyo nombre es Matías podríamos hacer algo así:

Usuario usuario = usuarios.Find(delegate(Usuario u) { return u.Nombre == "Matías"; });

Sencillo, ¿no?

El método Find nos devolvería la primera instancia de entre todos los elementos de la colección que cumpla la condición. ¿Cuál es la condición?: la que le pasamos en el predicado. En este último estamos especificando que recorra la colección de objetos de la clase Usuario, y que referencie como “u” a la instancia actual, es decir, donde se encuentra parado en ese momento.
Luego se verifica que la variable Nombre sea equivalente a Matías, esto devolverá un true o false, y finalmente, si la condición se cumple, entonces finaliza el método devolviendo la instancia actual. Si se recorrió toda la colección sin haber cumplido la condición, entonces se devolverá null.

Bien, ahora supongamos que no solo nos interesa obtener la primer ocurrencia que cumple la condición, sino todas aquellas que lo hagan. Ejemplo: queremos encontrar a todos los usuarios de apellido Perez.

Para ello tenemos el método FindAll, funciona básicamente igual que el anterior, pero en vez de devolver una simple instancia, devuelve una colección:

List<Usuario> sublistaUsuarios = usuarios.FindAll(delegate(Usuario u) { return u.Apellido == "Perez"; });

Otro ejemplo: deseamos la lista de todos los usuarios cuyo Id sea menor de 100.

List<Usuario> sublistaUsuarios = usuarios.FindAll(delegate(Usuario u) { return u.IdUsuario < 100; });

Como verán es una forma sencilla y elegante para realizar búsquedas sobre colecciones en C#. Si desean más información sobre estos métodos pueden ir a la página del Microsoft Development Network, mas precisamente en los siguientes enlaces: para el Find y para el FindAll.

Bueno, esto fue “Realizando búsquedas simples sobre colecciones” para Nintendo 64, y espero que le haya gustado. Chau.
LOL

– M

Hablemos de Licencias

Archivado en: Software — Etiquetas:, , — pabloide86 @ 4:43 pm

Buenas que tal?

Hoy vamos a hablar de un tema tabú en nuestro pais que es el tema de la legalidad del software.

Digo tabú porque casi nadie habla del tema y hay mucha incertidumbre al respecto. También vivimos en una época donde el software esta a unos clicks de distancia y donde los mecanismos que protegen a los autores del software son cada dia mas inefectivos. Solo basta con buscar en San Google o Yahoo San para encontrar el numero de serie de prácticamente cualquier cosa.

Y en mi opinión personal creo que también es un problema cultural de nuestro país.

Cuando pensamos en el costo de una PC nueva solo pensamos en el costo del Hardware. Por eso a la hora de comparar una Dell o HP contra un cloncito armado por nuestro amigo siempre terminamos mostrando nuestro costado de roedor y terminamos prefiriendo el clon porque sale lo mismo pero tiene mejores componentes. Pero lo que ignoramos es que la diferencia está en que la Dell viene con licencia y la que nos arma nuestro buen amigo no.

Hace poco me toco formar parte de un acontecimiento único en mi vida: tener que instalar una licencia original de Windows XP! (adjunto fotos para que me crean!). Resulta que en el año 2000 aproximadamente se termino la tregua y los inspectores salieron a revisar que las empresas estuvieran en regla con las licencias. Resultó ser que las condiciones que ya todos sabemos hicieron que con la devaluación fuese imposible comprar una licencia en dolares! Hoy en dia no es tan asi y salieron de vuelta con la cacería. Las multas son elevadisimas (aproximadamente 2 veces y media de lo que cuesta una licencia) y para una empresa con muchas PCs puede resultar muy caro de afrontar.

De todo este proceso aprendi algunas cosas interesantes con respecto a las licencias de Windows.

Voy a hablar en general de las licencias para PyMES. Podemos dividir a las formas de adquirir licencias en dos grandes ramas:

  • OEM: son las que podemos adquirir cuando compramos una PC nueva.
  • Genuine Kit (Kit de Legalización para los amigos): son las que podemos adquirir sueltas.

Desafortunadamente la licencia es instransferible o sea que muere con el equipo por lo que tendremos que tener en consideración si el hardware de la PC que queremos legalizar tiene una esperanza de vida suficiente para amortizar la licencia. En el caso que me toco había un par de K6-II de 500Mhz que directamente fueron descartados! Realmente no valia la pena el riesgo de poner una licencia y que el equipo dejara de funcionar al poco tiempo y la licencia quede inutilizable.

El otro aspecto importante es que las licencias OEM o GK son innominadas esto quiere decir que no estan registradas con un nombre. Son “al portador”.

Por ultimo debo decir que para el caso de los kits de legalización es un requisito conservar la factura de compra! (sin esto la licencia no tiene validez).

Con respecto a Microsoft Office tambien vienen 2 tipos de licencia, una innominada y otra nominada. En caso de que Office no sea estrictamente necesario siempre podemos contar con el no tan querido OpenOffice que si bien no es 100% compatible en algunas cositas siempre safa y viene bien.

Para terminar agrego los últimos comentarios.

Existen esquemas de microsoft por contrato para empresas mas grandes donde se obtienen mejores descuentos y formas de pago.

Y acá dejo el link de Microsoft acerca del licenciamiento:

http://www.microsoft.com/conosur/technet/licenciamiento/

Y tambien cabe destacar que para las alternativas libres deberemos fijarnos en cada caso si la licencia es para uso personal o comercial.

Y a vos pebete que laburas en una empresa y si estan en forma irregular con el software siempre es mejor prevenir. Los agentes estan merodeando empresas grandes y chicas, tengas 1 o 100 PCs. Mi recomendación es pedir asesoramiento profesional antes de encarar una cruzada de estas características!

Y para vos que tenes 2 compus en tu casa compartiendo el ADSL de 640k con el alfajor Huahuey, desde lo que yo se no hay mucho de que preocuparse (por ahora) ya que las inspecciones son para empresas nomas.

Saludos y mucha suerte!

Julio 8, 2008

La realidad del desarrollo de software

Archivado en: Boludeces, Humor — Etiquetas:, — datapayasadas @ 6:38 pm

Julio 2, 2008

Patrones de diseño de UI

Archivado en: Patrones de Diseño — Etiquetas:, — datapayasadas @ 10:06 am

Visto y considerando que por lo general, los programadores somos un queso en cuanto al diseño y la usabilidad (bueno, no se si es general … pero yo si soy un desastre en esos aspectos), les dejo un par de enlaces que los pueden llegar a orientar un poco:

User Interface Design Patterns

Designing Interfaces

Diseño de Interfaces VIsuales

Algunos Webcasts de Microsoft ya metiendonos con las herramientas Expression:

Diseño de Interfaces Gráficas con Expression Interactive Designer

Mejorando el Diseño de Interfaces Web con Expression Web

Si ustedes encontraron algun otro interesante, no duden en comentarlo …

Aprovecho para introducir muy rápido el tema. Una caracteristica del Windows Presentation Foundation es que provee una forma de separar realmente lo que es el diseño de la interfaz del código. Tal como sucede en ASP.Net con el HTML y el Code-Behind ahora tenemos el XAML que nos va a permitir crear interfaces gráficas muy rapidamente. Lo que busca el XAML es que haya una forma estandar de definir interfaces de usuario para poder utilizar programas especificos para ello como el Expression Blend y que la experiencia de usuario sea lo mejor posible, que realmente te den ganas de usar la aplicación.

Salud!

Blog de WordPress.com.