Article technique

Définir le format de TDateTimePicker dans Delphi 5

· Programmation Delphi

Lors de l’ajout de la compatibilité Delphi 5 à un ancien exemple VCL, le projet a échoué sur une ligne parfaitement normale dans les versions Delphi plus récentes. Le code essayait d’affecter un modèle de date personnalisé directement à la propriété TDateTimePicker.Format.

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

TDateTimePicker est un wrapper VCL autour du contrôle commun Windows. Les versions Delphi récentes exposent une propriété pratique Format, mais Delphi 5 ne le fait pas. Dans Delphi 5 et les versions antérieures, le contrôle suit normalement les paramètres régionaux de date de Windows, sauf si le message du contrôle commun sous-jacent est envoyé directement.

Utiliser l’API du contrôle commun pour Delphi 5

La correction de compatibilité consiste à appeler DateTime_SetFormat depuis l’unité CommCtrl pour Delphi 5, tout en conservant l’affectation directe de propriété pour les compilateurs récents. Ajoutez CommCtrl à la clause uses lors de la compilation de la branche Delphi 5.

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

Notes pratiques

La chaîne de format utilise la syntaxe du date-time picker Windows, pas tous les tokens de formatage Delphi. Gardez le modèle simple et testez-le sur une machine avec des paramètres régionaux différents si l’application sera déployée à l’international.

Si vous maintenez du code d’exemple partagé entre Delphi 5, Delphi 6 et les versions modernes de Delphi, isolez cette branche derrière un symbole de compilateur comme D5. Le code moderne reste lisible tout en documentant l’ancien contournement du contrôle commun.

Liste de compatibilité

  • Ajoutez CommCtrl seulement là où la branche Delphi 5 a besoin de DateTime_SetFormat.
  • Passez le handle du picker, pas celui du formulaire.
  • Gardez la chaîne de format vivante pendant l’appel en passant un littéral de chaîne normal ou une variable stable.
  • Vérifiez la date affichée dans la locale Windows cible.

Pourquoi ShortDateFormat ne suffit pas

Modifier les variables globales de format de date de Delphi ne change pas de façon fiable un date-time picker appuyé sur le contrôle commun Windows. Le picker s’affiche selon les paramètres du contrôle et les messages qu’il reçoit. C’est pourquoi DateTime_SetFormat est la bonne couche de compatibilité pour Delphi 5.

Cette distinction compte dans les anciens projets d’exemples, car ils sont souvent compilés avec plusieurs versions de Delphi. Une ligne propre dans Delphi 7 ou Delphi 2009 peut ne pas exister dans Delphi 5, tandis qu’un message de contrôle commun Windows peut encore être disponible. La compilation conditionnelle permet à chaque compilateur d’utiliser le chemin le plus naturel.

Tester la compatibilité ancienne version

Après le contournement, testez à la fois la valeur affichée et la valeur enregistrée. Le format affecte ce que voit l’utilisateur; il ne doit pas changer la valeur TDateTime sous-jacente utilisée par les calculs. Cette séparation est importante dans les bons de commande, factures et exports tableur où le format d’affichage et les valeurs numériques de date doivent rester cohérents.

Vérifiez aussi le formulaire après recréation du handle de fenêtre. Certains contrôles VCL peuvent perdre leur état natif si le handle est détruit puis recréé. Si votre application change les styles ou les parents à l’exécution, appliquez le format après disponibilité du handle.

Note de maintenance à long terme

Lorsqu’un projet n’a plus besoin de Delphi 5, supprimez la branche conditionnelle et gardez l’affectation directe de la propriété Format. D’ici là, gardez le code de compatibilité près de la configuration du contrôle plutôt que de le cacher dans une logique métier sans rapport. Il est ainsi clair que le contournement existe pour une limitation du contrôle VCL, pas pour le calcul du bon de commande lui-même.