Bij het toevoegen van Delphi 5-compatibiliteit aan een oudere VCL-sample faalde het project op een regel die in nieuwere Delphi-versies volledig normaal is. De code probeerde een aangepast datumpatroon direct toe te wijzen aan de eigenschap TDateTimePicker.Format.
|
1 |
DateTimePicker.Format := 'MM/dd/yyyy'; |
TDateTimePicker is een VCL-wrapper rond de Windows common control. Nieuwere Delphi-versies bieden een handige eigenschap Format, maar Delphi 5 niet. In Delphi 5 en eerder volgt de control normaal de regionale datuminstellingen van Windows, tenzij het onderliggende common-control-bericht direct wordt verzonden.
Gebruik de common-control API voor Delphi 5
De compatibiliteitsoplossing is DateTime_SetFormat uit de CommCtrl-unit aan te roepen voor Delphi 5, terwijl nieuwere compilers de directe propertytoewijzing behouden. Voeg CommCtrl toe aan de uses-clausule wanneer de Delphi 5-branch wordt gecompileerd.
|
1 2 3 4 5 |
{$IFDEF D5} DateTime_SetFormat(DateTimePicker.Handle, PChar('MM/dd/yyyy')); {$ELSE} DateTimePicker.Format := 'MM/dd/yyyy'; {$ENDIF} |
Praktische opmerkingen
De formatstring gebruikt de Windows date-time picker-syntaxis, niet elke Delphi-formattingtoken. Houd het patroon eenvoudig en test het op een machine met andere regionale instellingen als de applicatie internationaal wordt uitgerold.
Als u gedeelde samplecode onderhoudt voor Delphi 5, Delphi 6 en moderne Delphi-releases, isoleer deze branch dan achter een compilersymbool zoals D5. Zo blijft de moderne code leesbaar terwijl de oude common-control workaround zichtbaar blijft.
Compatibiliteitschecklist
- Voeg
CommCtrlalleen toe waar de Delphi 5-branchDateTime_SetFormatnodig heeft. - Geef de handle van de picker door, niet de handle van het formulier.
- Houd de formatstring geldig voor de duur van de aanroep door een normale string literal of stabiele variabele te gebruiken.
- Controleer de weergegeven datum in de doel-Windows-locale.
Waarom ShortDateFormat niet genoeg is
Het wijzigen van Delphi's globale datumformaatvariabelen verandert een date-time picker die door de Windows common control wordt ondersteund niet betrouwbaar. De picker rendert volgens de controlinstellingen en de berichten die hij ontvangt. Daarom is DateTime_SetFormat de juiste compatibiliteitslaag voor Delphi 5.
Dit onderscheid is belangrijk in oude sampleprojecten omdat die vaak over meerdere Delphi-versies worden gecompileerd. Een regel die schoon is in Delphi 7 of Delphi 2009 bestaat mogelijk niet in Delphi 5, terwijl een Windows common-control-bericht nog steeds beschikbaar kan zijn. Conditional compilation laat elke compiler het meest natuurlijke pad gebruiken.
Compatibiliteit met oude versies testen
Test na het toepassen van de workaround zowel de weergegeven waarde als de opgeslagen waarde. Het formaat beïnvloedt wat de gebruiker ziet; het mag de onderliggende TDateTime-waarde voor berekeningen niet veranderen. Die scheiding is belangrijk in inkooporders, facturen en spreadsheetexports waar weergaveformaat en numerieke datumwaarden consistent moeten blijven.
Controleer het formulier ook nadat de window handle opnieuw is gemaakt. Sommige VCL-controls kunnen native-controlstatus verliezen als de handle wordt vernietigd en opnieuw aangemaakt. Als uw applicatie stijlen of parents tijdens runtime wijzigt, pas het formaat dan toe nadat de handle beschikbaar is.
Opmerking voor langetermijnonderhoud
Wanneer een project Delphi 5-ondersteuning niet meer nodig heeft, verwijder dan de conditional branch en behoud de directe toewijzing aan de eigenschap Format. Tot die tijd houdt u de compatibiliteitscode dicht bij de controlsetup in plaats van die te verbergen in ongerelateerde bedrijfslogica. Zo is duidelijk dat de workaround bestaat voor een VCL-controlbeperking, niet voor de inkooporderberekening zelf.