BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C++とDelphi用のLiveBindingsについて

C++とDelphi用のLiveBindingsについて

原文(投稿日:2013/01/23)へのリンク

 

バインディング式は、XAML や Flex開発者にとっては新しい概念ではない。しかし、WinRTプログラミングで唯一使われるC++/CXの以外では、それはネイティブプログラミング言語で、普通見られるものではない。 VCL と FireMonkeyの両方向けに設計された、LiveBindings はこの常識の例外である。

まずちょっとした背景から。 VCL すなわち Visual Component Library は、 Delphi と C++ Builderによって共有される古いUIフレームワークである。 x86 と x64モードの両方をサポートし、Windows OS上のみである。FireMonkeyは新しいアプリ向けのVCLの置き換えである。Windows と OS Xの両方をターゲットにすることができる。FileMonkey と VCLは同じアプリで使用できるが、同一モジュールでは使用できない。

Embarcaderoによると、

LiveBindingsはバインディング式と呼ばれる関係式をベースにしており、単方向にも双方向にもなり得る。 LiveBindingsはまた、コントロールオブジェクトとソースオブジェクトに関するものある。バインディング式によって、どのオブジェクトでも他のどのオブジェクトとバインドできる。単に一緒にバインドしたいオブジェクトの1つかそれ以上のプロパティを含んだバインディング式を定義するだけである。例えば、TEdit コントロールを TLabelにバインドできるので、エディットボックスでテキストが変わったら、ラベルのキャプションが自動的にバインディング式によって評価された値に調整される。他の例としては、トラックバーコントロールをプログレスバーにバインディングして、トラックバーの動かし方に応じて、プログレスを上げたり、下げたりできる。

多くのDelphi/C++ Builder ツールのように、LiveBindingsは一般にGUIツールを使って生成される。2つのオプションLiveBindings DesignerLiveBindings Wizardがある。これは XAML や Flexでバインディング式をマニュアルで編集きた開発者を間違いなく悩ませる。

注意:バインディングをプログラムで編集するのは可能であるが、これは絶対やらないこと。これについての文書は、コンソールアプリケーションのチュートリアル内に埋もれている。

ちょっと複雑なデザインパターンを実装するのにオブジェクトを必要とする.NETと違って、Delphi と C++ Builder のオブジェクトはデフォルトでバインドできる。実質的にあらゆるオブジェクトのように、単にTObjectをサブクラス化して、それから普通のオブジェクトのようにプロパティを公開する必要がある。 C++ Builderでは、これは__property 拡張キーワードを使うことを意味している。

実際にバインディング式を適用するコードは非常に冗長だが、複雑な式が使える。以下の例は式 'o1.IntegerValue + o2.IntegerValue' はターゲットプロパティにバインドされている。 

XAML技術では、バインディング式はイベントをベースにしている。メモリーリークを避けるために、内部で「弱いイベント」構造を使用して、バインディング式によって渡される必要のある PropertyChangedイベントをモニターしている。この構造は、あらゆるバインディングが一元的に登録されている必要があるが、ほとんどの開発者はこの事実を知らない。

LiveBindingsには、プロパティ変更イベントの概念がない。なので似たような抽象化は不可能である。バインディングは、なお一元的に登録されているが、プロパティが変わった時に、バインディングエンジンは、明示的に通知される必要がある。これは オブジェクトとプロパティ名を受け取るTBindings.Notify関数を使って行われる。

理論的には、TBindings.Notify関数はプロパティsetterによって呼び出せるが、それを明示的に呼び出すクライアントコード必要性を排除している。これはマルチスレディングについての疑問を引き起こすが、ドキュメントには何も書かれていないが、弱いイベントの必要性を排除している。

 

この記事に星をつける

おすすめ度
スタイル

BT