Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Перемещение по записям

CuBook05

Перед перемещением указателя текущей записи набор данных автоматически переводится в режим просмотра. Если текущая запись находилась в режимах редактирования или вставки, то перед перемещением указателя сделанные в записи изменения вступают в силу, для чего набор данных автоматически вызывает метод CheckBrowseMode.
 
Для перемещения указателя текущей записи в наборе данных используются следующие методы:
  • процедура First - установка на первую запись;
  • процедура Next - установка на следующую запись (при вызове метода для последней записи указатель не перемещается);
  • процедура Last - установка на последнюю запись;
  • процедура prior - установка на предыдущую запись (при вызове метода для первой записи указатель не перемещается);
  • функция int __fastcall MoveBy(int Distance); - перемещение на число записей, определяемое параметром Distance. Если его значение больше нуля, то перемещение осуществляется вперед, если меньше, то назад. При нулевом значении параметра указатель не перемещается. Если заданное параметром Distance число записей выходит за начало или конец набора данных, то указатель устанавливается на первую или на последнюю запись. В качестве результата возвращается число записей, на которое переместился указатель.
При перемещении указателя текущей записи учитываются ограничения и фильтр, определенные для набора данных. Таким образом, перемещение выполняется по записям набора данных, которые он содержит в текущий момент времени. Число записей определяется свойством Recordcount.
 
Значения указателя текущей записи изменяют также методы, связанные с поиском записей, например, метод FindFirst. Они рассматриваются далее в этой главе.
При изменении порядка сортировки набора данных расположение его записей может измениться, что чаще всего и происходит, но указатель по-прежнему адресует на первоначальную запись, даже если она находится на другом месте и имеет новое значение свойства RecNo.
Рассмотрим следующий пример:
void __fastcall TForm1::ButtonlClick(TObjееt *Sender)
{
float s;
int n;
s = 0;
// Установка текущего указателя на первую запись
Table1->First();
for (n = 1; n<=Table1->RecordCount; n++) {
s = s + Table1->FieldByName("Стоимость")->AsFloat;
// Перемещение текущего указателя на следующую запись
Table1->Next();
}
Edit1->Text = FloatToStr(s);
}
В приведенной процедуре перебираются все записи набора данных Table1, при этом в переменной s накапливается сумма значений, содержащихся в поле Стоимость. Перебор записей осуществляется с помощью метода Next, вызываемого в цикле. Предварительно с помощью метода First указатель устанавливается на первую запись. После выполнения кода указатель будет установлен на последнюю запись.
 
Аналогичным образом можно перебрать все записи набора данных, начиная с последней. Естественно, при этом нужно вызывать методы Last и Prior. Для контроля положения указателя текущей записи можно использовать свойство RecNo, которое содержит номер записи, считая от начала набора данных (для локальных таблиц dBase и Paradox).
 
Для таблиц Paradox свойство RecNo можно использовать еще и для перехода к записи с известным номером: такой переход выполняется установкой свойства RecNo в значение, равное номеру нужной записи. Например:
void __fastcall TForm1::Button2Click(T0bject *Sender)
{
Table1->RecNo = StrToInt(Edit2->Text);
}
При нажатии кнопки Button2 указатель текущей записи набора данных Table1 устанавливается на запись, номер которой содержит редактор Edit1.
 
Для определения начала и конца набора данных при перемещении указателя текущей записи можно использовать соответственно свойства Bof и Eof типа bool. Эти свойства доступны для чтения при выполнении приложения. Свойство Bof показывает, находится ли указатель на первой записи набора данных. Этому свойству присваивается значение true при установке указателя на первой записи, например, сразу после вызова метода First. Свойство Eof показывает, находится ли указатель на последней записи набора данных. Этому свойству устанавливается значение true при размещении указателя на последней записи.
Для пустого набора данных свойства Bof и Eof имеют значение true.
При изменении порядка сортировки или фильтрации, а также при удалении или добавлении записей значения свойств Bof и Eof могут изменяться. Например, если направление сортировки изменяется на противоположное, то первая запись становится последней.
При работе с таблицами одновременно нескольких приложений, когда постоянно добавляются или удаляются записи, значения свойств Bof и Eof соответствуют действительному состоянию набора данных в определенные моменты времени. Так, свойству Eof устанавливается значение true сразу после выполнения метода Last. Если после этого другим приложением в конец набора данных добавлена новая запись, то значение свойства Eof становится неправильным.
Рассмотрим еще один пример, иллюстрирующий работу с указателем текущей записи:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
float s;
int n;
s = 0;
Table1->First();
while (!Table1->Eof)
{
s = s + Table1->FieldByName("Стоимость")->AsFloat;
Table1->Next();
}
Edit1->Text = FloatToStr(s);
}
Как и в предыдущем примере, здесь перебираются все записи набора данных Table1 и подсчитывается сумма значений, содержащихся в поле Стоимость. Отличие заключается в том, что использован итерационный цикл с верхним окончанием, условием выхода из которого является достижение последней записи набора данных.
 
Иногда в цикле выполняются сложные действия. При этом на перебор записей набора данных может потребоваться достаточно большое время, в течение которого приложение (и компьютер) не реагирует на команды пользователя. Поэтому в циклы, надолго загружающие работой компьютер, рекомендуется вставлять вызов метода Application->ProcessMessages();, обеспечивающий системе Windows возможность обрабатывать сообщения. Кроме того, программист должен предусмотреть досрочный выход из длительного цикла, например, с помощью переменной-признака.
 
Перед началом длительного цикла обработки записей БД и выполнения расчетов целесообразно выдать предупреждающее сообщение пользователю.
 
При перемещении по записям набора данных связанные с ним визуальные компоненты отображают изменения данных, причем смена отображения может происходить достаточно быстро, вызывая неприятное мелькание на экране. Чтобы избежать этого эффекта, можно программно до начала цикла перебора записей временно отключить набор данных от всех связанных с ним визуальных компонентов, а по окончании цикла снова подключить. Для этого предназначены методы DisableControls и EnableControls.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий