Jusqu'à présent je n'avais jamais été confronté à ce type de données, du moins en modification.
Pourtant nous pourrions en avoir besoin par exemple pour une application de gestion de rendez-vous
Comment faire alors pour éditer ce type de donnée alors que nous n'avons que les contrôles TDateEdit et TTimeEdit?
Cette question, posée à la communauté Idera , m'a suffisamment titillée pour que je m'y penche.
Bien sûr, une des solutions consiste à, en quelque sorte, botter en touche en utilisant un simple TEdit ou même TTimeEdit en utilisant sa propriété Format. Toutefois l'on y perd l'avantage de l'utilisation des sélecteurs de date ou d'heure sans parler du fait qu'il faudra contrôler la saisie.
Franchement, cette première solution laisse quand même un arrière goût amer, il est possible de faire mieux au prix de quelques liaisons manuelles.
Pour les besoins de la démonstration je vais utiliser une simple table en mémoire ne contenant qu'une seule colonne de type ftTimeStamp.
L'interface utilisateur est simple :
Un TListView me permettra d'afficher les données afin de les contrôler;
Un TDBNavigator permettra entre-autres de valider les saisies;
Deux zones de saisies, un TDateEdit et un TTimeEdit.
L'objectif est donc de lier les deux zones de saisies à la même colonne.
Seulement ce n'est pas si simple. En mode rapide, c'est-à-dire en utilisant le concepteur de liaison visuelle, s'il est très facile de lier la zone de saisie de date à la seule zone proposée (SelectedDateTime(Self)) il n'en va pas de même pour la zone de saisie de temps, toute tentative lève une erreur
Envoyé par Erreur
EvalError dans : 04/10/2019 18:00:00 Invalid Time.
En recherchant les membres pouvant être liés (clic sur le bouton [...]) on trouve Date, DateTime, Time (encadré jaune sur l'image précédente), malheureusement ces membres ne sont pas bidirectionnels. La solution est donc ailleurs (l'astérisque) et passe par des liaisons manuelles.
Il va falloir établir un nouveau lien (BindLink) pour chacune des deux zones de saisie et renseigner les différentes expressions mais aussi pouvoir établir un lien entre ceux-ci.
Procédure pour établir un lien
Double click sur le composant TBindingsList.
Ajout d'une nouvelle liaison (touche [Inser]).
Choisir TBindLink.
Double clic sur le lien créé.
Ajouter des expressions (formater et analyser).
Pour rappel
Une expression 'Formater' se fait dans le sens : donnée vers contrôle alors que l'expression 'Analyser' est l'inverse : contenu du contrôle vers donnée.
Il est possible d'ajouter plus d'une expression.
C'est dernier point de cette liste qui va nous permettre d'accéder aux propriétés en lecture que sont Date, Time et DateTime. Mais il reste encore un problème à résoudre qui est, justement, d'atteindre ces contrôles au sein d'une expression.
C'est là qu'intervient une autre notion, celle de ScopeMappings de la source de données.
Voilà un nouveau cas d'utilisation de ces ScopeMappings après celui déjà présenté ici.
Enfin, une dernière petite touche de code sera nécessaire, l'utilisation du sélecteur de date à la fâcheuse "manie" de remettre l'heure à zéro, je vais utiliser l'évènement OnClosePicker pour y pallier.
procedure TMainForm.DateEdit1ClosePicker(Sender: TObject);
begin// changer la Date via le Picker remet Time à 0:00// on doit donc ré-initialiser Time avec la valeur de TimeEdit
DateEdit1.Time:=TimeEdit1.Time;
end;
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité,
merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.