Техническая статья

Настройка формата TDateTimePicker в Delphi 5

При добавлении совместимости с Delphi 5 в старый пример VCL проект остановился на строке, которая совершенно обычна в новых версиях Delphi. Код пытался напрямую присвоить пользовательский шаблон даты свойству TDateTimePicker.Format .

1
DateTimePicker.Format := 'MM/dd/yyyy';

TDateTimePicker — это оболочка VCL над общим элементом управления Windows. Новые версии Delphi предоставляют удобное свойство Format но в Delphi 5 его нет. В Delphi 5 и более ранних версиях элемент обычно следует региональным настройкам даты Windows, если напрямую не отправить сообщение нижележащего common control.

Используйте common-control API для Delphi 5

Исправление совместимости состоит в вызове DateTime_SetFormat из модуля CommCtrl для Delphi 5 с сохранением прямого присваивания свойства для новых компиляторов. Добавьте CommCtrl в раздел uses при компиляции ветки Delphi 5.

1
2
3
4
5
{$IFDEF D5}
DateTime_SetFormat(DateTimePicker.Handle, PChar('MM/dd/yyyy'));
{$ELSE}
DateTimePicker.Format := 'MM/dd/yyyy';
{$ENDIF}

Практические заметки

Строка формата использует синтаксис Windows date-time picker, а не все токены форматирования Delphi. Держите шаблон простым и тестируйте его на машине с другими региональными настройками, если приложение будет использоваться международно.

Если вы поддерживаете общий пример кода для Delphi 5, Delphi 6 и современных выпусков Delphi, изолируйте эту ветку за символом компилятора вроде D5. Это сохраняет современный код читаемым и одновременно документирует старый обходной путь common control.

Контрольный список совместимости

  • Добавляйте CommCtrl только там, где ветке Delphi 5 нужен DateTime_SetFormat.
  • Передавайте handle picker, а не handle формы.
  • Сохраняйте строку формата живой на время вызова, передавая обычный строковый литерал или стабильную переменную.
  • Проверьте отображаемую дату в целевой локали Windows.

Почему ShortDateFormat недостаточно

Изменение глобальных переменных формата даты Delphi не гарантирует изменение date-time picker, основанного на общем элементе управления Windows. Picker отрисовывается по настройкам элемента и полученным сообщениям. Поэтому DateTime_SetFormat — правильный слой совместимости для Delphi 5.

Это различие важно в старых примерах, потому что они часто компилируются несколькими версиями Delphi. Строка, нормальная для Delphi 7 или Delphi 2009, может отсутствовать в Delphi 5, тогда как сообщение Windows common-control все еще доступно. Условная компиляция позволяет каждому компилятору использовать наиболее естественный путь.

Тестирование совместимости со старыми версиями

После применения обходного пути протестируйте и отображаемое, и сохраненное значение. Формат влияет на то, что видит пользователь; он не должен менять базовое значение TDateTime используемое в вычислениях. Это разделение важно в заказах, счетах и экспорте таблиц, где формат отображения и числовые значения дат должны оставаться согласованными.

Также проверьте форму после пересоздания оконного handle. Некоторые элементы VCL могут потерять состояние native control, если handle уничтожен и создан снова. Если приложение меняет стили или родителей во время выполнения, применяйте формат после появления handle.

Заметка о долгосрочном сопровождении

Когда проекту больше не нужна поддержка Delphi 5, удалите условную ветку и оставьте прямое присваивание свойства Format . Пока поддержка нужна, держите код совместимости рядом с настройкой элемента, а не прячьте его в несвязанной бизнес-логике. Так ясно, что обходной путь существует из-за ограничения VCL control, а не из-за расчета заказа.