Mantener actualizados unos ComboBox (II)

No tenía intención de volver sobre este tema pero, la verdad, tampoco tengo nada más que escribir. Y, al final, fue un problema curioso cuya resolución no me quedó tan elegante como a mí me hubiera gustado. El primer problema que me dio la solución que comentaba fue cuando intenté ordenar el contenido de la BindingList. Mi gozo en un pozo: la BindingList no ordena. Me resulta chocante que la BindingList, que se supone va mejor para enlace a datos, no ordene ni busque, y una List sí. De hecho, por internet e incluso en la misma documentación de MSDN encontramos clases derivadas de BindingList que ordenan y/o buscan. De hecho, encontré una para un caso general que me ha gustado mucho y me la he guardado, pero para esta aplicación he preferido usar una clase preparada para la ocasión.

Partíamos, recuerdo, de una clase muy sencilla, IdMasDescripcion, con dos propiedades, Id de tipo Integer que se corresponde a la clave primaria, y Descripcion de tipo String. La clase, además, implementa la interfaz IComparable(Of T), y el método CompareTo lo que hace es comparar las descripciones. Lo que voy a hacer, entonces, es una BindingList(Of IdMasDescripcion) personalizada que sea capaz de ordenarse. Pero no siempre va a estar ordenada (depende de qué tabla muestre) y la ordenación puede ser alfabética o por resoluciones (de momento; en un futuro puede que me haga falta un tercer tipo). Voy a necesitar un método para ordenar (Sort), y dos campos que me indiquen si la colección está ordenada (IsSorted) y si hay que ordenarla (ToSort):

Sigue leyendo

Y me llegó la crisis

Exactamente eso. Hasta el momento la capeábamos, pero ha dicho el jefe que hasta aquí hemos llegado. La fábrica se enfrenta a un ERE total y cierre. Bueno, echar las culpas a la crisis está muy manido y esto se veía venir. La fábrica agonizaba lentamente desde antes de que empezara a trabajar aquí. Por mucho que los trabajadores nos esforcemos (a fin de cuentas, somos los más interesados en que el negocio funcione), sin un jefe de fábrica es difícil hacer las cosas. Se ponía (y se pone) voluntad, pero sin una jerarquía clara y sin organización, sin un rumbo que seguir, la voluntad sola no basta.

Ahora me toca a mí, aunque técnicamente yo no estoy en esa empresa. No me renuevan el contrato. La verdad es que me lo esperaba porque ya no había trabajo para mí las 8 horas. Este invierno invertía tiempo en desarrollar una base de datos y una aplicación para fábrica, para gestionar los muebles, sus piezas y herrajes, y las órdenes a fábrica, pero al final ese trabajo se queda en nada (aunque he aprendido mucho de datasets, eso sí). En fin, que esto se acaba. Toca recoger manuales y archivos propios, limpiar mi cuenta de usuario, reprogramar copias de seguridad, escaneos de antivirus y demás operaciones de mantenimiento para que requieran la mínima intervención humana posible y que aguanten… lo que puedan. Echaré de menos el servidor, aunque supongo que de cuando en cuando me llamarán para corregir tal o cual problema. En oficina se van a quedar bien solitos: hace un año éramos seis, ahora quedábamos tres.

El mantenimiento de los ordenadores va a quedar reducido al mínimo; el control de stocks de la aplicación de las tiendas morirá en pocos meses; el blog de la tiendas quedará congelado en el tiempo por siempre jamás, pero me libraré del ordenador de riego y de la Dama, la máquina de control numérico. En el fondo, la echaré un poco de menos. Por lo menos, hasta que recuerde lo que es verla arrancar de cuajo una pieza de metro diez por cuarenta de aglomerado de 30mm.

Pienso tomarme unas vacaciones alejado de ordenadores, internet y todo lo que huela a tecnología… bueno, casi todo. Luego, buscar trabajo, claro. Y programar un poco, que llevo un par de meses sin hacer prácticamente nada. Y volver a pegarme con Linux, si tengo tiempo. Parece que una etapa llega a su fin.

La Dama, y un servidor al fondo.

La frase de la semana

No es mi intención empezar a sacar «microposts», pero es que no me resisto a esto:

Como estaba [Vista] pre-instalado, tuve que cambiarlo y ponerle uno pirata.

Ordenador nuevo, Vista preinstalado, y va y lo quita para poner un Vista pirata porque ¡¿viene preinstalado?! De repente, me siento muy, muy cansado. Es lo que hacemos todos cuando nos viene un ordenador sin los discos de instalación del SO y sin los discos de drivers, ¿no? Quitar el SO que trae y poner el mismo, pero pirata (y, a ser posible, «tuneado»).

No hay nada como un antivirus…

…para destrozar un equipo. En mi ordenador del curro, donde llevo probando la RC de 7 desde que salió, instalé una versión de prueba de Avast que me ha ido muy bien, apenas se notaba que estaba. Sin embargo, se acabó el tiempo de prueba y ayer instalé el antivirus que tenemos en la empresa. Hoy, desesperado, lo he quitado. No suelo cronometrar el tiempo que tarda en arrancar el ordenador, pero, más o menos, desde que le doy al botón de encendido hasta que me sale el login apenas me da tiempo a sacar de la cartera la botella de agua, el móvil, el boli (sí, me lo tengo que traer de casa) y la calculadora. Meto el login, lanzo el Internet Explorer, el Outlook y el Firefox y mientras se abren, abro de paso la ventana de la oficina. Luego, mientras me logueo en la aplicación web de la empresa y espero que cargue la barra de menús (Java), Firefox se da por aludido y me deja hacer algo (tengo que jubilarlo porque va rematadamente mal, pero no logro acostumbrarme ni a Opera ni a Safari e Internet Explorer abre las nuevas pestañas demasiado lento).

Pues hoy, con el antivirus puesto, me ha dado tiempo a sacar todo de la cartera, abrir la ventana, colocar las cosas, sentarme, levantarme, ajustar la persiana y volver a sentarme antes de que saliera el login. Y luego otro rato igual hasta tener abierto Outlook e IExplorer. Y un rato después, por fin Firefox. Por un momento he pensado en las actualizaciones de ayer, así que he reiniciado para comprobarlo. Nada, igual.

Así que he desinstalado el antivirus y esto vuela otra vez. Hoy pasaré del antivirus y ya pensaré en algo para mañana. Pero, desde luego, no hay como un antivirus para destrozar el rendimiento de un equipo.

Ordenando por resoluciones

Esto es una tontería del tipo tonterida, pero me ha llevado un ratito escribir el código, así que lo anoto aquí para cuando me vuelva a pasar, que entonces, seguramente, ya se me habrá olvidado y me tocará echar otro ratito y no me apetece. El problema es sencillo: hay que ordenar una lista de elementos de forma no trivial. En este caso concreto, hay que ordenar por una propiedad de tipo String, cadena de caracteres, que va a contener resoluciones de imagen, esto es, dos valores numéricos separados por una «x»: 640×480, 1024×768 y así. También serviría para cualquier lista de pares de valores y se podría extender a situaciones más complejas, como coordenadas espaciales y cosas así.

Lo primero ha sido elegir el algoritmo de ordenación. Como van a ser pocos elementos, me he tirado a los sencillitos y, de estos, al de inserción, que es el único que soy capaz de desarrollar sin mirar la chuleta (el de la burbuja lo tengo atravesado). El proceso es muy simple: vamos ordenando por el primer valor. Si este es igual, pasamos a ordenar por el segundo valor. En este caso concreto, ordenamos por largo (primer valor) y si son iguales, por ancho. Para ello, lo primero que he hecho ha sido crearme dos funciones que me devuelvan el largo o el ancho a partir de la cadena:

Sigue leyendo

Vendes como yo diga

Con el verano y la crisis, no vendemos nada, así que se me ocurrió preparar una web sencillita para las tiendas con ofertas y promociones, a ver si de ahí nos caía algún cliente. A fin de cuentas, sale más barato que repartir folletos. Ha dado la casualidad de que hoy me ha llegado una curiosa carta de uno de nuestros proveedores, uno bien grande. Básicamente nos dice que Internet como herramienta de venta lo controlan ellos y si queremos mostrar y vender sus productos por Internet, debe de ser con su permiso y con sus condiciones (nada de regalos ni promociones, tales productos sí y tales no, como mucho tal descuento, etc.).

Nosotros queríamos apostar fuerte este verano por ellos, pues tenemos algunos descuentos muy interesantes en algunos productos que queríamos trasladar al PVP. Si al final lo hacemos (que lo haremos; aunque a mí se me han quitado las ganas, necesitamos las ventas y la oferta tiene un buen precio para el cliente y mantiene un buen margen para nosotros), confiaremos en el boca a boca. Y haremos publicidad de proveedores más pequeños.

No soy comercial, no trato con clientes ni con proveedores ni ganas tengo, pero, particularmente, me fastidia que los proveedores nos digan a las tiendas cómo y a qué precio tenemos que vender. Como trabajador que quiere seguir cobrando a fin de mes y como cliente, me fastidia un montón (por decirlo suavemente y no usar palabras que empiezan por j ni por h).

Mantener actualizados unos ComboBox

Vamos con una de programación, que hace mucho que no cuento nada (básicamente, porque llevo unos meses sin programar; a ver si arranco motores). Me he puesto con mi aplicación de anime (un front-end para una base de datos de series, nada más, que me sirve de aprendizaje y experimentación). Ya me toca meter datos, sacar fallos, pulir el funcionamiento y terminar algunas funciones pendientes. Y recordar lo que estaba haciendo, que hace seis meses o así que no la tocaba.

Una de estas funciones, o funcionalidades, si lo preferís para no confundirlo con functions, es la de mantener actualizados una serie de comboboxes que hay en el formulario principal de las series. Estos comboboxes contienen los datos de una serie de tablas de la base de datos que se caracterizan por tener pocos datos: el formato de archivo, la resolución, el códec de vídeo… En otras circunstancias, los rellenaría usando mi clase RellenarCombo, pero aquí se me presenta un problema curioso: como podéis ver en la imagen, hay una buena cantidad de comboboxes (una docena o así) que se corresponden a una serie de campos de las Releases (versiones) de una serie. El formulario muestra conjuntamente las series y sus releases, estando en la parte superior los datos de la serie y en la inferior, en cero o más pestañas los datos de las releases. O sea, tengo una docena de combos por cada pestaña.

Aquí empezaron mis problemas: ¿cómo rellenar esos combos y mantenerlos actualizados?

Sigue leyendo