html Ustawianie formatu TDateTimePicker w Delphi 5 | losLab Software Development Blog

Artykuł techniczny

Ustawianie formatu TDateTimePicker w Delphi 5

· Programowanie Delphi

Podczas dodawania zgodności z Delphi 5 do starszego przykładu VCL projekt zatrzymał się na linii całkowicie normalnej w nowszych wersjach Delphi. Kod próbował przypisać własny wzorzec daty bezpośrednio do właściwości TDateTimePicker.Format.

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

TDateTimePicker jest wrapperem VCL wokół Windows common control. Nowsze wersje Delphi udostępniają wygodną właściwość Format, ale Delphi 5 jej nie ma. W Delphi 5 i starszych kontrolka zwykle podąża za regionalnymi ustawieniami daty Windows, chyba że bezpośrednio wyśle się komunikat underlying common-control.

Użyj common-control API dla Delphi 5

Poprawka zgodności polega na wywołaniu DateTime_SetFormat z jednostki CommCtrl dla Delphi 5, przy zachowaniu bezpośredniego przypisania właściwości dla nowszych kompilatorów. Dodaj CommCtrl do klauzuli uses podczas kompilowania gałęzi Delphi 5.

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

Uwagi praktyczne

Łańcuch formatu używa składni Windows date-time picker, a nie każdego tokenu formatowania Delphi. Utrzymuj wzorzec prosty i testuj go na komputerze z innymi ustawieniami regionalnymi, jeśli aplikacja będzie wdrażana międzynarodowo.

Jeśli utrzymujesz wspólny kod przykładowy dla Delphi 5, Delphi 6 i współczesnych wydań Delphi, odizoluj tę gałąź za symbolem kompilatora, takim jak D5. Dzięki temu nowoczesny kod pozostaje czytelny, a stary workaround common-control jest nadal udokumentowany.

Lista kontrolna zgodności

  • Dodaj CommCtrl tylko tam, gdzie gałąź Delphi 5 potrzebuje DateTime_SetFormat.
  • Przekaż uchwyt pickera, nie uchwyt formularza.
  • Utrzymaj łańcuch formatu przy życiu przez czas wywołania, przekazując zwykły literał tekstowy lub stabilną zmienną.
  • Zweryfikuj wyświetlaną datę w docelowej lokalizacji Windows.

Dlaczego ShortDateFormat nie wystarcza

Zmiana globalnych zmiennych formatu daty Delphi nie zmienia niezawodnie date-time pickera opartego na Windows common control. Picker renderuje według ustawień kontrolki i komunikatów, które otrzymuje. Dlatego DateTime_SetFormat jest właściwą warstwą zgodności dla Delphi 5.

To rozróżnienie ma znaczenie w starych projektach przykładowych, ponieważ często kompiluje się je w kilku wersjach Delphi. Linia czysta w Delphi 7 lub Delphi 2009 może nie istnieć w Delphi 5, podczas gdy komunikat Windows common-control nadal może być dostępny. Kompilacja warunkowa pozwala każdemu kompilatorowi użyć najbardziej naturalnej ścieżki.

Testowanie zgodności ze starszą wersją

Po zastosowaniu workaroundu przetestuj zarówno wartość wyświetlaną, jak i zapisaną. Format wpływa na to, co widzi użytkownik; nie powinien zmieniać bazowej wartości TDateTime używanej w obliczeniach. To rozdzielenie jest ważne w zamówieniach, fakturach i eksportach arkuszy, gdzie format wyświetlania i numeryczne wartości dat muszą pozostać spójne.

Sprawdź też formularz po ponownym utworzeniu window handle. Niektóre kontrolki VCL mogą utracić stan native-control, jeśli handle zostanie zniszczony i utworzony ponownie. Jeśli aplikacja zmienia style lub parents w runtime, zastosuj format po udostępnieniu handle.

Uwaga o długoterminowym utrzymaniu

Gdy projekt nie potrzebuje już wsparcia Delphi 5, usuń gałąź warunkową i pozostaw bezpośrednie przypisanie właściwości Format. Do tego czasu trzymaj kod zgodności blisko konfiguracji kontrolki, zamiast ukrywać go w niepowiązanej logice biznesowej. Dzięki temu widać, że workaround istnieje z powodu ograniczenia kontrolki VCL, a nie samego obliczania zamówienia.