2

標準のデータベース対応コンポーネントと dbExpress を使用して、Delphi 6 + MySQL データベースでアプリを作成しています。このアプリを使用すると、ユーザーはグリッド内のレコードを表示し、クライアント側でデータを編集 (レコードの挿入および/または削除) できます。これらのデータ編集は、送信ボタンをクリックしたときにのみデータベースに書き込まれます。これはすべて正常に機能し、次の設定があります。

コントロール: 1. データを視覚的に表示するために DataSource1 にリンクされた DBGrid1。2. DataSource1 は ClientDataSet1 にリンクされ、DBGrid が表示するデータを提供します。3. ClientDataSet1 は DataSetProvider1 にリンクされ、編集用のクライアント側データを提供します。4. DataSetProvider1 は、単一の DB テーブルからレコードを選択する SQLDataSet1 にリンクされています。5. SQLDataSet1 は SQLConnection にリンクされ、MySQL データベースへの接続を提供します。

アクション: 1. ユーザーがレコードを挿入します。ClientDataSet1.InsertRecord を使用します。2. ユーザーがレコードを削除します。私は ClientDataSet.Delete を使用します。3. ユーザーがデータを送信します。私は ClientDataSet1.ApplyUpdates(-1) を使用します。

これはすべて、データの処理とデータの投稿に関してうまく機能します (レコードを削除するための DataSetProvider1BeforeUpdateRecord の小さなハックが含まれています)。

今、私の問題: ユーザーが最初にフォームをロードすると、DBGrid1 はすべての元のレコードを表示し、削除されたすべてのレコードを削除します。しかし、ユーザーが ClientDataSet1 に新しいレコードを挿入すると、空白のレコードが DBGrid1 に表示されます。ClientDataSet1.ApplyUpdates の場合のように、実際のデータが失われたり NULLS として設定されたりすることはありません。このレコードは DB に正しく書き込まれます。

TClientDataSet には、元のデータ用の data プロパティと編集済みデータ用の Delta プロパティがあることを知っています。一度に 1 つの DBGrid に表示され、ユーザーがデータを編集できるようにすることで、データを含むこれら 2 つのプロパティを使用できますか?

私は 30 以上のリソースとデモ アプリを見てきましたが、すべてこの問題を回避しています。これはできますか?

4

3 に答える 3

3

わかりました...この質問は、多くのフィードバックなしでかなりの量見られました。多くのチュートリアル、デモ アプリをダウンロードし、これらのコントロールの使用について説明している複数の記事やヘルプ情報を読んで、いくつかの調査を行いました。

最終結果:

  1. これらのコントロールは、一般的に少しバグがあります。
  2. 私の質問に具体的に言及すると、コントロールは私が標準として説明していることを実行できないと言っても過言ではありません。

これは、私がレビューした 30 以上のデモ アプリ、記事、およびチュートリアルに基づいており、元のデータとデルタ データの両方を 1 つのデータ グリッドに表示することについて説明していません。確かに、Listbox または StringGrid を使用してこの結果をハックできます (これは私が行ったことです) が、これは、この機能を提供する際にコントロールが使用できないか、使用できないことも示しています (わずかな可能性があります)。

私の意見では、この機能は明らかな見落としです。ユーザーは自分のアクションの潜在的な結果を便利に単一のデータグリッドで見たいと思っており、開発者はそれをシンプルで痛みのない方法、つまりデータグリッドを使用してデータを表示する方法で提供したいからです!

Question Answered [私がレビューしたいデモアプリで異なることが証明できる場合は、これを削除します]。

デモ アプリを作成して動作させることができなかった場合は、私の回答に投票してください。ありがとう

于 2010-12-08T13:21:48.037 に答える
1

Delphi で提供される TDBGrid コントロールには、フィールドの古い値と新しい値の両方を表示する機能が組み込まれていません。もちろん、グリッドから継承することも、独自のグリッドを作成して機能を追加することも、目的を達成するサード パーティ コンポーネントを購入することも大歓迎です。標準コントロールは、最も一般的に必要な機能を提供しますが、標準コントロールに限定されません。

計算フィールドを使用して、目的を達成することもできます。たとえば、文字列フィールドがある場合、名前と同じ長さでName、新しい計算文字列フィールドを というデータセットに追加します。OldName

次に、データセットの OnCalcFields イベントで、次のようなコードを入力するだけです。

if DataSet.State = dsEdit then
begin
  DataSet.FieldByName('OldName').Value := DataSet.FieldByName('Name').OldValue;
end
else
begin
  DataSet.FieldByName('OldName').Value := Null;
end;
于 2011-10-20T16:59:37.923 に答える