viernes, 16 de julio de 2010

Como extender la descripcion de un combo mas alla de su ancho.

Un problema con el que se pueden haber encontrado cuando diseñan una pantalla para un dispositivo movil es que el espacio para agregar componentes nunca es suficiente.

En particular en los combo box la descripcion de los combos no se extiende mas alla del ancho del combo y corta las descripciones, por lo tanto si queremos que se vea todo el contenido que agregamos al combo este debe ser tan ancho como la descripcion mas larga que contiene.

Lo que se busca es tener un combo mas pequeño en pantalla que optimice el espacio y mejore el diseño del work panel en general y no perder por esto el contenido o parte del contenido del combo.

En la imgen se puede ver lo que intento describir, la imagen de la derecha en realidad es de un combo box web donde el funcionamiento es de la manera que queremos lograr que funcione en el generador mobile.




La buena noticia es que hay una forma de cambiar el ancho de la descripcion sin necesidad de agrandar el combo. La forma mas sencilla de lograr esto seria cambiando la propiedad DropDownWidth del combobox, pero esta funcionalidad no esta presente en .net compact framework.

Entonces nosotros lo vamos a hacer usando codigo C# directamente en el workpanel donde queremos este comportamiento.

El primer paso es crear un work panel y agregar una variable "&micombo" con propiedad ControlType = "ComboBox" y un boton con el evento enter asociado (el evento puede ser cualquiera).

Event Enter

         // Agrego descripciones al combo
         &micombo.AddItem("cuatro", "este es mucho mas largo")
         &micombo.AddItem("cinco", "y este es mucho pero mucho mas largo")

         csharp System.IntPtr handle = ((com.genexus.uifactory.net.NetChoice)((com.genexus.ui.GXComboBox) cmbavMicombo.getGXComponent()).choice).Handle;

         csharp SendMessage(handle, 352, 300, 0);
EndEvent // Enter


Sub 'dummy'
         csharp }
         csharp [System.Runtime.InteropServices.DllImport("coredll.dll")]
         csharp static extern int SendMessage(System.IntPtr hWnd, int wMsg, int wParam, int lParam);
         csharp protected void dummy2(){
EndSub