При добавлении совместимости с 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, а не из-за расчета заказа.