Послідовна навігація за записами
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Для виконання дій по послідовному перебору записів, починаючи від деякого стартового запису до кінця набору даних, використовують цикл while. do чи repeat. until:
with Tablel do begin
while not EOF do begin
with Tablel do begin
Так само можна переміщатися від кінця НД до його початку:
with Tablel do begin
while not BOF do begin
with Tablel do begin
Якщо НД допускає виклик запису за її номером (його властивість IsSequenced у разі має містити значення True), можна використовувати цикл for. Наприклад, наступний обробник події TForm. On Act ivate помістить усі значення рядкового поля BName НД Books у багаторядкове текстове поле Memol:
procedure TForml.FormActivate(Sender: TObject); var
RecNo: Integer; begin
if Books.IsSequenced then
for RecNo := 1 to Books.RecordCount do
Books.RecNo := RecNo; Memol.Lines.Add(Tablel['BName1]) end; end;
Зауважу, що для компонентів TTable і TQuery, пов'язаних із файл-серверними таблицями БД, властивість IsSequenced завжди містить значення True. У клієнт-серверній архітектурі воно залежить від сервера БД, що використовується. Властивість RecNo набору даних визначає порядковий номер оброблюваного запису (нумерація починається з 1), яке властивість RecordCount - кількість записів.
У всіх випадках слід пам'ятати, що якщо в ході виконання циклу послідовного перебору записів зміниться ключове поле запису або в НД буде вставлено новий (видалений старий) запис, курсор НД може змінити своє положення і правильна робота циклу буде порушена. Якщо, наприклад, ми хочемо видалити всі записи з таблиці, наступний фрагментпрограми буде невірним:
with Tablel do while not EOF do begin
Delete; Next; end;
Після видалення чергового запису курсор НД перейде на наступний, але виклик Next змусить його зміститися ще раз, і черговий запис буде пропущено. Правильний варіант: