2011-09-08 31 views
10

¿Es posible hacer LiveBinding entre controles, es decir, tomar 2 cuadros de edición y obtener el resultado de agregar sus contenidos en una etiqueta. Estoy seguro de que es, sólo que no sé por dónde empezarDelphi XE2 y LiveBindings entre controles

Gracias

Respuesta

9

Echa un vistazo a las muestras. SVN URL del repositorio: https://radstudiodemos.svn.sourceforge.net/svnroot/radstudiodemos/branches/RadStudio_XE2/LiveBindings

Un ejemplo:

----- ----- Unit1.dfm

object Form1: TForm1 
    Left = 0 
    Top = 0 
    Caption = 'Form1' 
    ClientHeight = 286 
    ClientWidth = 426 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Label1: TLabel 
    Left = 8 
    Top = 62 
    Width = 48 
    Height = 13 
    Caption = 'Edit1Edit2' 
    end 
    object Edit1: TEdit 
    Left = 8 
    Top = 8 
    Width = 121 
    Height = 21 
    TabOrder = 0 
    Text = 'Edit1' 
    OnChange = EditChange 
    end 
    object Edit2: TEdit 
    Left = 8 
    Top = 35 
    Width = 121 
    Height = 21 
    TabOrder = 1 
    Text = 'Edit2' 
    OnChange = EditChange 
    end 
    object BindingsList1: TBindingsList 
    Methods = <> 
    OutputConverters = <> 
    UseAppManager = True 
    Left = 20 
    Top = 5 
    object BindExpressionLabel11: TBindExpression 
     Category = 'Binding Expressions' 
     ControlComponent = Label1 
     SourceComponent = BindScope1 
     SourceExpression = 'Edit1.Text + Edit2.Text' 
     ControlExpression = 'Caption' 
     NotifyOutputs = False 
     Direction = dirSourceToControl 
    end 
    end 
    object BindScope1: TBindScope 
    Left = 192 
    Top = 16 
    end 
end 

----- ----- Unit1.pas

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.Bind.EngExt, Vcl.Bind.DBEngExt, 
    System.Rtti, System.Bindings.Outputs, Vcl.Bind.Editors, Data.Bind.Components, 
    Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Label1: TLabel; 
    BindingsList1: TBindingsList; 
    BindExpressionLabel11: TBindExpression; 
    BindScope1: TBindScope; 
    procedure EditChange(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses 
    System.Bindings.Helper; 

procedure TForm1.EditChange(Sender: TObject); 
begin 
    TBindings.Notify(Sender, 'Text'); 
end; 

end. 

Cómo utilizar el diseñador IDE para producir el resultado:

  • ponga dos ediciones (Edit1, Edit2), una etiqueta (Label1) y un TBindScope (BindScope1) en su formulario (Form1).
  • crea un controlador de eventos para el evento OnChange de ambas ediciones (EditChange).
  • seleccione Label1, expanda el desplegable de la propiedad LiveBindings, seleccione 'Encuadernación Nueva vivo ...', seleccione TBindExpression
  • propiedades de edición de la BindExpressionLabel11 recién creado: asignar título a ControlExpression, BindScope1 a SourceComponent, Edit1.Text + Edit2.Text to SourceExpression
+2

Eso se ve bastante impresionante. ¿Cómo se compila, evalúa o evalúa 'SourceExpression = 'Edit1.Text + Edit2.Text''? –

+3

@David: hay todo un motor de evaluación de expresiones en tiempo de ejecución (extensible) involucrado. –

+0

¡ooh eso suena emocionante! –

4

El proyecto de ejemplo en el (por defecto) la ubicación de:

C:\Users\Public\Documents\RAD Studio\9.0\Samples\Delphi\LiveBinding\Components\bindexpression\fmx\BindExpressionSampleProject.dproj 

hace precisamente eso.

+0

No exactamente, muestra un enlace simple entre una fuente y un componente de control. Para obtener dos componentes fuente distintos involucrados en una sola expresión, creo que necesita el componente TBindScope para resolver las referencias Edit1 y Edit2. También puede asignar Form1 a SourceComponent pero eso está usando la variable global Form1 con todas las consecuencias. –

+0

Tenga en cuenta que estas demostraciones (las de LiveBindings) solo están disponibles a través de la instalación de ESD. La imagen ISO no los contiene; tiene que ir al enlace TOndrej proporcionado en su respuesta si instaló desde el ISO. –

+0

@KenWhite - Las demostraciones también se pueden descargar a través del enlace de Subversion: http://sourceforge.net/projects/radstudiodemos/ –

-1

No necesita TBindScope para enlazar componentes. Supongamos que tiene edit1 y edit2 en el formulario. Si configura edit2 BindingSource para editar1, se vinculará a los cambios para editar1

+0

Preguntaba acerca de agregar las propiedades de 2 componentes juntos. Su respuesta parece ser la asignación de la propiedad de un componente a otro. – chuacw

Cuestiones relacionadas