20

Delphi XE2 LiveBinding では、任意のタイプの VCL コントロールを任意の(非コンポーネント)オブジェクトの任意のタイプのプロパティにバインドする必要があります。私はこれを一方向に行うことができます。しかし、双方向で行う必要があります。

TPerson.PersonName: 文字列を TEdit.Text にバインドするとします。

私が今持っているものはシンプルです。

  • 新しい VCL アプリケーションを作成し、TBindScope、TBindingsList、TEdit を追加します。
  • person1 という名前の TPerson のインスタンスを作成します。
  • BindingList を使用して、TBindExpression プロパティを追加します。
  • BindExpression を使用
    • ControlComponent を Edit1 に設定します
    • ControlExpression を「テキスト」に設定します
    • SourceComponent を BindScope1 に設定します
    • SourceExpression を PersonName に設定します
  • ボタンを追加します。追加する Click イベントに: BindScope1.DataObject := person1;
  • ボタンを追加します。追加する Click イベントに追加します (必要なのは 1 つだけですが、動作するまで両方を試します)。
    • TBindings.Notify(送信者, '');
    • BindingsList1.Notify(送信者, '');

最初のボタンは最初の方向にバインドします。2 番目のボタンは、値を person1.PersonName プロパティに書き戻すことはないようです。

通知コード、バインディングの方向、バインディングの種類、式、SourceMember などを試してみました。bindexpression の構成で実行時エラーが発生することがありますが、それ以外の場合はバインディングが単方向です。

2 番目のボタンをクリックすると、Edit1.Text の内容が person1.PersonName に書き込まれることを期待しています。

これ全部コードでやるなら検討しますし、そういう例は大歓迎ですが、できればデザイナでやりたいです。

2 つのコントロール間のバインディングには関心がないことに注意してください。

私はすでに LiveBinding サンプル プロジェクトをダウンロードして調査しましたが、これを行うものは見つかりませんでした。これが間違っている場合は、具体的に指摘してください。DocWiki も読みました。DB LiveBinding コントロールを使用する場合を除いて、双方向バインディングは対象外です。DB LiveBinding コントロールも DataSet も使用していません。したがって、なぜそれらを使用する必要があるかを説明していただけない限り、それらのコントロールに関する情報は必要ありません。

4

1 に答える 1

16

私は今これを機能させました。私はすべてデザイナーで行いましたが、SO で共有するためにほとんどコードに変換しました。

VCL フォーム プロジェクトを作成します。フォーム上で、これらをそれぞれフォームにドロップします。

TBindScope TBindingsList TButton TButton TEdit

ボタンの 1 つを btnLoad に、もう 1 つを 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.
于 2011-09-21T22:13:02.390 に答える