2016-06-27 17 views

答えて

9

DataSet.FieldByName('field').Value 

の問題は、パフォーマンスの一つです。これが実行されるたびに、データセットのfieldsコレクションを介してシリアル検索が行われ、必要な名前のものが検索されます。この検索は、バイナリサーチやハッシュアルゴリズムなど、どのような方法でも最適化されていません。したがって、多くのフィールドがある場合や、データセット内のレコードを反復処理しているときにこのアクセスを行っている場合、パフォーマンスに重大な影響を与える可能性があります。

これは、オブジェクトインスペクタを使用して「永続的な」TFieldを定義する理由の1つではありませんが、それだけではありません。特定のTFieldへの参照は、コンパイラに知られているシンボリック名を使用して取得できます。これは、コンパイル時に1回だけ発生します。はい、それはFieldByNameより速いです。あなたがそれをより明確に見分けるかどうかまで。

永続TFieldを使用するその他の理由には、計算フィールドの設定が容易であること、さらに重要なことは計算されたフィールドがOnCalcFieldsイベントでFieldByNameによってアクセスされる必要がないということです。 FieldByNameと永続フィールドを使用した場合のパフォーマンスヒットは、OnCalcFieldイベントで参照されるフィールドの数に掛け合わされ、OnCalcFieldsはデータセットレコードを繰り返し処理しなくても、データセットの各レコードに対して少なくとも1回呼び出されます自分のコード。

上記は、TClientDataSetsだけでなく、すべてのTDataSet子孫に当てはまります。良好な回答に加えて、

+0

である。ソースを汚染することなく設計時に永続フィールド用に構成できるプロパティおよびイベントハンドラが多数あります(ただし後者は明示的な方が好ましいかもしれませんが) – vavan

関連する問題