作成したオブジェクトをプログラムでバインドする

提供: RAD Studio
移動先: 案内検索

チュートリアル:LiveBinding をプログラムで使用する への移動


注意: ここで説明しているプログラム的手法は、バインディング式を実装する標準的な方法ではありません。通常は、設計時に[オブジェクト インスペクタ](標準的な手法)を使用します。バインディング式をプログラムで作成する必要はないでしょう。ただし、そのような式を手動で作成することも可能であり、このチュートリアルではそれを例を用いて示します。


標準的な方法での LiveBinding の使用例については、以下を参照してください。

次に、バインディング部分については、オブジェクトを互いにバインドする方法とバインドしたプロパティをどう操作するかを LiveBinding エンジンに指示するバインディング式を作成する必要があります。

次のコード断片では、入力オブジェクト(MyObject1 および MyObject2)の 2 つのプロパティを出力オブジェクト(MyResultObject)にバインドする方法を示しています。この構文は少し長めなので、コード断片の後で説明します。

Delphi の場合:

var
  BindingExpression1: TBindingExpression;
  BindingExpression2: TBindingExpression;

begin
  { 与えられたオブジェクトの 2 つの Integer 型プロパティをバインドするバインディング式 }
  BindingExpression1 := TBindings.CreateManagedBinding(
    { 入力 }
    [TBindings.CreateAssociationScope([
      Associate(MyObject1, 'o1'),
      Associate(MyObject2, 'o2')
      ])],
    'o1.IntegerValue + o2.IntegerValue',
    { 出力 }
    [TBindings.CreateAssociationScope([
      Associate(MyResultObject, 'res')
      ])],
    'res.IntegerValue',
    nil);

  { 与えられたオブジェクトの 2 つの String 型プロパティをバインドするバインディング式 }
  BindingExpression2 := TBindings.CreateManagedBinding(
    { 入力 }
    [TBindings.CreateAssociationScope([
      Associate(MyObject1, 'o1'),
      Associate(MyObject2, 'o2')
      ])],
    'o1.StringValue + o2.StringValue',
    { 出力 }
    [TBindings.CreateAssociationScope([
      Associate(MyResultObject, 'res')
      ])],
    'res.StringValue',
    nil);
end;

C++ の場合:

TBindingExpression *BindingExpression1, *BindingExpression2;

OpenArray<_di_IScope>InputScopes
        (TBindings::CreateAssociationScope
        (OPENARRAY(TBindingAssociation, (Associate(MyObject1, "o1"),
        Associate(MyObject2, "o2")))));
OpenArray<_di_IScope>OutputScopes
        (TBindings::CreateAssociationScope
        (OPENARRAY(TBindingAssociation, (Associate(MyResultObject,
        "res")))));

BindingExpression1 = TBindings::CreateManagedBinding(InputScopes,
        InputScopes.GetHigh(), "o1.IntegerValue + o2.IntegerValue",
        OutputScopes, OutputScopes.GetHigh(), "res.IntegerValue", NULL);

BindingExpression2 = TBindings::CreateManagedBinding(InputScopes,
        InputScopes.GetHigh(), "o1.StringValue + o2.StringValue",
        OutputScopes, OutputScopes.GetHigh(), "res.StringValue", NULL);

上記の構文は、マネージ バインディング式の作成に使用されます。マネージ バインディング式の詳細については、該当する API リファレンス トピックである「System.Bindings.Helper.TBindings.CreateManagedBinding」を参照してください。上記のコード断片では、2 番目の CreateManagedBinding オーバーロード メソッドを使用してマネージ バインディング式を作成しました。

上記 2 つのバインディング式の一方は IntegerValue に作用し、もう一方は StringValue に作用しますが、両者の構文は似ているため、最初のバインディング式の構文についてのみ以下で説明します。

入力スコープ(RealObjectScriptObject)の配列が以下のように定義されています。

Delphi の場合:

[TBindings.CreateAssociationScope([
      Associate(MyObject1, 'o1'),
      Associate(MyObject2, 'o2')
      ])]

C++ の場合:

OpenArray<_di_IScope>InputScopes
        (TBindings::CreateAssociationScope
        (OPENARRAY(TBindingAssociation, (Associate(MyObject1, "o1"),
        Associate(MyObject2, "o2")))));

入力スコープのバインディング式は、2 つのオブジェクトにある 2 つの Integer 型プロパティの単純な加算になります。

Delphi の場合:

'o1.IntegerValue + o2.IntegerValue'

C++ の場合:

"o1.IntegerValue + o2.IntegerValue"

BindingExpression1 の構文を調べてみると、出力スコープの配列と出力スコープのバインディング式は上記のものと似てはいるものの、結果オブジェクト(MyResultObject)に作用していることがわかります。

バインディング式が評価されコンパイルされ、その結果使用されるためには、通知コマンドを発行する必要があります。オブジェクトのプロパティで指定された値が変化すると、バインディング エンジンにそのことを通知する必要があります。それには、以下のようにコーディングします。

Delphi の場合:

{ MyObject1 の IntegerValue または StringValue が変化した場合は、次のコードを使用する }
TBindings.Notify(MyObject1, 'IntegerValue');
TBindings.Notify(MyObject1, 'StringValue');

{ MyObject2 の IntegerValue または StringValue が変化した場合は、次のコードを使用する }
TBindings.Notify(MyObject2, 'IntegerValue');
TBindings.Notify(MyObject2, 'StringValue');

{ あるいは、変化する値に応じて、上記 2 つの他の任意の組み合わせを使用する }

C++ の場合:

// MyObject1 の IntegerValue または StringValue が変化した場合は、次のコードを使用する
TBindings::Notify(MyObject1, "IntegerValue");
TBindings::Notify(MyObject1, "StringValue");

// MyObject2 の IntegerValue または StringValue が変化した場合は、次のコードを使用する
TBindings::Notify(MyObject2, "IntegerValue");
TBindings::Notify(MyObject2, "StringValue");

// あるいは、変化する値に応じて、上記 2 つの他の任意の組み合わせを使用する

次のトピック

前のトピック