Eof プロパティと Bof プロパティの使用
データセット内の移動 への移動
読み取り専用の実行時プロパティである Eof(ファイルの終わり)と Bof(ファイルの始まり)の 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 というデータセットのレコード処理ループのコーディング方法の一例を示しています。
CustTable.DisableControls; try CustTable.First; { Go to first record, which sets Eof False } while not CustTable.Eof do { Cycle until Eof is True } begin { Process each record here } . . . CustTable.Next; { Eof False on success; Eof True when Next fails on last record } end; finally CustTable.EnableControls; end;
CustTable->DisableControls(); // Speed up processing; prevent screen flicker try { while (!CustTable->Bof) // Cycle until Bof is true ( // Process each record here . . . CustTable->Prior(); // Bof false on success; Bof true when Prior fails on first record } } __finally { CustTable->EnableControls(); }
CustTable->DisableControls(); try { for (CustTable->First(); !CustTable->Eof; CustTable->Next()) ( // Process each record here . . . } } __finally { CustTable->EnableControls(); }
ヒント: 上記の例では、データセットに関連付けられたデータ対応ビジュアル コントロールの有効/無効を切り替える方法も示しています。データセットの反復処理中にビジュアル コントロールを無効にした場合、アプリケーションでは、現在のレコードが変わってもコントロールの内容を更新する必要がないので、処理速度が向上します。反復処理が完了したら、コントロールを再び有効にして、それらの内容を新しい現在行の値に更新しなければなりません。ビジュアル コントロールの有効化は try...finally 文の finally 節で行われている点に注意してください。このようにすることで、たとえ例外が発生してループ処理が途中で終わっても、コントロールが無効のままになることはありません。
Bof
Bof が True の場合は、カーソルがデータセットの最初の行にあることを示しています。Bof が True に設定されるのは、アプリケーションで次のいずれかを行ったときです。
- データセットを開く。
- データセットの First メソッドを呼び出す。
- データセットの Prior メソッドを呼び出すものの、(カーソルが現在、データセットの最初の行にあるため)メソッドが失敗する。
- 空の範囲または空のデータセットに対して SetRange を呼び出す。
上記の場合以外では、Bof は必ず False に設定されます。上記の条件のいずれかが満たされていて、かつ、プロパティを直接検査する場合を除き、Bof は False であると仮定しなければなりません。
Eof と同様に、Bof は、データセット内のレコードの反復処理を制御するためにループ条件で使用することができます。次のコードでは、CustTable というデータセットのレコード処理ループのコーディング方法の一例を示しています。
CustTable.DisableControls; { Speed up processing; prevent screen flicker } try while not CustTable.Bof do { Cycle until Bof is True } begin { Process each record here } . . . CustTable.Prior; { Bof False on success; Bof True when Prior fails on first record } end; finally CustTable.EnableControls; { Display new current row in controls } end;