Este "truco"
es muy sencillo, pues aparece en las instrucciones de la instalación
del Update
Pack 2 de Delphi,
que casi todos los programadores deben tener. Sin embargo, he
notado que muchas personas ignoran la existencia de una nueva
variable, llamada TwoDigitYearCenturyWindow,
que hay que ajustar para evitar algunos problemas relacionados
con el año 2000.
Esta variable está
declarada en la unidad SysUtils,
y tiene un valor inicial de 0. Cuando
tiene un valor distinto de 0,
se utiliza durante la conversión de cadenas a fechas si
el año se expresa mediante dos dígitos. En ese caso,
TwoDigitYearCenturyWindow
define el origen de una ventana de 100 años, a partir del
año actual, dentro de la cuál se interpreta el año
de dos dígitos. Supongamos que asignamos 50 a la variable
y que estamos en 1999. Entonces, cuando tecleamos un año
con dos dígitos se interpretará dentro del siguiente
rango de fechas:
1/1/1949 - 31/12/2048
Si asignamos 80,
el rango será el siguiente (más adecuado para aplicaciones
que trabajan, por ejemplo, con fechas de nacimiento):
1/1/1919 - 31/12/2018
¿Dónde
se puede inicializar esta variable? Quizás sea más
conveniente utilizar el fichero de proyecto, el dpr,
antes de llamar a Application.Initialize,
pero puede ser también en la cláusula initialization
de cualquier unidad. También puede modificarse temporalmente
dentro de un módulo cuya ejecución sea modal, y
restaurarse posteriormente.
¿Cómo
funciona? Fácil: afecta a la función ScanDate,
que es llamada internamente por StrToDate,
que a su vez es llamada por las conversiones que realizan los
componentes data-aware
cuando
encuentran una fecha. Es importante este dato, pues podemos encontrar
problemas al pasar cadenas de caracteres a Locate
para realizar búsquedas sobre columnas de tipo fecha. Como
el segundo parámetro de Locate es un
Variant, y se
traga lo que le echen, muchos programadores pueden hacer cosas
como esta:
Tabla1.Locate('FECHA', Edit1.Text, []);
Sin embargo, la conversión
a fecha la realizará en tal caso las rutinas de manejo
de variantes del sistema operativo. Es preferible utilizar este
otro código:
Tabla1.Locate('FECHA', StrToDate(Edit1.Text), []);
Así forzamos
el uso de TwoDigitYearCenturyWindow.