Fachartikel

Das TDateTimePicker-Format in Delphi 5 festlegen

· Delphi-Programmierung

Beim Hinzufügen von Delphi-5-Kompatibilität zu einem älteren VCL-Beispiel scheiterte das Projekt an einer Zeile, die in neueren Delphi-Versionen völlig normal ist. Der Code versuchte, ein eigenes Datumsformat direkt der Eigenschaft TDateTimePicker.Format zuzuweisen.

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

TDateTimePicker ist ein VCL-Wrapper um das Windows-Common-Control. Neuere Delphi-Versionen stellen eine bequeme Format-Eigenschaft bereit, Delphi 5 jedoch nicht. In Delphi 5 und älter folgt das Control normalerweise den regionalen Windows-Datumseinstellungen, sofern nicht direkt die darunterliegende Common-Control-Nachricht gesendet wird.

Die Common-Control-API für Delphi 5 verwenden

Die Kompatibilitätskorrektur besteht darin, für Delphi 5 DateTime_SetFormat aus der Unit CommCtrl aufzurufen und für neuere Compiler die direkte Eigenschaftszuweisung beizubehalten. Fügen Sie CommCtrl der uses-Klausel hinzu, wenn der Delphi-5-Zweig kompiliert wird.

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

Praktische Hinweise

Der Formatstring verwendet die Windows-Date-Time-Picker-Syntax, nicht jedes Delphi-Formatierungstoken. Halten Sie das Muster einfach und testen Sie es auf einem Rechner mit anderen Regionseinstellungen, wenn die Anwendung international ausgeliefert wird.

Wenn Sie gemeinsamen Beispielcode für Delphi 5, Delphi 6 und moderne Delphi-Versionen pflegen, isolieren Sie diesen Zweig hinter einem Compiler-Symbol wie D5. So bleibt der moderne Code lesbar, während der alte Common-Control-Workaround dokumentiert ist.

Kompatibilitätscheckliste

  • Fügen Sie CommCtrl nur dort hinzu, wo der Delphi-5-Zweig DateTime_SetFormat benötigt.
  • Übergeben Sie den Picker-Handle, nicht den Formular-Handle.
  • Halten Sie den Formatstring für die Dauer des Aufrufs lebendig, indem Sie ein normales Stringliteral oder eine stabile Variable übergeben.
  • Prüfen Sie das angezeigte Datum in der Ziel-Windows-Locale.

Warum ShortDateFormat nicht genügt

Das Ändern globaler Datumsformatvariablen von Delphi ändert einen Date-Time-Picker, der auf dem Windows-Common-Control basiert, nicht zuverlässig. Der Picker rendert nach den Control-Einstellungen und den empfangenen Nachrichten. Deshalb ist DateTime_SetFormat die richtige Kompatibilitätsschicht für Delphi 5.

Diese Unterscheidung ist in alten Beispielprojekten wichtig, weil sie oft mit mehreren Delphi-Versionen kompiliert werden. Eine Zeile, die in Delphi 7 oder Delphi 2009 sauber ist, existiert möglicherweise in Delphi 5 nicht, während eine Windows-Common-Control-Nachricht trotzdem verfügbar sein kann. Bedingte Kompilierung lässt jeden Compiler den natürlichsten Pfad verwenden.

Kompatibilität mit alten Versionen testen

Testen Sie nach dem Workaround sowohl den angezeigten als auch den gespeicherten Wert. Das Format beeinflusst, was der Benutzer sieht; es sollte den zugrunde liegenden TDateTime-Wert für Berechnungen nicht ändern. Diese Trennung ist wichtig bei Bestellungen, Rechnungen und Tabellenexporten, bei denen Anzeigeformat und numerische Datumswerte konsistent bleiben müssen.

Prüfen Sie das Formular auch nach einer Neuerstellung des Fensterhandles. Einige VCL-Controls können nativen Control-Zustand verlieren, wenn der Handle zerstört und neu erstellt wird. Wenn Ihre Anwendung zur Laufzeit Stile oder Parent-Controls ändert, wenden Sie das Format an, nachdem der Handle verfügbar ist.

Langfristiger Wartungshinweis

Wenn ein Projekt keine Delphi-5-Unterstützung mehr benötigt, entfernen Sie den bedingten Zweig und behalten Sie die direkte Zuweisung der Format-Eigenschaft bei. Bis dahin sollte der Kompatibilitätscode nahe an der Control-Einrichtung bleiben, statt in fachfremder Geschäftslogik versteckt zu werden. So ist klar, dass der Workaround für eine VCL-Control-Einschränkung existiert, nicht für die Bestellberechnung selbst.