Cuando Double.MaxValue, no es Double.MaxValue

Creo que es uno de los primeros post que voy a escribir por absoluta desesperación. Y el título lo dice todo.

Estamos desarrollando una aplicación en mi empresa, donde usamos un librería «open source» construida de manera intachable. Bien estructurada, con sus clases, con sus interfaces, y todo en NET 2.0.

Ahora viene lo bueno, dentro de la librería, hay un:

public const double Missing = Double.MaxValue;

Esta línea, parece encarnar el mal, y tiene el número #630 dentro del sistema de bugtracking del proyecto (a partir de ahora el número del mal). En ciertos equipos (si, en ciertos, sin diferenciación mayor que ser otro equipo), provoca que el programa se salga (mejor dicho: explote), sin generar ninguna excepción (lo que implica un error por debajo incluso del NET) y sin dejar ningún registro de error. En cambio, si ponemos:

Si hacemos una asignación quitando el alias:

public const double Missing = 1.7976931348623157E+308;

Tenemos otro crash silencioso al ejecutar el programa. Incluso rebajando el exponente, tenemos el mismo fallo. Pero esperen, que viene lo mejor:

public const double Missing = 999999999999999999;

Entonces, todo el felicidad, los pájaros cantan y las nubes se levantan… No falla.

¿¿¿Porqué???. De verdad que no lo entiendo, y los oscuros mundos del NET me tienen frito.

Pues no termino de entender el porque. Puedo conjeturar que viene por la representación que le da .NET, no es representable por algún nivel más bajo de la máquina, o algún redondeo que implique un overflow. Pero la verdad que no he encontrado nada por la red, y menos aun por los foros de la librería. Pueden ser muchos factores, y me estaré dejando muchos sin tener en cuenta, pero desde luego ahora mismo estoy falto de ideas.

Please follow and like us:

.NET: Como hacer una única función de «Close» para multiples paneles

Os pongo en situación: una aplicación escrita en Visual C# 2005 con múltiples paneles a modo de ventanas flotantes en el form principal. Por necesidades del cliente, ahora se necesita que todos estos paneles tengan un botón de «salida», o «close».

Imaginaros, tengo 10 paneles, ¿tengo que hacer 10 funciones?. No hombre… es muy sencillo:

  • Poner los botones en cada panel. Haz doble click sobre uno, y escribe el código siguiente:
    private void btnCerrar_Click(object sender, EventArgs e)
    {
    System.Windows.Forms.Button btn = (Button)sender;
    btn.Parent.Visible = false;
    }
  • Ahora te vas a cada boton y le asignas esta función en cada evento click. Ya está.

Como veras, se puede usar para cerrar panels (en este caso hacerlos invisibles), mover cosas, cerrar un form, y todo lo que se te ocurra que sea muy repetivivo. Espero que os sirva de ayuda.

Please follow and like us:

Usando SQLite en tus aplicaciones

Aveces, te planteas aplicaciones, que necesitarían un lugar donde almacenar mucha información, en muchos casos, simplemente por tenerla ordenada y accesible la incorporación de una base de datos es muy recomendable.
Pero, incluir una base de datos, resulta muy engorroso, de hecho muchas veces incluso es un problema. Os pongo el caso, de necesitar de una pequeña agenda que te vas a instalar en tu PC de casa… Ves sus requisitos y ves que necesita instalar un MySQL o similar. Sencillamente no me lo instalaría (como la mayoría de la gente).

Mucha gente me contestaría, que se podría usar un texto plano, un XML, un archivo binario, o cientos de tipos de soluciones que no necesitaran de tener una base de datos en tu maquina… cierto. ¿Pero y si el volumen de datos empieza a ser un problema?.

Una solución puede ser SQLite, que es una solución intermedia. Es un desarrollo intermedio, una base de datos en un fichero, sin dependencias y todo en una dll.  Ademas hay un desarrollo para ADO.NET, para integrarlo con el Visual Studio, que hace las cosas muy sencillas.

Es una solución intermedia, ya que yo es recomendable usarlo para cosas que requieran mucha fiabilidad (sobre todo de tiempo respuesta) pero para pequeños proyectos o aplicaciones con poco estrés, te solucionará la vida.

Please follow and like us: