Al añadir compatibilidad con Delphi 5 a una muestra VCL antigua, el proyecto falló en una línea que es completamente normal en versiones más nuevas de Delphi. El código intentaba asignar un patrón de fecha personalizado directamente a la propiedad TDateTimePicker.Format.
|
1 |
DateTimePicker.Format := 'MM/dd/yyyy'; |
TDateTimePicker es un envoltorio VCL del control común de Windows. Las versiones nuevas de Delphi exponen una cómoda propiedad Format, pero Delphi 5 no. En Delphi 5 y anteriores, el control normalmente sigue la configuración regional de fecha de Windows salvo que se envíe directamente el mensaje del control común subyacente.
Usar la API del control común en Delphi 5
La corrección de compatibilidad es llamar a DateTime_SetFormat desde la unidad CommCtrl para Delphi 5, manteniendo la asignación directa de la propiedad en compiladores más nuevos. Añade CommCtrl a la cláusula uses al compilar la rama Delphi 5.
|
1 2 3 4 5 |
{$IFDEF D5} DateTime_SetFormat(DateTimePicker.Handle, PChar('MM/dd/yyyy')); {$ELSE} DateTimePicker.Format := 'MM/dd/yyyy'; {$ENDIF} |
Notas prácticas
La cadena de formato usa la sintaxis del date-time picker de Windows, no todos los tokens de formato de Delphi. Mantén el patrón simple y pruébalo en una máquina con configuración regional distinta si la aplicación se distribuirá internacionalmente.
Si mantienes código de ejemplo compartido entre Delphi 5, Delphi 6 y versiones modernas de Delphi, aísla esta rama detrás de un símbolo de compilador como D5. Así el código moderno sigue siendo legible y el workaround del control común antiguo queda documentado.
Lista de compatibilidad
- Añade
CommCtrlsolo donde la rama Delphi 5 necesitaDateTime_SetFormat. - Pasa el handle del picker, no el handle del formulario.
- Mantén viva la cadena de formato durante la llamada pasando un literal de cadena normal o una variable estable.
- Verifica la fecha mostrada en la configuración regional de Windows de destino.
Por qué ShortDateFormat no basta
Cambiar las variables globales de formato de fecha de Delphi no cambia de forma fiable un date-time picker respaldado por el control común de Windows. El picker se renderiza según la configuración del control y los mensajes que recibe. Por eso DateTime_SetFormat es la capa de compatibilidad correcta para Delphi 5.
Esta distinción importa en proyectos de ejemplo antiguos porque a menudo se compilan con varias versiones de Delphi. Una línea limpia en Delphi 7 o Delphi 2009 puede no existir en Delphi 5, mientras que un mensaje del control común de Windows aún puede estar disponible. La compilación condicional permite que cada compilador use la ruta más natural.
Probar compatibilidad con versiones antiguas
Después de aplicar el workaround, prueba tanto el valor mostrado como el valor guardado. El formato afecta lo que ve el usuario; no debe cambiar el valor TDateTime subyacente usado por los cálculos. Esa separación es importante en pedidos, facturas y exportaciones a hojas de cálculo donde el formato visible y los valores numéricos de fecha deben seguir siendo coherentes.
Comprueba también el formulario después de recrear el handle de ventana. Algunos controles VCL pueden perder estado nativo si el handle se destruye y se crea de nuevo. Si tu aplicación cambia estilos o padres en tiempo de ejecución, aplica el formato después de que el handle esté disponible.
Nota de mantenimiento a largo plazo
Cuando un proyecto ya no necesite soporte para Delphi 5, elimina la rama condicional y conserva la asignación directa a la propiedad Format. Hasta entonces, mantén el código de compatibilidad cerca de la configuración del control en vez de ocultarlo en lógica de negocio no relacionada. Eso deja claro que el workaround existe por una limitación del control VCL, no por el cálculo del pedido.