レコードへのマーク付けと復帰
データセット内の移動 への移動
データセット内でレコード間を順次移動したり特定のレコード数だけ移動するほかに、データセット内の特定の位置にマークを付けて、必要なときにその位置にすぐ戻れるようにしておくと、多くの場合、便利です。Data.DB.TDataSet には、ブックマーク機能が導入されており、それは Bookmark プロパティと 5 つのブックマーク メソッドで構成されています。
TDataSet では、仮想ブックマーク メソッドを実装しています。これらのブックマーク メソッドが呼び出された場合、TDataSet から派生したどのようなデータセット オブジェクトも必ず値を返しますが、その戻り値は現在の位置を反映していないデフォルトにすぎません。TDataSet の下位クラスでは、ブックマークに対するサポートのレベルがそれぞれ異なります。dbExpress データセットでは、ブックマークをサポートしていません。ADO データセットでは、基盤となるデータベース テーブルによっては、ブックマークをサポートできます。BDE データセット、InterBase Express データセット、クライアント データセットでは、常にブックマークをサポートしています。
目次
Bookmark プロパティ
Bookmark プロパティは、アプリケーション内の数あるブックマークのうち、どのブックマークが現在のものかを示します。Bookmark は、現在のブックマークを識別する文字列です。別のブックマークを追加するたびに、それが現在のブックマークになります。
GetBookmark メソッド
ブックマークを作成するには、アプリケーション内で TBookmark 型の変数を宣言したあと、GetBookmark を呼び出して、その変数に記憶域を割り当て、さらにその値に、データセット内の特定の位置を設定する必要があります。TBookmark 型はポインタです。
GotoBookmark メソッドと BookmarkValid メソッド
ブックマークが渡されると、GotoBookmark は、そのブックマークで指定された場所にデータセットへのカーソルを移動します。GotoBookmark を呼び出す前に、BookmarkValid を呼び出して、そのブックマークがレコードを指しているかどうかを判定することができます。指定されたブックマークがレコードを指していれば、BookmarkValid は True を返します。
CompareBookmarks メソッド
Data.DB.TDataSet.CompareBookmarks を呼び出して、移動先のブックマークが、別の(または現在の)ブックマークと異なるかどうかを確認することもできます。2 つのブックマークが同じレコードを参照している場合(または、両者が nil の場合)、CompareBookmarks は 0 を返します。
ブックマークの例
以下のコードは、ブックマークの使用例を示しています。
procedure DoSomething (const Tbl: TTable) var Bookmark: TBookmark; begin Bookmark := Tbl.GetBookmark; { Allocate memory and assign a value } Tbl.DisableControls; { Turn off display of records in data controls } try Tbl.First; { Go to first record in table } while not Tbl.Eof do {Iterate through each record in table } begin { Do your processing here } . . . Tbl.Next; end; finally Tbl.GotoBookmark(Bookmark); Tbl.EnableControls; { Turn on display of records in data controls, if necessary } end; end;
void DoSomething (const TTable *Tbl) { TBookmark Bookmark = Tbl->GetBookmark(); // Allocate memory and assign a value Tbl->DisableControls(); // Turn off display of records in data controls try { for (Tbl->First(); !Tbl->Eof; Tbl->Next()) // Iterate through each record in table { // Do your processing here . . . } } __finally { Tbl->GotoBookmark(Bookmark); Tbl->EnableControls(); // Turn on display of records in data controls } }
レコードを反復処理する前に、コントロールが無効化されています。レコードの反復処理中にエラーが発生した場合、たとえループが途中で終了したとしても、finally 節により、コントロールは常に有効化され、ブックマークも常に解放されます。