El checkbox y yo

Me las traigo con algunos controles en Visual Basic. La última pelea ha sido con el chekbox. El motivo, controlar que no se pueda marcar o desmarcar la opción cuando estoy en modo «Ver datos». Con los demás controles (todos textboxes, maskedtextboxes, comboboxes y listboxes) lo había hecho controlando el evento Enter del GroupBox en el que se encuentran, de forma que, en modo «Ver datos», todos los intentos de acceder a un control dentro del GroupBox eran desviado a otro control, en este caso un listbox, podía haber sido un botón de navegación, etc. El problema surgió porque al marcar o desmarcar un checkbox no se pasa por el evento Enter, ni del chekbox ni del control que lo contiene. Lo mismo pasa con el numericupdown o el datetimepicker, pero con esos no he conseguido aún dar con la tecla (tampoco he tenido que usarlos de un tiempo a esta parte).

Sigue leyendo

TableAdapterManager

Entre unas cosas y otras tengo ambos blogs casi abandonados: ando muy liado en el curro (inventario, programas de CNC y una aplicación para fábrica), voy a comprarme un coche y los últimos fines de semana (cuando más escribo) no los he pasado en casa. Tengo una entrada casi terminada sobre un par de cositas sobre Visual Basic 2008 y mi aplicación Colección Anime, pero antes he tenido que solucionar un problema que me ha llevado cuatro horas entender y 10 minutos corregir. Lo posteo por si a alguien le pasa y pudiera encontrarlo útil.

Visual Basic 2008 trae un nuevo componente de acceso a datos llamado TableAdapterManager. En teoría debe simplificarnos el actualizar una base de datos partiendo de un dataset tipado con varias tablas relacionadas. El TableAdapterManager tiene un método, UpdateAll, que guarda los datos de todas las tablas del dataset (filas añadidas, modificadas y eliminadas) en el orden correcto, respetando las relaciones. En teoría debería simplificarnos las operaciones de guardado de datos en estos casos. En la práctica no es tan simple y me he encontrado con una serie de problemas. La documentación es bastante escasa, así que me ha tocado descifrar el código y ver qué hace realmente el dichoso componente.

Sigue leyendo

Toy mu malito

Estoy liado con una aplicación para fábrica donde debo tener en cuenta los problemas de concurrencia. Hasta ahí, pues un problema que hay que resolver.

Lo que me mata es que tengo que pensar detenidamente en la dichosa palabra porque me sale corradicalidad. Hace más de diez años que di Dibujo Técnico en Aeronáuticos (técnicos) y la corradicalidad en el plano era una de esas cosas que podía aplicarlas sin problemas pero que jamás comprendí realmente.

Entonces, ¿tan traumatizado quedé que ahora, cada vez que pienso en corrad… concurrencia, automáticamente empiezo a pensar en lugares geométricos, ejes radicales y un montón de conceptos que ya apenas recuerdo?

Necesito unas vacaciones.

Funciona

Es una buena noticia: el formulario de tablas menores de mi nueva aplicación de Colección Anime funciona y no ha dado mucha guerra, salvo algunos problemas menores con la herencia visual en formularios y los problemas que da un MenuStrip heredado. Pero, por lo demás, todo ha funcionado desde el principio sin problemas. No está terminado, aún falta la opción de Eliminar y añadir un control por si las tablas están vacías, de forma que se deshabiliten las opciones de Modificar y Eliminar, pero el resto es funcional.

La razón para empezar por este formulario eran dos:

  1. La primera es que es el segundo formulario más complejo que tengo. Pese a que las tablas que maneja tienen sólo tres campos (un identificador numérico, el nombre y un campo para comentarios), el formulario debe gestionar 11 tablas, lo que me garantiza unos cuantos dolores de cabeza.

  2. La segunda es que, dada las tablas que maneja, necesito este formulario antes de ponerme con las series y releases, en el otro formulario grande. Y eso es lo principal para tener algo útil, que personajes y listas de episodios siempre puedo añadirlos después.

Pero la razón fundamental de haber hecho este formulario, antes incluso que el formulario de inicio o haber terminado las clases de acceso a datos, es para poder comprobar que lo que estoy haciendo es correcto y que no tengo graves errores de concepto. Mejor descubrirlo ahora que mil líneas después.

Sigue leyendo

La aplicación que no fue

Hará cosa de año y medio (¡cómo pasa el tiempo!) empecé con mi aplicación ColecciónAnime en Visual Basic 2005. Básicamente intentaba ser un front-end para una base de datos para controlar un poco el jaleo que tengo de series y, de paso, terminar de dar el salto de VB6 a VB2005 y.Net Framework. La base de datos pretendía recoger las series y las distintas versiones de éstas que tenía, los fansub que las habían sacado, los estudios que las habían hecho, sus personajes, los actores de doblaje y, de paso, a quién se las prestaba.

Empecé con ganas, pero al poco me puse a trabajar y la idea se quedó en el limbo: después de estar ocho horas al día delante de un ordenador, no me apetecía mucho ponerme a programar al llegar a casa. Algunos fines de semana le echaba un ratito y, así, poco a poco, la fui haciendo. Esta Semana Santa le metí un buen tute y conseguí solucionar dos problemas que arrastraba desde el principio (después de un tiempo empollando un tocho ladrillo, no hay nada como tener documentación). A saber:

  1. El formulario de series debía mostrar cada serie y, en un TabControl, cero o más pestañas con las distintas releases que tuviera de esa serie. Me daba problemas al modificar una release. Lo conseguí solucionar con un control de usuario hecho a medida.

  2. El otro foco de problemas era el formulario de tablas menores. Este formulario gestionaba (altas, bajas, modificaciones) una serie de tablas casi idénticas (Resolución, códecs de audio y vídeo, tipo de archivo, género, idiomas…): todas tenían los tres mismos campos (Id, nombre y comentarios), pocos registros y se relacionaban con series o releases. En vez de tener un formulario para cada una, creé uno solo y usé un dataset no tipado para poder trabajar con cualquiera de las tablas. Cuando diseñé la base de datos no pensé en hacer la gestión así, así que tuve algunos problemas añadidos (los nombres de los campos eran distintos, etc.) que me complicaron un poco la vida, otra vez con las modificaciones. En Semana Santa, después de pensar tranquilamente, lo corregí.

Así que me encontraba con que la aplicación casi permitía ya altas, bajas y modificaciones sin problemas (me quedaba controlar un par de cosas en el caso de que hubiera múltiples formularios abiertos) y estaba ya dándole vueltas a la parte de consultas cuando me pillé el libro de El Guille de VB2008 y descubrí LINQ.

Aplicación a la papelera.

Cambiamos a VB2008 y, de paso, cambiamos el motor de la base de datos, optando por Compact SQL en lugar de Access. La aplicación la voy a rehacer entera, más orientada a objetos, jugando ya con herencia e interfaces y más o menos en dos capas. Espero poder aprovechar bastante código de la anterior, pero también localizado un buen puñado de líneas que voy a jubilar gracias a LINQ y a lo que he aprendido desde que empecé con VB2005. En fin, veremos que sale, si sale algo.

Y a ver si consigo que funcione mínimamente para cuando salga Visual Basic 10, porque como mantenga el ritmo quiebra Microsoft antes de que la termine.