Russian Belarusian English German Japanese Ukrainian

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

Переход по закладкам

CuBook25

Побочным эффектом выполнения ряда операций с наборами данных является изменение положения указателя текущей записи. Часто этот эффект нежелателен, т.к. после выполнения такой операции указатель находится не в том месте, где был до начала операции. При этом приходится снова отыскивать нужную запись и позиционировать на ней указатель, что неудобно даже при небольшом количестве записей.
 
Примером такой операции является рассмотренный выше расчет суммы значений по полю стоимость, при котором выполняется перебор всех записей в прямом или обратном порядке. По окончании цикла указатель находится на первой или последней записи, а не там, где он был до начала суммирования.
Положение указателя текущей записи может измениться также при формировании отчета из записей набора данных.
Для восстановления прежнего положения текущего указателя можно использовать, например, поиск записей: до начала операции данные текущей записи запоминаются, а после ее выполнения осуществляется поиск записи по этим данным. Похожим вариантом восстановления прежнего положения указателя является использование номера записи в наборе данных, который доступен через свойство RecNo.
 
Переход на определенную запись может понадобиться также для позиционирования указателя на запись, информация о которой была сохранена. Осуществляемые при этом действия не отличаются от указанных ранее. Информация, необходимая для выполнения последующего перехода к требуемой записи, может запоминаться предварительно в удобный момент, например, при просмотре или редактировании записи.
 
Вот пример, иллюстрирующий, как восстановить положение текущего указателя:
int RecordNumber;
...
void __fastcall TForm1::ButtonlClick(TObject *Sender)
{ // Запоминание номера текущей записи
RecordNumber = Query1->RecNo;
// Операция, изменяющая положение указателя
}
//--------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // Переход к записи с запомненным номером
Query1->First();
Query1->MoveBy(RecordNumber-1);
}
Здесь в обработчике события нажатия кнопки Button2 для перемещения текущего указателя используется номер записи, запоминаемый в переменной RecordNumber. Объявление int RecordNumber; должно быть размещено в секции Public: заголовочного файла приложения.
 
В таблицах Paradox для возврата к записи можно установить свойству RecNo набора данных предварительно сохраненное значение. Например:
int RecordNumber; // Запоминание номера текущей записи
RecordNumber = Table1->RecNo; // Операция, изменяющая положение указателя
// Переход к записи с запомненным номером
Table1->RecNo = RecordNumber;
Кроме описанных способов, для перехода на определенную запись можно использовать закладки специальные пометки каких-либо записей. Закладка имеет тип твооктагк. С помощью закладки можно ссылаться на различные объекты (в нашем случае на записи набора данных) с помощью методов GetBookmark, GotoBookmark и FreeBookmark.
 
Перед использованием закладку нужно создать, т.е. определить запись, с которой эта закладка связана. Для этого предназначена функция virtual void __fastcall GetBookmark (void);, которая создает закладку на текущей записи набора данных.
 
Иногда закладка может неверно указывать позицию связанной с ней записи, при этом говорят о нестабильности закладки. Стабильность закладки в значительной степени зависит от форматов таблиц. Так, для таблиц dBase закладка всегда стабильна; для таблиц Paradox закладка стабильна, если у таблицы определен главный ключ. Таким образом, закладка устойчиво указывает на связанную с ней запись в тех случаях, когда существует признак, позволяющий однозначно различать записи. В противном случае закладка может быть нестабильной и ошибочно указывать на другую запись набора данных.
 
На установленную закладку можно перейти с помощью метода void __fastcall GotoBookmark(void * Bookmark);. Он позиционирует указатель текущей записи на закладку, указанную параметром Bookmark. Если закладка предварительно не создана, и ее значение равно Nil, то текущий указатель не перемещается.
 
Для удаления закладки используется метод virtual void __fastcall FreeBookmark (void * Bookmark);.Он освобождает закладку перед ее переназначением и освобождает занимаемую ею память.
Попытка перейти на удаленную закладку путем вызова метода GotoBookmark приводит к возникновению исключения, К такому же эффекту приводит попытка повторного освобождения закладки методом FreeBookmark.
Перед использованием закладки целесообразно уточнить, существует ли она. Функция virtual bool __fastcall BookmarkValid(void * Bookmark); проверяет наличие закладки, заданной параметром Bookmark. Если закладка найдена, то в качестве результата функция возвращает значение true, в противном случае false.
 
Можно устанавливать и использовать несколько закладок. Приведем пример использования закладок для перехода к нужным записям:
void __fastcall TForm1::ButtonlClick(TObject *Sender)
{
// Создание закладки bm
bm = Table1->GetBookmark();
Table1->First();
//—------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
// Переход на закладку bm
if (Table1->BookmarkValid(bm))
{Table1->GotoBookmark(bm);}
// Освобождение закладки bm
if (Table1->BookmarkValid(bm))
{Table1->FreeBookmark(bm);}
}
При обработке события нажатия кнопки Button1 на текущей записи набора Данных Table1 устанавливается закладка bm. Далее в приложении могут выполняться операции с записями набора данных Table1. При обработке события нажатия кнопки Button2 для восстановления прежнего положения текущего указателя выполняется переход на закладку, и закладка удаляется. Перед переходом на закладку проверяется ее существование. Объявление закладки TBookmark bm; должно быть размещено в секции Public: заголовочного файла приложения.
 
Аналогичным образом закладки можно использовать и для перехода к заранее выбранным и отмеченным записям.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

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