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
CommCtrltylko tam, gdzie gałąź Delphi 5 potrzebujeDateTime_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.