LoginSignup
0
0

More than 5 years have passed since last update.

LiveBindingのカスタムコンポーネント作る際に利用したインターフェースたち

Posted at

コレクションをバインドする際、標準のコンポーネントでは遅すぎて使い物にならなかったため、TBidingEditorとTBindSourceAdapterをカスタマイズ。

その際に使用したインターフェースのメモ。
XE5時点なので、最新の環境では代わっているかも(XE7ではそれほど差異はなさげだけど)

よく使わそうなインターフェース

  • IScope

    • バインドの対象。
    • 入力側と出力側にそれぞれ1本ずつ手配される。
    • データソース -> UIコンポーネントであれば、入力側:データソース、出力側:UIコンポーネントとなる。
    • 逆方向であれば、入出力が反転する。
    • バインディングエンジンは、入力側スコープにバインド式を適用してIValue型として取り出し、その値を出力側スコープにバインド式を適用して割り当てる。
    • メソッド
      • LookUpメソッドを使用して、IGroupインスタンスを検索する。
  • IGroup

    • ひとつのバインド式に対しひとつ作られる。
    • IScope.LookUpメソッドを呼んだ場合にこの型の値を返す。
    • IGroupはバインド式を評価した際に作成される、グループインスタンスと呼ばれる値を保持するロールを提供する
    • メソッド
      • Add: 渡された対象をグループインスタンスに変更し、格納する。
      • Wrappers: 指定したインデックスのグループインスタンスを取得する。
  • IValue

    • グループインスタンス候補
    • 入力側から値を取り出すロールを提供する
    • メソッド
      • GetValue: 入力側から値を取り出す
      • GetType: 値の型を取得。主に値を変換するConverterを選択する際に使われている。
  • ILocation

    • グループインスタンス候補
    • 出力先に値を割り当てるロールを提供する
    • メソッド
      • SetValue: 出力先に値を割り当てる
  • IArguments, IInvokable

    • グループインスタンス候補
    • バインド式にIndexedPropertyを使う場合(例えば、Foo['Bar'])に使用する(どちらかいずれかでよい)
  • IPlaceholder

    • グループインスタンスの値を初期化、またはキャッシュされた評価結果を破棄するロールを提供する
      • TBindGridList(TBindGridListLink)を使う場合、入出力のスコープが再利用されるため、必須インターフェース
    • 通常、IScopeと共に指定してクラス定義する
    • メソッド
      • Detach: グループインスタンスの値を破棄するけど、どこからも呼ばれてない死にメソッド。
      • Attach: グループインスタンス値を割り当てる。Detachが役立たずなので、初期化と破棄の両方をおこなわせることとなる。
        • このメソッドだけしっかり実装する。

正直要らない子たち

  • IWrapperBinding, IScopeSymbols

    • デザイナを介してLiveBindingを使用する場合、設定だけはするが、その値をどこでも利用してなさげな謎のインターフェース。
    • IScopeに複数のIGroupを保持している場合に、式の評価前に初期化(Attach)する対象を検索する目的で使用した。
  • IScopeEnumerable

    • クラス定義の際、IScopeと一緒に指定し、スコープが保持する子要素(IGroup, IScope,..)を列挙する。
  • ScopeEx

    • 文字列ではなく、オブジェクトをキーにしてIGroupを取得できる。
    • LiveBindingデザイナを使う場合は、NO DEBAN。
  • IChild, IWrapper

    • 実際に値が割り当てられる直前、直後にそれぞれ発行されるイベント、OnAssigningValue OnAssignedValueに関係する(っぽい)
    • 特に使わなくても何とかなったので、詳細には調べてないです。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0