Continuando con la publicación del blog de la semana pasada sobre expresiones vinculantes, veamos cómo pueden participar los componentes, pero creando expresiones que se refieren a propiedades.
La semana pasada presenté el motor de expresión Delphi RTL en la publicación del blog en https://blog.marcocantu.com/blog/2021-may-delphi-expression-engine.html . Ahora demos un paso adicional. Quiero explicar cómo los componentes y sus propiedades pueden ser parte de estas expresiones. En este caso, no solo evaluamos una expresión, sino que queremos asociar dos expresiones separadas en un “enlace”.
Unión de dos componentes
En términos prácticos, suponga que tiene un formulario con SpinEdit y ProgressBar. Un enlace administrado le permite proporcionar una expresión de entrada (con uno o más objetos de entrada) y una expresión de salida (nuevamente con uno o más objetos). Como puede ver en el código siguiente, cada objeto está asociado a la expresión que proporciona un nombre, como spin1 para el componente SpinEdit1, y la expresión puede hacer referencia al objeto y sus propiedades, como en spin1.Value . Lo mismo ocurre con la salida. También puede especificar un convertidor de salida, que he omitido aquí:
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); |
Con este código de configuración, si llama a BindingExpression1.Evaluate, el valor de SpinEdit se copiará en ProgressBar. Puede realizar la misma llamada para actualizar el valor, pero también puede abstraer el concepto indicando a la arquitectura de enlaces que la propiedad del valor de la edición de giro ha cambiado. El sistema determinará automáticamente si hay una o más expresiones que involucren la propiedad y la actualizará:
1 2 3 4 |
procedure TFormBindings.SpinEdit1Change(Sender: TObject); begin TBindings.Notify(Sender, 'Value'); end; |
Este cambio de perspectiva (un valor ha cambiado en lugar de que sea necesario volver a calcular una expresión) es de fundamental importancia, ya que abstrae completamente el modelo de datos de la interfaz de usuario a la que está asociado. Llegaremos a eso, pero primero déjame mostrarte la interfaz de usuario simple de la aplicación:
Vinculación de objetos y controles de la interfaz de usuario
Esto se explica mejor en la segunda parte del ejemplo, que tiene un cuadro de edición vinculado a un objeto en la memoria. La clase TMyObject tiene una propiedad Name y Value. Así es como puede vincular un objeto a la interfaz de usuario:
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); |
En este código, MyObj es un objeto de la clase TMyObject. Su propiedad Name está asociada con el componente Text de edName. Nuevamente, al actualizar la expresión, se actualiza la salida. Pero el objeto no debe tener conocimiento de los controles de la interfaz de usuario o los enlaces de la interfaz de usuario. De hecho, todo lo que necesita hacer para instrumentar el objeto es notificar al sistema que el valor ha cambiado:
1 2 3 4 5 |
procedure TMyObject.SetName(const Value: string); begin FName := Value; TBindings.Notify(self, 'Name'); end; |
Con este código, cuando los datos cambian, la interfaz de usuario se actualiza automáticamente para reflejarlo:
1 2 3 4 |
procedure TFormBindings.btnUpdateObjClick(Sender: TObject); begin myobj.Name := myobj.Name + 'Monkey'; end; |
No estoy 100% seguro de cómo quiere llamar a los patrones implementados con enlaces en Delphi, pero ciertamente ofrece una separación y abstracción completa del modelo de datos con la vista de la interfaz de usuario.
Hay mucho más por explorar
A continuación, podemos comenzar a ver cómo puede trabajar con enlaces bidireccionales y cómo puede definir toda la lógica anterior utilizando diseñadores de componentes específicos, reduciendo el código requerido. Hay mucha tecnología detrás de Visual Live Bindings, que es el destino final potencial y lo que a menudo discutimos. Las vinculaciones en vivo son agradables, pero la tecnología de vinculación en Delphi RTL es donde vive el poder.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition