Russian Belarusian English German Japanese Ukrainian

Источник данных

CuBook3.55

Источник данных используется как промежуточное звено между набором данных и визуальными компонентами, с помощью которых пользователь управляет этим набором данных. В С++ Builder источник данных представлен компонентом DataSource.
 
Для указания набора данных, с которым связан источник данных, служит свойство DataSet типа TDataSet последнего. Визуальные компоненты связаны с источником данных через свои свойства DataSource. Обычно связь между источником и набором данных устанавливается на этапе проектирования в Инспекторе объектов, но при необходимости эту связь можно установить или разорвать динамически. При смене у компонента DataSource набора данных визуальные компоненты автоматически подключаются к новому набору данных.
 
Указать набор данных можно, например, так:
DataSource1->DataSet = NULL;
DataSource1->DataSet = Table2;
DataSource1->DataSet->Open();
Здесь для компонента DataSource1 имеющаяся связь с некоторым набором данных (связанным с этим компонентом) закрывается, затем назначается и открывается набор данных Table2.
 
Для анализа состояния, в котором находится набор данных, можно использовать свойство State типа TDataSetstate именно источника данных (компонента DataSource), а не самого набора данных (например, Table). При каждом изменении состояния набора данных для связанного с ним источника данных DataSource генерируется событие OnStateChange типа TNotifуEvent.
 
Если набор данных является редактируемым, то свойство AutoEdit типа bool определяет, может ли он автоматически переводиться в режим модификации при выполнении пользователем определенных действий. Например, для компонентов DBGrid и DBEdit таким действием является нажатие алфавитно-цифровой клавиши, когда компонент находится в фокусе ввода. По умолчанию свойство AutoEdit имеет значение true, и автоматический переход в режим модификации разрешен. Если необходимо защитить данные от случайного изменения, то одной из предпринимаемых мер является установка свойству AutoEdit значения false.
Значение свойства AutoEdit влияет на возможность редактирования набора данных со стороны пользователя. Программно можно изменять записи независимо от значения этого свойства.
Вне зависимости от значения свойства AutoEdit пользователь может переводить набор данных в режим модификации путем нажатия кнопок компонента DBNavigator.
При изменении данных текущей записи генерируется событие onDatachange типа TDatachangeEvent, описанного так:
typedef void __fastcall (__closure *TDataChangeEvent) (TObject* Sender, TField* Field);
Параметр Field указывает на измененное поле; если данные изменены более чем в одном поле, то этот параметр имеет значение NULL. Отметим, что в большинстве случаев событие OnDatachange генерируется и при переходе к Другой записи. Это происходит, если хотя бы одно поле записи, ставшей текущей, содержит значение, отличное от значения этого же поля для записи, которая была текущей. Событие onDatachange можно использовать, например, для контроля положения указателя текущей записи и выполнения действий, связанных с его перемещением. Это событие генерируется также при открытии набора данных.
Вот как осуществляется контроль перемещения указателя текущей записи:
void __fastcall TForm1::DataSource1DataChange(TObject *Sender, TFieid *Field)
{
Label1->Caption = "Запись номер " + IntToStr{Table1->RecNo);
}
При модификации текущей записи, кроме события OnDataChange, генерируется еще событие OnUpdateData типа TNotifуEvent. Оно возникает непосредственно перед записью данных в БД, поэтому в его обработчике можно предусмотреть дополнительный контроль и обработку введенных в поля значений, а также некоторые другие действия, например, отказ от изменения записи.
 
Иногда в визуальных компонентах требуется отключать отображение полей записей набора данных, например, при переборе записей в цикле их обработки, поскольку при этом возникает мелькание данных вследствие их быстрой смены. Для управления отображением записей можно использовать свойство Enabled типа bool источника данных.
 
Рассмотрим пример, демонстрирующий, как производится такое управление:
void __fastcall TForm1::Button6Click(TObject *Sender)
{
// Отключение отображения записей
DataSource1->Enabled = false;
Table1->First();
for (int n = 1; n <= Table1->RecordCount; n++) {
// Обработка записи набора данных Table1
Table1->Next();
}
// Включение отображения записей
DataSource1->Enabled = true;
}
В цикле перебираются все записи набора данных Table1. Перед началом цикла отображение записей в визуальных компонентах отключается, а после цикла включается. Эти действия также можно выполнить, используя методы DisableControls и EnableControls набора данных.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

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


Защитный код Обновить