13

私が取り組んでいるプロジェクトには、以下のようなコードがあります。

procedure TForm.EditBtnClick(Sender:TObject);
begin
  // Mark is form variable. It's private
  Mark = cdsMain.GetBookmark;
  // blabalbal
  .
  .   
  .
end;

procedure TForm.OkBtnClick(Sender:TObject);
var  
  mistakes: Integer;
begin
  //Validation stuff and transaction control
  //removed to not clutter the code
  If cdsMain.ChangeCount <> 0 then 
    mistakes := cdsMain.AppyUpdates(-1); 
  cdsMain.Refresh;
  try
    cdsMain.GotoBookmark(Mark);
    // Yes, I know I would have to call FreeBookmark
    // but I'm just reproducing 
  except
    cdsMain.First;
  end;
end;

個人的には、ブックマークをあまり使用しません。ただし、カーソル位置のみを移動したデータセットの位置を変更する場合を除きます(リストの作成、文字列リストの入力など)。Refresh更新(特にフィルターによってレコードが非表示になる可能性がある場合)、再フェッチ(/ CloseOpen、またはデータセット内のデータを変更する操作の場合、ブックマークは使用しません。私Locateは主キーを使用するか(TClientDatasetもちろん、を使用して)、パラメーターを変更して再クエリすることを好みます。

ブックマークはいつまで有効ですか?までRefreshCloseデータを再フェッチするために/が実行されるまでOpen?セーフゾーンはどこで終わりますか?

私が(DbExpress)で使用TClientDatasetしている答えを考えてみてください。TSQLQuery

4

3 に答える 3

7

c0rwinskamradtの両方がすでに述べたように、ブックマークの動作は、使用するTDataSetの子孫によって異なります。

一般に、ブックマークは次の場合に無効になります。

  1. 閉じる/開く
  2. 更新(それをサポートするデータセットで)
  3. データの変更(場合によっては削除のみ)

1.と2.がTClientDataSetsのブックマークを無効にする可能性があることを知っています。TClientDataSetsの場合、どの基になるプロバイダー(TSQLQuery、TIBQueryなど)が使用されているかは問題ではないとほぼ確信しています。

何が機能し、何が機能しないかを確認する唯一の方法は、それをテストすることです。つまり、ブックマークを使用しないのは完全に正しいということです。ブックマークには、信頼できないという本質的な可能性があります。

BookmarkValid安全のため、ブックマークに移動する前に必ず電話してください。

于 2009-05-11T23:15:46.593 に答える
4

TDataSetは、仮想ブックマークメソッドを実装します。これらのメソッドは、ブックマークメソッドが呼び出された場合にTDataSetから派生したデータセットオブジェクトが値を返すことを保証しますが、戻り値は現在の場所を追跡しないデフォルトにすぎません。TBDEDataSetなどのTDataSetの子孫は、次のリストで説明されているように、ブックマークメソッドを再実装して意味のある値を返します。

  • BookingValid、指定されたブックマークが使用されているかどうかを判断します。
  • CompareBookmarks、2つのブックマークをテストして、それらが同じであるかどうかを確認します。
  • GetBookmark、データセット内の現在の位置にブックマークを割り当てます。
  • GotoBookmark、GetBookmarkによって以前に作成されたブックマークに戻ります
  • FreeBookmark、GetBookmarkによって以前に割り当てられたブックマークを解放します。

ここから入手

于 2009-05-11T19:23:27.237 に答える
4

個人的にはブックマークを使うことはめったにありません。代わりに、表示しているレコードのIDを使用し、更新が完了したらそのレコードでロケートを実行します。セット内のすべてのレコードを反復処理する必要がある場合は、tClientDataset(独自のカーソルを取得する)のクローンを使用して反復処理します。

私の理解では、ブックマークの実装はtDatasetの子孫のベンダー次第であり、実装ごとに異なる可能性があります。私の非常に単純なデータセット(tBinData)では、ブックマークを物理レコード番号として実装したため、レコードが削除されない限り、更新の間もブックマークが保持されます。私はこれをすべての実装に当てはまるとは言えません。

于 2009-05-11T20:29:57.753 に答える