問題タブ [livebindings]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - TComponent の Observers プロパティ
こんにちは、Delphi XE2 TComponentに新しい「Observers」プロパティがあります。残念ながら、これに関するヘルプ エントリは空です。この新しいプロパティの利点と使用方法を知っている人はいますか? 編集: LiveBindings に関連していることはわかっていますが、それについてもう少し知りたいと思っています。XE2 ソース コードにアクセスできないため、自分で調査することはできません。
delphi - LiveBindingsを使用したリストの監視
リストの変更をUIコントロールに通知する一般的な方法を見つけようとしています。たとえば、オブジェクトがリストに追加されたときに、リストボックスに自動的に追加したいとします。オブジェクトがリストから削除された場合、リストボックスから自動的に削除されます。
残念ながら、Delphiのリスト間には厄介な矛盾がいくつかあります。TList<>。Notifyは問題ありませんが、TStringList.OnChangeは変更内容を通知せず、TListにも通知がありません。
LiveBindingsがほとんどのリストの変更を監視する適切な方法を提供してくれることを期待していましたが、今のところそれはわかりません。私が見たすべての例は、コントロールを満たし、リストアイテムとコントロールアイテム(私の例ではリストボックスアイテム)の間にバインディングを設定します。ただし、リストからオブジェクトを追加/削除しても、コントロールにはまったく影響しません。
私が見逃したメカニズム、またはより一般的には、これを行うための優れた一般的な方法を誰かが知っていますか?
明確化: 以前は十分に明確ではなかったようです。一般的な方法が必要な理由は、既存のコードを含むさまざまなソースに接続できるグリッドコントロールを作成したためです。グリッドがソースとして受け入れるインターフェースを作成し、次にいくつかのリストを受け入れてそれらをそのインターフェースとして使用できるようにするためのいくつかのアダプタークラスを作成しました。既存のコードも受け入れる必要があるため、TList.Notifyをオーバーライドすることはできません。また、変更を確認するイベントがないため、事実上、TListには、アダプタークラスなどのクライアントが使用できる通知メカニズムがないことを意味します。TStringsにも1つはありませんが、TStringListは単純なOnChangeを発生させます。これは、アダプタークラスが実際に何が変更されたかを判別できないことを意味します。
私は実際にTVirtualMethodInterceptorを使用した非常に優れたソリューションを持っていましたが、Delphi XEでは完全に機能しなくなり、XE2では修正されませんでした。
delphi - Firemonkey と Delphi XE2 を使用した DB ルックアップ フィールド
Firemonkey で TCombobox をルックアップ フィールドにバインドする方法が見つかりません。VCL には、TDatasource コンポーネントとルックアップ フィールド名だけが必要な TDBLookupComboBox があり、コンボボックス リストに入力されます。このようにして、実行時に FK フィールドを簡単に編集できます。
Firemonkey には Livebindings しかありません。同じ動作を設定する方法がわかりません。これまでに行った最善の方法は、コンボボックス リストに TBindList を入力し、ルックアップ フィールドに接続された TBindDBListLink を使用することです。このように動作しているように見えますが、コンボボックスでは選択したアイテムを変更できません。
これは、データベース アプリケーションが持つべき最も基本的なものの 1 つですが、なぜ誰もそれについて話していないのか、私にはわかりません。
delphi - コントロールとオブジェクトの間に双方向の LiveBinding が必要です
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 も使用していません。したがって、なぜそれらを使用する必要があるかを説明していただけない限り、それらのコントロールに関する情報は必要ありません。
delphi - LiveBinding - TListTStringGrid にバインド
次のサンプル コード セットがあります。LiveBinding を使用してData
リスト要素をバインドするにはどうすればよいですか。TStringGrid
グリッド内の列が変更されたときに基になる を更新できるように、双方向の更新が必要TPerson
です。
TDataset
Based バインディングでこれを行う方法の例を見てきましたが、 TDataset
.
delphi - (ライブ バインディングを使用して) 複数のコンポーネントを (非コンポーネント) オブジェクトにバインドすることは可能ですか?
私はオブジェクトを持っています。コンポーネントではなくコントローラーと呼びましょう。有効なプロパティがあります。live-bindings を使用して、フォーム上の一部のコンポーネントの有効なプロパティにバインドすることはできますか? つまり、コンポーネントの有効なプロパティが変更された場合、それにバインドされているコンポーネントはそれに応じて有効なプロパティが設定されますか?
TController が TComponent の子孫だった場合の方法がわかります。TController をコンポーネントにラップできることはわかっていますが、これを行う直接的な方法があるかどうか尋ねています。
delphi - D2010 で XE2 LiveBinding のようなことを行うことは可能ですか?
それは事実ですか、それとも XE2 でのみ利用可能なコンパイラ テクノロジを使用していますか?
TEdit.Text プロパティを、コード内の文字列を返すオブジェクト関数にバインド (双方向) したいだけです (デザイナー コンポーネントや式エバリュエーターは必要ありません)。
ありがとう!
delphi - Delphi xe2 のライブバインディング リストボックス
2 つの TListBox オブジェクトを同期するには、いずれかのリストボックスの変更を受け入れて、両方のリストボックスで使用できるようにする方法を教えてください。
===================== 更新済み =========================== ======================== この質問は最初の回答の後に更新されます
使用する必要がある場合
常にリストボックスに変更を加えていますが、使用する代わりに livebibnding を使用する目的は何ですか
常に変化が起こっています。
database - データベースでの Firemonkey と Livebindings のパフォーマンス
Firemonkey では、グリッドをデータベースにバインドするときに Livebindings エンジンが非常に遅いことがわかりました。5000 レコードと 10 列のグリッドを埋めるのに 30 秒以上かかります。
TBindDBGridLink と TBindGridLink の両方を試しましたが、結果は同じです。グリッドに表示されていなくても、グリッドを満たすすべてのデータがメモリに読み込まれているようです。
パフォーマンスを向上させるためのヒントはありますか?
VCL では、DB 対応コンポーネントはほぼ瞬時にデータを取得できます。最初に Windows に焦点を当てた新しいビジネス アプリケーション プロジェクトにとって、VCL は依然として優れた選択肢だと思いますか?
delphi - LiveBindingsを使用してTStringGridに200を超える行を表示するにはどうすればよいですか?
にバインドさTDataSource
れたに裏打ちされたがあります。これを行うには、グリッドを右クリックして「」を選択し、データソースを選択します。これでLiveBindingsがセットアップされました。TClientDataset
TStringGrid
Link to DB Datasource...
アプリケーションを実行すると、データセットに5000レコードがあるにもかかわらず、グリッドは200行でしか埋められません。
表示される行数を変更する方法や、ユーザーがすべてのデータをスクロールできるようにする適切な方法に関するドキュメントが見つかりません。
ユニット内でハードコードされた200
値を見つけました。これをに増やすと、グリッドに5000行すべてが表示されますが、これはハックのようです。TBindScopeDBEnumerator.Create
Data.Bind.DBScope
10000
TStringGridに200を超える行を表示する適切な方法は何ですか?