Voir le flux RSS

Blog de Serge Girard (aka SergioMaster)

LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ?

Noter ce billet
par , 05/10/2019 à 11h20 (196 Affichages)
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.

Nom : Conception_1.PNG
Affichages : 35
Taille : 41,8 Ko

L'objectif est donc de lier les deux zones de saisies à la même colonne.
Nom : Liaisons.PNG
Affichages : 23
Taille : 9,6 Ko
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
Citation 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
  1. Double click sur le composant TBindingsList.
  2. Ajout d'une nouvelle liaison (touche [Inser]).
  3. Choisir TBindLink.
  4. Double clic sur le lien créé.
  5. 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.
Nom : ScopeMappings.PNG
Affichages : 22
Taille : 20,6 Ko
Voilà un nouveau cas d'utilisation de ces ScopeMappings après celui déjà présenté ici.

Il faut rédiger les expressions suivantes
Nom : lien_date.PNG
Affichages : 22
Taille : 29,9 Ko
Nom : lien_time.PNG
Affichages : 22
Taille : 30,5 Ko
ce qui se traduit dans le fichier FMX par
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 
   object BindSourceDB1: TBindSourceDB
    DataSet = FDMemTable1
    ScopeMappings = <
      item
        Name = 'EdtHeure'
        ValComponent = TimeEdit1
      end
      item
        Name = 'EdtDate'
        ValComponent = DateEdit1
      end>
    Left = 160
    Top = 224
  end
  object BindingsList1: TBindingsList
    Methods = <>
    OutputConverters = <>
    Left = 260
    Top = 21
    object BindLinkDate: TBindLink
      Category = 'Liens'
      SourceMemberName = 'TimeStampTest'
      ControlComponent = DateEdit1
      SourceComponent = BindSourceDB1
      ParseExpressions = <
        item
          ControlExpression = 'Date'
          SourceExpression = 'Dataset.edtTime.Date'
        end
        item
          ControlExpression = 'DateTime'
          SourceExpression = 'Text'
        end>
      FormatExpressions = <
        item
          ControlExpression = 'DateTime'
          SourceExpression = 'Text'
        end>
      ClearExpressions = <>
      Track = False
    end
    object BindLinkTime: TBindLink
      Category = 'Liens'
      SourceMemberName = 'TimeStampTest'
      ControlComponent = TimeEdit1
      SourceComponent = BindSourceDB1
      ParseExpressions = <
        item
          ControlExpression = 'DateTime'
          SourceExpression = 'Text'
        end
        item
          ControlExpression = 'Time'
          SourceExpression = 'Dataset.edtDate.Time'
        end>
      FormatExpressions = <
        item
          ControlExpression = 'DateTime'
          SourceExpression = 'Text'
        end>
      ClearExpressions = <>
      Track = False
    end
    object LinkListControlToField1: TLinkListControlToField
      Category = 'Liaisons rapides'
      DataSource = BindSourceDB1
      FieldName = 'TimeStampTest'
      Control = ListView1
      FillExpressions = <>
      FillHeaderExpressions = <>
      FillBreakGroups = <>
    end
  end

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.
Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
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;

en pièce jointe le source du programme test
Miniatures attachées Fichiers attachés

Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog Viadeo Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog Twitter Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog Google Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog Facebook Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog Digg Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog Delicious Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog MySpace Envoyer le billet « LiveBindings et TimeStamp : comment établir une liaison avec les zones d'édition ? » dans le blog Yahoo

Mis à jour 05/10/2019 à 11h42 par SergioMaster

Catégories
Delphi , FMX

Commentaires