delphi – 需要控件和对象之间的双向LiveBindings

前端之家收集整理的这篇文章主要介绍了delphi – 需要控件和对象之间的双向LiveBindings前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Delphi XE2 LiveBindings中,我需要将任何类型的VCL控件绑定到任意(非组件)对象上的任何类型的属性。我可以单向做这个。但是我需要双向地做。

假设我想将一个TPerson.PersonName:string绑定到一个TEdit.Text。

现在我现在很简单

>创建一个新的VCL应用程序,添加一个TBindScope,TBindingsList,TEdit。
>创建名为person1的TPerson实例。
>使用BindingList,添加一个TBindExpression属性
>使用BindExpression
>
>将ControlComponent设置为Edit1

>
>将ControlExpression设置为’Text’

>
>将SourceComponent设置为BindScope1

>
将SourceExpression设置为PersonName

>添加按钮;到Click事件我添加:BindScope1.DataObject:= person1;
>添加按钮;到点击事件我添加(只有一个是必要的,但直到它的工作,我会尝试他们)。
>
TBindings.Notify(发件人,”);

>
> BindingsList1.Notify(sender,”);

第一个按钮在第一个方向上绑定。第二个按钮从来没有似乎将该值写回person1.PersonName属性

我已经尝试了通知代码,绑定方向,绑定类型,表达式,SourceMember等。有时我在bindexpression配置中遇到运行时错误,其余的时间绑定只是单向的。

我希望单击第二个按钮,并将Edit1.Text的内容写入person1.PersonName。

如果我必须从代​​码中完成所有这些,我会考虑它,这样的例子是受欢迎的,但是我真的想通过设计师来做到这一点。

请注意,我对两个控件之间的绑定不感兴趣。

也请注意,我已经下载并检查了LiveBinding示例项目,没有找到任何这样做。如果这是错误的,请具体指出它。我也读过DocWiki。它不包括双向绑定,除了使用DB LiveBinding控件。我没有使用DB LiveBinding控件,也没有使用DataSet。所以除非你可以向我解释为什么要使用它们,我不需要有关这些控件的任何信息。

解决方法

我现在有这个工作。我在设计师中做了这一切,但是将其转换成大多数代码,以便在SO上更好地分享它。

创建一个VCL表单项目。在表单上,​​删除这些表单上的每一个:

TBindScope
TBindingsList
TButton的
TButton的
TEDIT

将其中一个按钮重命名为btnLoad,而将其他按钮重命名为btnSave。

将此代码粘贴到您的窗体单元(假定它命名为Form1)。分配按钮的点击处理程序并运行它。单击btnLoad以使用TPerson对象数据填充编辑框,将编辑框中的文本编辑为新值,然后单击btnSave将其写回TPerson对象。

unit Form1;

interface

uses
  Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,System.Rtti,// LiveBinding units
  System.Bindings.Helper,// Contains TBindings class
  Data.Bind.EngExt,Vcl.Bind.DBEngExt,Data.Bind.Components,System.Bindings.Outputs;

type
  TPerson = class(TObject)
  protected
    fName: string;
    fAge: integer;
    procedure SetName(const Value: string);
  public
    property Name: string read fName write SetName;
    property Age: integer read fAge write fAge;
  end;

type
  TForm1 = class(TForm)
    btnLoad: TButton;
    btnSave: TButton;
    BindScope1: TBindScope;
    BindingsList1: TBindingsList;
    Edit1: TEdit;
    procedure btnLoadClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
  private
    fInitialized: boolean;
    fPerson: TPerson;
    procedure Initialize;
  public
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AfterConstruction;
begin
  inherited;
  Initialize;
end;

procedure TForm1.BeforeDestruction;
begin
  fPerson.Free;
  inherited;
end;

procedure TForm1.btnLoadClick(Sender: TObject);
begin
  fPerson.Name := 'Doogie Howser';
  fPerson.Age := 15;
  BindScope1.DataObject := fPerson;
end;

procedure TForm1.btnSaveClick(Sender: TObject);
begin
  TBindings.Notify(Edit1,'');

  // Could also do this:
  //BindingsList1.Notify(Edit1,'');
end;

procedure TForm1.Initialize;
var
  expression: TBindExpression;
begin
  // Create a binding expression.
  expression := TBindExpression.Create(self);
  expression.ControlComponent := Edit1;
  expression.ControlExpression := 'Text';   // The Text property of Edit1 ...
  expression.SourceComponent := BindScope1;
  expression.SourceExpression := 'Name';    // ... is bound to the Name property of fPerson
  expression.Direction := TExpressionDirection.dirBidirectional;

  // Add the expression to the bindings list.
  expression.BindingsList := BindingsList1;

  // Create a Person object.
  fPerson := TPerson.Create;
end;

{ TPerson }

procedure TPerson.SetName(const Value: string);
begin
  fName := Value;
  ShowMessage('Name changed to "'+ Value +'"');
end;

end.
原文链接:https://www.f2er.com/delphi/103354.html

猜你在找的Delphi相关文章