När Delphi 5-kompatibilitet lades till i ett äldre VCL-exempel misslyckades projektet på en rad som är helt normal i nyare Delphi-versioner. Koden försökte tilldela ett eget datummönster direkt till egenskapen TDateTimePicker.Format.
|
1 |
DateTimePicker.Format := 'MM/dd/yyyy'; |
TDateTimePicker är en VCL-wrapper runt Windows common control. Nyare Delphi-versioner exponerar en praktisk Format-egenskap, men Delphi 5 gör det inte. I Delphi 5 och tidigare följer kontrollen normalt Windows regionala datuminställningar om inte det underliggande common-control-meddelandet skickas direkt.
Använd common-control API för Delphi 5
Kompatibilitetsfixen är att anropa DateTime_SetFormat från enheten CommCtrl för Delphi 5, samtidigt som direkt egenskapstilldelning behålls för nyare kompilatorer. Lägg till CommCtrl i uses-satsen när Delphi 5-grenen kompileras.
|
1 2 3 4 5 |
{$IFDEF D5} DateTime_SetFormat(DateTimePicker.Handle, PChar('MM/dd/yyyy')); {$ELSE} DateTimePicker.Format := 'MM/dd/yyyy'; {$ENDIF} |
Praktiska anteckningar
Formatsträngen använder Windows date-time picker-syntax, inte alla Delphi-formatteringstokens. Håll mönstret enkelt och testa det på en dator med andra regionala inställningar om applikationen ska distribueras internationellt.
Om du underhåller gemensam exempelkod för Delphi 5, Delphi 6 och moderna Delphi-versioner, isolera grenen bakom en kompilatorsymbol som D5. Det håller den moderna koden läsbar samtidigt som den gamla common-control-workarounden dokumenteras.
Kompatibilitetschecklista
- Lägg till
CommCtrlendast där Delphi 5-grenen behöverDateTime_SetFormat. - Skicka picker-handtaget, inte formulärets handtag.
- Håll formatsträngen vid liv under anropet genom att skicka en normal strängliteral eller stabil variabel.
- Verifiera det visade datumet i målversionens Windows-locale.
Varför ShortDateFormat inte räcker
Att ändra Delphis globala datumformatvariabler ändrar inte tillförlitligt en date-time picker som stöds av Windows common control. Pickern renderar enligt kontrollinställningarna och de meddelanden den tar emot. Därför är DateTime_SetFormat rätt kompatibilitetslager för Delphi 5.
Skillnaden spelar roll i gamla exempelprojekt eftersom de ofta kompileras över flera Delphi-versioner. En rad som är ren i Delphi 7 eller Delphi 2009 kanske inte finns i Delphi 5, medan ett Windows common-control-meddelande fortfarande kan vara tillgängligt. Villkorskompilering låter varje kompilator använda den mest naturliga vägen.
Testa kompatibilitet med gamla versioner
Efter workarounden, testa både det visade värdet och det sparade värdet. Formatet påverkar vad användaren ser; det ska inte ändra det underliggande TDateTime-värdet som används i beräkningar. Den separationen är viktig i inköpsorder, fakturor och kalkylbladsexporter där visningsformat och numeriska datumvärden måste förbli konsekventa.
Kontrollera också formuläret efter att window handle har skapats om. Vissa VCL-kontroller kan förlora native-control-tillstånd om handtaget förstörs och skapas igen. Om applikationen ändrar stilar eller parents vid runtime, applicera formatet efter att handtaget är tillgängligt.
Underhållsnotering på lång sikt
När ett projekt inte längre behöver Delphi 5-stöd, ta bort den villkorliga grenen och behåll den direkta tilldelningen till egenskapen Format. Fram till dess bör kompatibilitetskoden ligga nära kontrollens setup i stället för att döljas i orelaterad affärslogik. Det gör tydligt att workarounden finns för en VCL-kontrollbegränsning, inte för själva inköpsorderberäkningen.