В процессе своего функционирования (от открытия методом Open и до закрытия методом close) набор данных может выполнять самые разнообразные операции. Можно просто перемещаться по записям, можно редактировать данные и удалять записи, можно проводить поиск по различным параметрам и т. д. При этом желательно, чтобы все операции выполнялись как можно быстрее и эффективнее.
Набор данных в любой момент времени находится в некотором состоянии, т. е. подготовлен к выполнению действий строго определенного рода. И для каждой группы операций набор данных выполняет ряд подготовительных действий.
Все состояния набора данных делятся на две группы.
Базовый класс TDataSet, инкапсулирующий свойства набора данных, позволяет изменять состояние, а также проверять текущее состояние набора данных.
Текущее состояние набора данных передается в свойство state, имеющее тип TDataSetState:
type TDataSetState = (dslnactive, dsBrowse, dsEdit, dslnsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc);
Для управления состояниями набора данных используются методы open, Close, Edit, Insert.
Таблица 12.1. Автоматические состояния набора данных
Константа состояния |
Описание |
dsNewValue |
Включается при обращении к свойству NewValue поля набора данных |
dsOldValue |
Включается при обращении к свойству OldValue поля набора данных |
dsCurValue |
Включается при обращении к свойству CurValue поля набора данных |
dsInternalCalc |
Включается при расчете значений полей, для которых FindKind = fklnternalCalc |
dsCalcFields |
Включается при выполнении метода onCalcFields |
dsBlockRead |
Включается механизм ускоренного перемещения по набору данных |
dsOpening |
Существует при открытии набора данных методом Open или свойством Active |
dsFilter |
Включается при выполнении метода OnFilterRecord |
Таблица 12.2. Управляемые состояния набора данных
Константа состояния |
Метод |
Описание |
dslnactive |
Close |
Набор данных закрыт |
dsBrowse |
Open |
Данные доступны для просмотра, но недоступны для редактирования |
dsEdit |
Edit |
Данные можно редактировать |
dslnsert |
Insert |
К набору данных можно добавлять новые записи |
dsSetKey |
SetKey |
Включается механизм поиска по ключу. Также могут использоваться диапазоны |
Рассмотрим, как изменяется состояние набора данных при выполнении стандартных операций.
Закрытый набор данных всегда имеет неактивное состояние dsinactive.
При открытии набор данных переходит в состояние просмотра данных dsBrowse. В этом состоянии по записям набора данных можно перемещаться и просматривать их содержимое, но редактировать данные нельзя. Это основное состояние открытого набора данных, из него можно перейти в другие состояния, но любое изменение состояния происходит через просмотр данных (рис. 12.4).
Рис. 12.4. Схема изменения состояний набора данных
При необходимости редактирования данных набор должен быть переведен в состояние редактирования dsEdit, для этого используется метод Edit. После выполнения метода можно изменять значения полей для текущей записи. При перемещении на следующую запись набор данных автоматически переходит в состояние просмотра.
Для того чтобы вставить в набор данных новую запись, необходимо использовать состояние вставки dsinsert. Метод insert переводит набор данных в это состояние и добавляет на месте текущего курсора новую пустую запись. При переходе на другую запись, после проверки на уникальность первичного ключа (если он есть) набор данных возвращается в состояние просмотра.
Состояние установки ключа dsSetKey используется только в табличных компонентах при необходимости поиска методами FindKey и FindNext, а также при использовании диапазонов (метод setRange). Это состояние сохраняется до момента вызова одного из методов поиска по ключу или метода отмены диапазона. После этого набор данных возвращается в состояние просмотра.
Состояние просмотра по блокам dsBlockRead используется набором данных при реализации быстрого перемещения по большим массивам записей без показа промежуточных записей в компонентах отображения данных и без вызова обработчика события перемещения по записям. Для реализации быстрого перемещения по набору данных можно использовать методы DisableControls И EnableControls.