Russian Belarusian English German Japanese Ukrainian

Состояния наборов данных

CuBook05

Наборы данных могут находиться в открытом или закрытом состояниях, на что указывает свойство Active типа bool. Если свойству Active установлено значение true, то набор данных открыт. Открытый компонент Table содержит набор данных, соответствующий данным таблицы, связанной с ним через свойство TableName. Для открытого компонента Query набор данных соответствует результатам выполнения SQL-запроса, содержащегося в свойстве SQL этого компонента. Если свойство Active имеет значение false (по умолчанию), то набор данных закрыт, и его связь с БД разорвана.
 
Набор данных может быть открыт на этапе разработки приложения. Если при этом к набору данных через источник данных DataSource подключены визуальные компоненты, например, DBGrid или DBEdit, то они отображают соответствующие данные таблицы БД.
На этапе проектирования приложения визуальные компоненты отображают данные записей набора данных, но перемещение по набору данных и редактирование записей невозможны. Исключение составляет возможность перемещения текущего указателя с помощью полос прокрутки компонента DBGrid.
Если по каким-либо причинам открыть набор данных невозможно, то при попытке установить свойству Active значение true выдается сообщение об ошибке, а свойство Active сохраняет значение false. Одной из причин невозможности открытия набора данных может являться неправильное значение свойства TableName или SQL.
На этапе проектирования свойству Active наборов данных автоматически устанавливается значение false при изменении значения свойств DataBaseName, TableName или SQL.
Приводимый пример демонстрирует управление состоянием набора данных с помощью свойства Active, которое используется для открытия и закрытия набора данных Query1:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->Active = false;
Query1->DatabaseName="BCDEMOS";
Query1->SQL->Clear();
Query1->SQL->Add("select * from country.db");
Query1->Active = true;
}
Если набор данных Query1 связан соответствующим образом с компонентами Datasource1 и DBGrid1, то при выполнении приложения нажатие кнопки приведет к отбору всех записей из таблицы country.db и отображению их с помощью компонента DBGrid1.
 
Управлять состоянием набора данных можно также с помощью методов Open и Close. Метод Open открывает набор данных, его вызов эквивалентен установке свойству Active значения true. При вызове метода Open генерируются события BeforeOpen и AfterOpen, а также вызываются процедуры-обработчики этих событий. Метод Close закрывает набор данных, его вызов эквивалентен установке свойству Active значения false. При вызове метода close генерируются события Beforeclose и Afterclose, а также вызываются процедуры-обработчики этих событий.
 
В примере показывается управление состоянием набора данных (открытие и закрытие) с помощью методов open и close:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query1->Close();
Query1->DatabaseName="BCDEMOS";
Query1->SQL->Clear();
Query1->SQL->Add("select *from country.db");
Query1->Open();
}
События BeforeOpen и AfterOpen имеют тип TDataSetNotifyEvent, который описывается так:
typedef void __fastcall (__closure *TDataSetNotifyEvent)(TDataSet* DataSet);
TDataSetNotifyEvent является указателем на метод, уведомляющий компонент набора данных о наступлении события. Параметр Dataset определяет набор данных, для которого произошло событие.
 
Событие BeforeOpen возникает непосредственно перед открытием набора данных. В обработчике этого события можно выполнить проверку определенных условий, и если они не соблюдаются, то открытие набора данных может быть запрещено.
Обработчик события не содержит специального параметра, с помощью которого можно запретить открытие набора данных. Одним из вариантов запрета открытия является принудительное возбуждение исключения.
Рассмотрим в качестве примера следующую процедуру:
void __fastcall TForm1::Query1BeforeOpen(TDataSet *DataSet)
{
if (!CheckBox1->Checked) Abort();
}
Если флажок checkBox1, управляющий возможностью открытия набора данных, не установлен, то открытие набора данных Query1 блокируется. Для этого с помощью вызова процедуры Abort генерируется «тихое» исключение. В результате операции, связанные с открытием набора данных, отменяются, а пользователю не выдается никаких сообщений об ошибках. В подобных случаях выдачу предупреждающих сообщений должен обеспечивать программист, например, как в приведенной процедуре:
void __fastcall TForm1::Query1BeforeOpen(TDataSet *DataSet)
{
if (!CheckBox1->Checked)
{
MessageDlg("Данные запроса Query1->Name + " недоступны! ", mtError, TMsgDlgButtons() << mbOK, 0);
Abort();
}
Событие AfterOpen генерируется сразу после открытия набора данных. Это событие можно использовать, например, для выдачи пользователю сообщения о возможности работы с данными.
 
В примере демонстрируется открытие набора данных с выдачей соответствующего сообщения:
void __fastcall TForm1::Table1AfterOpen(TDataSet *DataSet)
{
if (CheckBox2->Checked)
{
MessageDlg("Данные таблицы Table1->TableName+ " доступны!", mtInformation, TMsgDlgButtons() << mbOK, 0);
Abort();
}
Если флажок checkBox2, управляющий возможностью выдачи сообщений, Установлен, то при открытии набора данных Table1 пользователю выдается сообщение.
 
Как уже говорилось, при закрытии набора данных возникают события BeforeClose и AfterClose. Они, как и События BeforeOpen и AfterOpen, имеют тип TDataSetNotifyEvent.
 
Закрытие набора данных автоматически не сохраняет текущую запись, т. е. если набор данных при закрытии находился в режимах редактирования или вставки, то произведенные изменения данных в текущей записи будут потеряны. Поэтому перед закрытием набора данных нужно проверять его режим и при необходимости принудительно вызывать метод Post, сохраняющий сделанные изменения. Одним из вариантов сохранения изменений является вызов метода Post в обработчике события BeforeClose, возникающего непосредственно перед закрытием набора данных.
 
Рассмотрим следующий пример:
void __fastcall TForm1::Table1BeforeClose(TDataSet *DataSet)
{
if (Table1->State == dsEdit || Table1->state == dslnsert) Table1->Post();
}
Если набор данных Table1 находится в режиме редактирования или вставки, то перед его закрытием внесенные изменения сохраняются.
При закрытии приложения событие BeforeClose не генерируется, и не сохраненные изменения теряются.
Событие AfterClose возникает сразу после закрытия набора данных, и его можно использовать для выдачи пользователю соответствующих сообщений, как это сделано в приведенной процедуре:
void __fastcall TForm1::Table1AfterClose(TDataSet *DataSet)
{
if (CheckBox2->Checked)
{
Beep();
MessageDlg("Таблица "+ Table1->TableName + " закрыта!", mtInformation, TMsgDlgButtons() << mbOK, 0);
}
Если установлен флажок checkBox2, управляющий режимом выдачи сообщений, то после закрытия набора данных Table1 подается звуковой сигнал и выдается сообщение о закрытии таблицы, связанной с этим набором данных.
 
Заметим, что если при работе приложения используется большое число таблиц, то выдача подобных сообщений может затруднять действия пользователя. Поэтому программист должен предусмотреть возможность отключения выдачи сообщений. В приведенных примерах для этой цели предназначен флажок CheckBox2.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

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