Eof プロパティと Bof プロパティ
データセットについて:インデックス への移動
読み出し専用の実行時のプロパティとして,Eof(ファイルの終わり)と Bof(ファイルの始まり)という 2 つのプロパティがあります。この 2 つのプロパティはデータセット内のすべてのレコードを繰り返し処理するときなどに便利です。
Eof
EOF プロパティが True のとき,カーソルはデータセットの最後の行にあります。Eof が True に設定されるのは,アプリケーションが以下の動作を行ったときです。
- 空のデータセットを開いた
- データセットの Last メソッドを呼び出した
- データセットの Next メソッドを呼び出したが,データセットの最後の行にカーソルがあったためにメソッドが失敗した
- 空の範囲またはデータセットで SetRange を呼び出した
上記の場合以外では,Eof プロパティは必ず False になります。したがって,上記の条件が満たされていない場合,およびプロパティを直接テストしていない場合は,Eof は False であると想定する必要があります。
Eof プロパティは,データセットのすべてのレコードの繰り返し処理を制御するためにループ条件でよくテストします。レコードの入ったデータセットを開いたり First メソッドを呼び出すと,Eof は False になります。1 レコードずつデータセット全体の繰り返し処理をするには,Next を呼び出してレコードを 1 つずつ進め,Eof が True になるとループが終了するようにループを作成します。カーソルがすでに最後のレコードにある場合は,Next を呼び出すまで Eof は False のままです。
次のコードは,CustTable というデータセットのレコード処理ループのコード記述方法の 1 つを示しています。
CustTable.DisableControls; try CustTable.First; { 最初のレコードに移動する。その結果,EOF は false になる } while not CustTable.Eof do { EOF が True になるまで繰り返す } begin { ここで各レコードを処理する } . . . CustTable.Next; { 成功すると EOF は false になる。最後のレコードで Next が失敗すると EOF は true になる } end; finally CustTable.EnableControls; end;
CustTable->DisableControls(); // 画面描画を止めることで処理速度を上げ,ちらつきをさける try { while (!CustTable->Bof) // BOF が true になるまで繰り返す { // ここで各レコードを処理する . . . CustTable->Prior(); // 成功した場合には Bof は false になる。最初のレコードに対して Prior を呼ぶと失敗し,Bof は true になる } } __finally { CustTable->EnableControls(); }
CustTable->DisableControls(); try { for (CustTable->First(); !CustTable->Eof; CustTable->Next()) ( // ここで各レコードを処理する . . . } } __finally { CustTable->EnableControls(); }
ヒント: 上記の例では,データセットに結び付けられたデータベース対応ビジュアルコントロールの使用可/不可を切り替える方法も示しています。データセットの反復の間,ビジュアルコントロールを使用不可にすると,現在のレコードが変わってもアプリケーションがコントロールの内容を更新しないで済むので,処理が高速化されます。すべての処理が完了したら,コントロールを再び使用可能にすることで,最新の現在行の値に更新させることを忘れないでください。ビジュアルコントロールは try...finally 文の finally 節で使用可能にしている点に注意してください。この位置で使用可能にしておくと,たとえ処理中に例外が発生し,繰り返し処理が未完了で終わってもコントロールが使用不可のままになることを回避できます。
Bof
BOF プロパティが True のとき,カーソルはデータセットの先頭の行にあります。Bof が True に設定されるのは,アプリケーションが以下の動作を行ったときです。
- データセットを開いた直後
- データセットの First メソッドを呼び出した
- データセットの Prior メソッドを呼び出したが,データセットの最初の行にカーソルがあったためにメソッドが失敗した
- 空の範囲またはデータセットで SetRange を呼び出した
上記の場合以外では,Bof プロパティは必ず False になります。したがって,上記の条件が満たされていない場合,およびプロパティを直接テストしていない場合は,Bof は False であると想定する必要があります。
EOF と同様に Bof もループ条件に入ってデータセットのレコードの繰り返し処理を制御できます。次のコードは,CustTable というデータセットのレコード処理ループのコード記述方法の 1 つを示しています。
CustTable.DisableControls; { 画面描画を止めることで処理速度を上げ,ちらつきをさける } try while not CustTable.Bof do { BOF が True になるまで繰り返す } begin { ここで各レコードを処理する } . . . CustTable.Prior; { 成功した場合には Bof は false になる。最初のレコードに対して Prior を呼ぶと失敗し,Bof は true となる } end; finally CustTable.EnableControls; { 新しい現在行を表示する } end;