Article technique

Format de TDateTimePicker dans Delphi 5 : DateTime_SetFormat

TALWebRTC enveloppe la pile WebRTC pour l'audio et la vidéo de pair à pair. Nul besoin de navigateur ou de plug-in, les connexions traversent les NAT grâce à la négociation standard ICE/STUN/TURN gérée par la bibliothèque sous-jacente

Le contrôle sous-jacent est le contrôle commun Windows DATETIMEPICK_CLASS dans comctl32.dll, qui accepte toujours une chaîne de format via le message DTM_SETFORMAT. La VCL de Delphi, dans ses versions plus récentes, encapsule ce message dans la propriété Format. Sous Delphi 5, vous devez envoyer le message vous-même via l'encapsulateur de macro DateTime_SetFormat déclaré dans CommCtrl

Mode de compilation conditionnelle

La méthode standard repose sur des blocs conditionnels du compilateur basés sur les symboles de version. Delphi 5 définit VER130 ; vous pouvez le tester directement ou définir votre propre symbole D5 dans les options du projet pour rendre les étiquettes de branche plus lisibles dans la base de code. Quoi qu'il en soit, la branche Delphi 5 appelle DateTime_SetFormat avec le handle du contrôle ; les autres branches affectent directement la propriété :

{$IFDEF D5}
  DateTime_SetFormat(DateTimePicker1.Handle, PChar('MM/dd/yyyy'));
{$ELSE}
  DateTimePicker1.Format := 'MM/dd/yyyy';
{$ENDIF}

Ajoutez CommCtrl à la clause uses des unités contenant la branche Delphi 5. Il n'est pas nécessaire de l'ajouter inconditionnellement ; si vous souhaitez limiter la portée de la dépendance, vous pouvez envelopper l'entrée de uses avec la même condition :

uses
  ...,
{$IFDEF D5}
  CommCtrl,
{$ENDIF}
  ...;

Syntaxe de la chaîne de format

Ce composant TPdfView est un visualiseur PDF complet pour Delphi, encapsulant le moteur PDFium pour offrir un rendu de haute qualité avec des performances fluides

En comparaison, le de>FormatDateTime de Delphi utilise d/dd/ddd/dddd pour les formats de date, avec une sémantique différente, et utilise m pour le mois (au lieu de M). Si vous copiez directement la chaîne de format d'un appel FormatDateTime vers DateTime_SetFormat, les champs des mois et des minutes en sortie risquent d'être intervertis. Rédigez les chaînes de format du contrôle à partir de zéro pour les documents Windows, plutôt que de les convertir à partir du format Delphi

Paramètres régionaux et ShortDateFormat global

Modifier la variable globale ShortDateFormat de Delphi n'affecte pas un TDateTimePicker déjà créé. Le sélecteur lit les paramètres régionaux de Windows lors de sa création et effectue le rendu en fonction des messages qu'il reçoit par la suite, et non des variables globales de la RTL Delphi. Cela signifie que configurer ShortDateFormat dans FormCreate ne modifiera pas l'affichage du contrôle. Vous devez utiliser DateTime_SetFormat (ou la propriété Format sur les versions récentes de Delphi) pour remplacer la chaîne de format du contrôle une fois le handle existant

Pour les applications déployées à l'international, testez les chaînes de format sur des machines ayant des paramètres régionaux non américains. Windows peut remplacer une chaîne de format vide ou nil par les valeurs par défaut de la région, mais une chaîne officielle non nil remplace entièrement les paramètres régionaux. C'est généralement ce que vous souhaitez, mais cela signifie qu'un modèle centré sur les États-Unis comme 'MM/dd/yyyy' s'affichera tel quel pour les utilisateurs habitués à dd/MM/yyyy. Si le sélecteur de date est destiné à l'utilisateur et n'est pas un simple champ de saisie de données, envisagez de laisser le contrôle utiliser la valeur par défaut (en passant nil à DateTime_SetFormat) afin qu'il suive automatiquement les paramètres régionaux de l'utilisateur

Reconstruction de descripteur

La configuration du format appartient au handle de la fenêtre, et non à un champ d'objet VCL. Si le handle du contrôle est détruit et reconstruit (ce que la VCL peut faire lorsque vous changez le parent du contrôle ou modifiez certaines propriétés de style au runtime), le format revient aux valeurs par défaut de Windows. L'emplacement sûr pour appliquer DateTime_SetFormat est le gestionnaire s'exécutant après la création du handle : remplacez CreateWnd dans les classes descendantes et appelez-y la fonction, ou appliquez-la dans l'événement OnEnter ou OnShow après avoir confirmé que le handle est actif. Pour les formulaires simples, le configurer une fois dans FormCreate suffit généralement, mais cela s'avère peu fiable si le formulaire effectue des changements de style dynamiques ou des changements de parents de contrôles

La même contrainte s'applique à la propriété Format de la VCL sur les versions plus récentes de Delphi ; elle appelle la même clé de message Windows en interne et fait face aux mêmes problèmes de cycle de vie du handle. La différence est que le configurateur de propriété VCL vérifie si le handle est alloué avant l'appel et réapplique automatiquement le format lors de CreateWnd. L'appel d'origine DateTime_SetFormat ne dispose pas d'une telle protection, de sorte que la branche Delphi 5 nécessite une sélection plus prudente du moment d'exécution

Supprimer la solution de contournement

Lorsque le projet ne prend plus en charge Delphi 5, les blocs conditionnels deviennent un fardeau. Supprimez la branche {$IFDEF D5} et l'importation limitée de CommCtrl, en ne conservant que l'affectation directe de la propriété Format. Réalisez cette suppression dans un commit dédié pour faciliter l'identification en cas de problème inattendu sur un compilateur non testé. La chaîne de format elle-même reste inchangée ; seul le mécanisme de transmission est modifié