Cds.FieldByName( 'field')を実行できる場合、TClientDatasetにフィールドを追加する際のポイントは何ですか?フィールドをクライアントデータセットに追加するか、動的にアクセスしますか?
参照がある方が速いのですか? これは「より明確」ですか?
Cds.FieldByName( 'field')を実行できる場合、TClientDatasetにフィールドを追加する際のポイントは何ですか?フィールドをクライアントデータセットに追加するか、動的にアクセスしますか?
参照がある方が速いのですか? これは「より明確」ですか?
DataSet.FieldByName('field').Value
の問題は、パフォーマンスの一つです。これが実行されるたびに、データセットのfieldsコレクションを介してシリアル検索が行われ、必要な名前のものが検索されます。この検索は、バイナリサーチやハッシュアルゴリズムなど、どのような方法でも最適化されていません。したがって、多くのフィールドがある場合や、データセット内のレコードを反復処理しているときにこのアクセスを行っている場合、パフォーマンスに重大な影響を与える可能性があります。
これは、オブジェクトインスペクタを使用して「永続的な」TFieldを定義する理由の1つではありませんが、それだけではありません。特定のTFieldへの参照は、コンパイラに知られているシンボリック名を使用して取得できます。これは、コンパイル時に1回だけ発生します。はい、それはFieldByName
より速いです。あなたがそれをより明確に見分けるかどうかまで。
永続TFieldを使用するその他の理由には、計算フィールドの設定が容易であること、さらに重要なことは計算されたフィールドがOnCalcFields
イベントでFieldByName
によってアクセスされる必要がないということです。 FieldByName
と永続フィールドを使用した場合のパフォーマンスヒットは、OnCalcField
イベントで参照されるフィールドの数に掛け合わされ、OnCalcFields
はデータセットレコードを繰り返し処理しなくても、データセットの各レコードに対して少なくとも1回呼び出されます自分のコード。
上記は、TClientDataSetsだけでなく、すべてのTDataSet子孫に当てはまります。良好な回答に加えて、
である。ソースを汚染することなく設計時に永続フィールド用に構成できるプロパティおよびイベントハンドラが多数あります(ただし後者は明示的な方が好ましいかもしれませんが) – vavan