Delphi32 en el siglo XXI
Se ha dado en llamar "bug del año 2000" a una serie de errores provocados por la costumbre de los seres humanos de trabajar con años de dos cifras. Esto que hasta ahora producía unos problemas muy llevaderos, con el cambio de siglo se van a hacer mas acuciantes.
Delphi, como muchos lenguajes de programación, gestiona internamente la fecha como el número de días transcurridos desde el 28 de diciembre de 1899, lo cual, es pefectamente correcto para el siglo XXI, XXII y venideros, ya que para él el 31-12-1999, será el 36525, el 1 de enero del 2000 será el 36526, y así sucesivamente.
Pero inevitablemente es necesario llevar las fechas a la pantalla para mostrárselas al usuario y recoger las que este nos introduce, lo cual hace imprescindible la conversión de esta fecha numérica a formato de texto. Es aquí dónde empiezan los problemas ya que para convertir el 36525 a fecha no hay error posible, pero ¿cómo convierte Delphi32 la cadena 01/01/99 a fecha? ¿y la cadena 01/01/01?.
Existen dos grupos de funciones que recogen cadenas de texto debidamente formateadas y las convierten en fechas:
Primer Grupo: las funciones cuya programación discurre íntegramente dentro de Delphi. Con StrToDate a la cabeza recogen cadenas de texto y en caso de que el año tenga tan sólo dos cifras consideran que pertenece al siglo de la fecha actual del sistema. Esto durante muchos años, ha funcionado correctamente pero se preveén ciertos problemas para los proyectos que en 1999 tengan que iniciarse el 12/07/00, ya que el ordenador interpretará que han de iniciarse el 12 de julio de 1900, y así mismo, en el año 2001, los nacidos el 26/06/32, tendrán menos 31 años ( cito estos dos ejemplos porque me han pasado tal y como los cuento en mi última aplicación).
Segundo grupo: las funciones que llaman a la biblioteca OLEAUT32.DLL de Windows. Esta biblioteca ha sido creada para dar soporte a la coversión de fechas de los lenguajes de programación de Microsoft ( Visual Basic ). La principal de las funciones de este grupo es VarToDateTime, que recibe un dato de tipo variable, cadena de texto para el caso que nos ocupa, y lo convierte en fecha. OLEAUT32.DLL y, por tanto, VarToDateTime, consideran que no sucedió nada digno de mencionarse antes del 1 de enero de 1930, y nada pasará después del 31 de diciembre del 2029, ya que a este lapso de tiempo ajustará cualquier fecha que tenga el año de dos cifras. Así, no habrá proyecto posible a iniciarse el 12/07/31 ni sería posible que nadie hubiera nacido el 26/06/25. Es tan triste que me resistí a creerlo hasta que lei el artículo de Microsoft Press que pueden encontrar en (url) y no me quedó más remedio que rendirme ante la evidencia.
La solución a este problema es fácil: utilizar siempre fechas con el año de cuatro cifras, pero esto
tiene dos inconvenientes.
La solución que os proponemos modifica internamente las llamadas a los dos grupos de funciones nombrados anteriormente, haciendo posible que la conversión de fechas en formato cadena de texto con año de dos cifras a formato fecha interno de Delphi32 se ajuste a un año mínimo parametrizable por el desarrollador y modificable en tiempo de ejecución. Este año mímimo se trabaja desde una propiedad de un componente no visual que se coloca en el Form principal de la aplicación.
Una vez instalado hay que recompilar toda la aplicación, componentes de terceros incluidos, en caso de tener el código fuente. Para ello aconsejamos utilizar la opción "Project|Build All" del menú principal de Delphi.
Para instalar este sistema debemos descomprimir el paquete en un directorio y ejecutar install.exe
Este proceso sustituye el archivo de estándar de Delphi, SysUtils.dcu por nuestra propia versión, guardando el archivo original como SysUtils.old. Así mismo, el proceso de instalación crea el archivo install.log que contiene información para UnInstall.exe que realizará el proceso de desinstalación, en el caso de ser necesario. Los procesos de instalacion y desinstalacion requieren como condición imprescindible que Delphi no este ejecutándose.
En caso de que el proceso de instalación fallara, el usuario no debería tener mayor problema para sustituir a mano el archivo SysUtils.dcu por el que se incluye en el paquete, en el path de Delphi, habitualmente \Borland\Delphi32\LIB realizando una copia de seguridad del original previamente.
Después de ejecutar install.exe, debemos utilizar la opción "Component|install" del menú principal de Delphi para instalar el componente no visual que gestiona el año mínimo, darle un valor a la propiedad FirstYear y reconstruir toda la aplicación.