2012-01-15 9 views
1

TTree(BDE)に接続されたTDBGridで使用するための機能を作成する予定です。私はそれがグリッドセルレベルで動作するようにしたい。Un-Do機能を実装するために使用するTDataSet、TDbGridイベント

私はこれを実装するための良い方法を提案したいと思います。

変更されたレコードのリスト、フィールド名、およびそれらの以前の値を保持する予定です。

私が必要とするのは、セルのOnEnterとOnExitです。

TDataSet.BeforeEditは私が必要とするものの半分です。しかし、TDataSet.AfterEditは少し誤っています - 編集が完了した後ではなく、 "TDataSetが編集モードに入った後に"呼び出されます(ヘルプシステムを引用する)。

TField.OnChangeは動作します。私は思う...

私の考えは、AfterEditがセルの内容を取得するということです。 TField.OnChangeは変更をスタックに記録します。 (デルファイのジェネリックスの良さに感謝しました。私が前に欠けていたものは分かりませんでした)

私の考え方、警告、またはこれを行うためのより良い方法についての提案はありますか?

PS標準のmea culpa:はい、はい:BDEは推奨されていません。私はyada、yada、yadaを使用しないでください。 150万行のレガシーコードを維持している私の上司にそれを伝えてください。はい、はい:いつかBDEは消えてしまいます。私たちは積極的に行動して動かなければなりません。我々は知っている。ありがとうございました。

+0

トランザクション – OnTheFly

+0

データベースにまだ更新されていない編集を追跡して取り消したい理由がわかりません。なぜ投稿を追跡したり取り消したりしないのですか?取り消しをキャンセルすることができるメモリ内の編集に対して操作を許可する予定ですか? BDEに関して –

+0

:そうではありません。) - [Demotivators](http:// despair。com/viewall.html) – mjn

答えて

1

ロバートの要請に応じて、私のコメントは、asnwerとして書き直されました。

Ctrl-ZまたはEscを入力して、元に戻す機能をサポートしていないセルはありますか?

複数のセルに編集のスタックを残しておき、それらを1つずつ元に戻すようにしたい場合は、データセットとフィールドイベントを組み合わせることができます。データセットOnBeforeEditはすべてのセルのベースを与え、各フィールドのオンチェンジはOnAfterEditを返します。これは、ユーザが同じセルを再び編集するために戻ったときに同じ(虚偽の)Field.OnBeforeEditと同じ値をレンダリングします。

1
  1. BDEデータセットのUndo/Redo機能を実装する場合は、独自のデータセットを継承し、イベントをフックする代わりにいくつかのメソッドをオーバーライドすることをお勧めします。次に、TQueryをすべてTYourQueryに置き換えます。
  2. もっと簡単なのは、元に戻す/やり直しが必要な場所でTClientDataSet + TDataSetProviderを使用することです。 TClientDataSetを設定します。 LogChangesをTrueに設定します。編集電話番号UndoLastChangeを元に戻す。申し訳ありませんが、やり直すことはできません。
  3. BDEから一部の3Dパーティーデータアクセスコンポーネントへの移行は、単純で簡単です。例えば、AnyDACには、BDEと互換性のあるAPIがあります。また、移行手順、移行を自動化するツールもあります。documentedまた、移行後、すぐに(2)を取得します。
+0

+1。追加の機能を実装し、より深いBDE移行穴を掘ることは、あなたの現在の驚異的な技術的負債に対するあなたの上司の過ちに対する解決策ではありません。ボスは新しい特徴を思いつきます。元に戻す/やり直す。あなたはBDEの削除について正当な理由があります。 –

関連する問題