2011-01-11 15 views
1

TDataSetまたはTObjectListのいずれかの内容を表示するグリッドコントロールを作成しています。 TDataSetだけをサポートする必要がある場合は、非常に単純です。TDataSetにレコードが挿入された時期を特定するにはどうすればよいですか?

  1. TDataLinkの子孫を介してデータセットにリンクします。
  2. グリッドの内容をペイントするときに、そのTDataLinkでバッファされたレコードを使用して、必要なものをペイントすることができます。
  3. TDataSetの行を表現するために、バッファに行をペイントするだけなので、個々のオブジェクトをどこかに置く必要はありません。

私の場合、他のいくつかのソースからもデータを受け入れる必要があります。つまり、各行を表すオブジェクトが必要でした(コントロールにはかなりの行状態が必要でした)。

しかし、これは上記のモデルで問題を引き起こします。私は各行を表すオブジェクトを持っているので、レコードがTDataSetに追加または削除されるときに通知を受ける必要があります。そして私はちょうどそれを行う方法を見ることができません。

明らかに、私はデータセットイベントにフックしたくありません。それらはすでに使用されている可能性があり、TDataLinkはコントロールとデータセットの間のメディエータになります。また、DataEvent仮想メソッドを使用しようとしても、レコードが追加/削除されているかどうかはわかりません。

アイデア?

答えて

1

TDataSetに接続されているTDataSourceにTDataLink子孫をフックすると、データが変更されたときにRecordChangedプロシージャが呼び出されます。

TDataSetに接続されているTDataSourceのイベントOnDataChangeおよびOnUpdateDataを使用できます。

+0

RecordChangedは、どのような変更が発生したか教えてくれません。その点については、DataChangedを使用している可能性があります。DataChangedには既にコードがあります。 TDataSetイベントを使用しないのと同じ理由でDataSourceイベントを使用する必要はありません。他のコード(コントロール外)は、イベントポインタの保存に気をつける必要があります。とても素敵ではありません。 –

+0

RecordChangedにはTField引数があります。これは関連するTDataSetの現在のレコードで変更されたフィールドです –

+0

グリッドのユーザーに干渉することなくTDataSourceを使用できます。 1つのTDataSetにリンクされたTDataSourceオブジェクトが多数存在することがあります。 TDataSource.DataSetにDataSetを割り当てます。反対ではありません。したがって、イベントポインタを保存/復元する必要はありません。 –

0

あなたが使用しようとしている基本データセットクラスから独自のクラスを派生させなければならないようです。 InternalAddRecord、InternalPost、InternalDeleteメソッドをオーバーライドし、レコードの追加/削除を処理する必要があります。

関連する問題