Poursuivant le billet de blog de la semaine dernière sur les expressions de liaison, voyons comment les composants peuvent participer, mais en créant des expressions qui font référence à des propriétés.
La semaine dernière, j’ai présenté le moteur d’expression Delphi RTL dans le billet de blog à l’ adresse https://blog.marcocantu.com/blog/2021-may-delphi-expression-engine.html . Faisons maintenant une étape supplémentaire. Je veux expliquer comment les composants et leurs propriétés peuvent faire partie de ces expressions. Dans ce cas, nous n’évaluons pas simplement une expression, mais voulons associer deux expressions distinctes dans une « liaison ».
Relier deux composants
Concrètement, supposons que vous ayez un formulaire avec un SpinEdit et une ProgressBar. Une liaison gérée vous permet de fournir une expression d’entrée (avec un ou plusieurs objets d’entrée) et une expression de sortie (à nouveau avec un ou plusieurs objets). Comme vous pouvez le voir dans le code ci-dessous, chaque objet est associé à l’expression fournissant un nom, comme spin1 pour le composant SpinEdit1, et l’expression peut faire référence à l’objet et à ses propriétés, comme dans spin1.Value . Il en va de même pour la sortie. Vous pouvez également spécifier un convertisseur de sortie, que j’ai omis ici :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
BindingExpression1 := TBindings.CreateManagedBinding( { inputs } [TBindings.CreateAssociationScope([ Associate(SpinEdit1, 'spin1') ])], 'spin1.Value', { outputs } [TBindings.CreateAssociationScope([ Associate(ProgressBar1, 'progress') ])], 'progress.Position', {OutputConverter} nil); |
Avec ce code de configuration, si vous appelez BindingExpression1.Evaluate, la valeur de SpinEdit sera copiée dans la ProgressBar. Vous pouvez effectuer le même appel pour actualiser la valeur, mais vous pouvez également faire abstraction du concept en indiquant à l’architecture des liaisons que la propriété value de l’édition spin a changé. Le système déterminera automatiquement s’il existe une ou plusieurs expressions impliquant la propriété et l’actualisera :
1 2 3 4 |
procedure TFormBindings.SpinEdit1Change(Sender: TObject); begin TBindings.Notify(Sender, 'Value'); end; |
Ce changement de perspective (une valeur a changé plutôt qu’une expression doit être recalculée) est d’une importance fondamentale, car il fait abstraction du modèle de données de l’interface utilisateur à laquelle il est associé. Nous y arriverons, mais permettez-moi de montrer d’abord l’interface utilisateur simple de l’application :
Liaison d’objets et de contrôles d’interface utilisateur
Ceci est mieux expliqué dans la deuxième partie de l’exemple, qui a une zone d’édition liée à un objet en mémoire. La classe TMyObject a une propriété Name et une propriété Value. Voici comment lier un objet à l’interface utilisateur :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
BindingExpressionObj := TBindings.CreateManagedBinding( { inputs } [TBindings.CreateAssociationScope([ Associate(MyObj, 'obj') ])], 'obj.Name', { outputs } [TBindings.CreateAssociationScope([ Associate(edName, 'edit') ])], 'edit.Text', {OutputConverter} nil); |
Dans ce code MyObj est un objet de la classe TMyObject. Sa propriété Name est associée au composant edName Text. Encore une fois, l’actualisation de l’expression met à jour la sortie. Mais l’objet ne doit avoir aucune connaissance des contrôles de l’interface utilisateur ou des liaisons d’interface utilisateur. En fait, tout ce que vous avez à faire pour instrumenter l’objet est d’informer le système que la valeur a changé :
1 2 3 4 5 |
procedure TMyObject.SetName(const Value: string); begin FName := Value; TBindings.Notify(self, 'Name'); end; |
Avec ce code, lorsque les données changent, l’interface utilisateur s’actualise automatiquement pour le refléter :
1 2 3 4 |
procedure TFormBindings.btnUpdateObjClick(Sender: TObject); begin myobj.Name := myobj.Name + 'Monkey'; end; |
Je ne sais pas à 100% comment vous souhaitez appeler les modèles implémentés avec des liaisons dans Delphi, mais cela offre certainement une séparation et une abstraction complètes du modèle de données avec la vue de l’interface utilisateur.
Il y a beaucoup plus à explorer
Ensuite, nous pouvons commencer à examiner comment vous pouvez travailler avec des liaisons bidirectionnelles et comment vous pouvez définir toute la logique ci-dessus à l’aide de concepteurs de composants spécifiques, réduisant ainsi le code requis. Il y a beaucoup de technologie derrière Visual Live Bindings, qui est la destination ultime potentielle et ce dont nous discutons souvent. Les Live Bindings sont sympas, mais la technologie de reliure de Delphi RTL est l’endroit où réside la puissance.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition