Comment vérifier si la chaîne est un DateTime valide chaîne de Format dans Delphi
Je veux utilisateur d'être en mesure de saisir manuellement le format de la les champs datetime dans le programme. J'ai composant Tedit. Par exemple, si l'utilisateur entre les 'HH:nn', alors c'est un datetime valide chaîne de format et de tous datetime composants de changement de propriété format, mais s'il entre dans 'tsa", il ne l'est pas. Est-il un moyen rapide de vérifier cela, sans avoir à écrire de ma propre fonction?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser les fonctions:
Ils essaient de convertir une chaîne de caractères à une date/heure et si la conversion réussit, elle renvoie la valeur true. Donc, il n'y a pas d'exceptions soulevées.
Vous pouvez utiliser l'option TFormatSettings paramètre pour définir votre propre format.
Toutes les fonctions sont définies dans SysUtils.
Mais il y a une certaine date/heure de contrôles disponibles dans la VCL comme TDateTimePicker et TMonthCalendar. Vous pouvez les utiliser aussi.
Le problème est de savoir comment vous définir un format valide'? Probablement, le meilleur que vous pourriez faire est de rechercher l'existence de certaines lettres dans la chaîne de format. Mais que faire si l'utilisateur ne se soucie pas de voir de l'année, ou ne veut pas voir le temps?
Je ne serais pas trop stresser à propos de la vérification qu'ils sont entrés dans un "format valide'. Plutôt juste de leur donner un aperçu du format qu'ils ont saisies à l'aide de la date-heure actuelle.
Modifier: mise à Jour pour de nouvelles infos de l'OP
Il y avait un peu de précisions sur la question:
C'est une précision importante, peut-être que vous souhaitez inclure dans votre question?
La chose importante est que la chaîne de format ne sera pas seulement d'indiquer le Format d'Affichage, mais également la modification de format. Aujourd'hui, bien qu'assez beaucoup n'importe quelle chaîne est valide, toutes ne sont pas particulièrement utiles (surtout pour l'édition). E. g.:
Ce qui est parfaitement valable dans le sens que votre date peut être formaté en conséquence. Cependant, il n'est pas particulièrement utile pour régler le mois.
Maintenant, à mon humble avis, si un utilisateur veut faire de leur rendre la vie difficile en n'incluant pas les mois les champs dans leur chaîne de format robuste! Le problème vient que les règles de formatage sont un peu techniques, et un utilisateur peut obtenir des mois et des minutes mélangés. E. g.
FTimeFormat := 'HH:MM:SS'
qui est en fait <heures>:<mois>:<les secondes>Même si, je maintiens ma proposition initiale (avec un petit tweak): Plutôt juste de leur donner un aperçu du format qu'ils ont saisies à l'aide de
la date-heure actuelleune date déterminée-temps qui devrait mettre l'accent sur ces "erreurs" dans la chaîne de format.En supposant que vous avez une configuration de boîte de dialogue dans laquelle vous avez l'intention de laisser à l'utilisateur de définir ce paramètre:
Le code suivant devrait faire l'affaire:
AVERTISSEMENT
Vous avez mentionné que vous souhaitez utiliser pour les deux
TDateTimeField
etTDateTimePicker
. Malheureusement,TDateTimePicker
encapsule simplement un Windows intégré de Contrôle qui n'utilise pas de FormatDateTime, et donc a des règles différentes pour ses chaînes de format.Donc, je crains que vous aurez à permettre aux utilisateurs de configurer deux chaînes de format. 🙁
De s'étendre sur les Gamecat la réponse de
Si vous voulez juste pour vérifier la configuration de l'MyDateTimeVar variable à transmettre à tryStrToDateTimeVar vous pouvez simplement utiliser la gestion des exceptions
Doug et Gamecat, je crois que vous êtes à la fois l'incompréhension de la question.
DisplayDate := FormatDateTime(UserDefinedFormat, Now());
La seule chose qui StrToDateTime (ou TryStrToDateTime) pourrait être utilisé pour tentative une circulaire de "cohérence check". Mais ce serait pas bon, car il n'y a aucune garantie que l'utilisateur veut voir tous les éléments de la date/de l'heure. Par conséquent, la circulaire de la vérification ne peut pas travailler!