Delphi 3 и создание приложений баз данных


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


НД могут находиться в одном из 6 состояний:

dslnactive

НД закрыт.

dsBrowse

Состояние по умолчанию для открытого НД. Показывает, что записи просматриваются, но в данный момент не изменяются.

dsEdit

НД находится в состоянии редактирования текущей записи (после явно или неявно вызванного метода Edit).

dslnsert

НД находится в состоянии добавления новой записи (после явно или неявно вызванного метода Insert или Append).

dsSetKey

НД находится в состоянии поиска записи по критерию, заданному методами FindKey, GotoKey, FindNearest или GotoNearest. По окончании поиска НД переходит в состояние dsBrowse.

dsCalcFields

Выполняется установление значений вычисляемых полей (по алгоритму, заданному в обработчике события OnCalcFields). В данном режиме изменения в НД вноситься не могут. После выхода из режима НД переходит в предыдущее состояние.

dsFilter

Обрабатывается фильтрация записей в НД при свойстве Filtered, установленном в True. Имеет место текущий вызов события OnFilterRecord для определения того, удовлетворяет ли текущая запись условию фильтрации, описанному в обработчике данного события. После выполнения события OnFilterRecord НД переводится в состояние dsBrowse.

Рассмотрим методы, которые могут переводить БД из одного состояния в другое.

• Inactive—>dsBrowse

НД во время выполнения программы можно открыть методами Table. Open, Query. Open. Во время разработки и во время выполнения НД можно открыть, установив в True свойства Table. Active и Query. Active.

dsBrowse—>Inactive НД во время выполнения программы можно закрыть методами Table. Close, Query. Close. Во время разработки и во время выполнения НД можно закрыть, установив в False свойства Table.Active и Query.Active.

Заметим, что если какая-либо запись на момент закрытия НД находится в режиме редактирования (dsEdit) или добавления новой записи (dslnsert), применение метода Close не приводит к автоматической выдаче метода Post. Таким образом, НД закрывается, находясь в режимах dslnsert или dsEdit, а не dsBrowse. В этом случае изменения, сделанные в записи, не запоминаются. Для перевода НД из указанных режимов в режим dsBrowse, перед тем как НД закрывается, используйте обработчик события BeforeClose. Заметим, что описанная ситуация будет встречаться в первую очередь для внезапно или принудительно закрываемых НД.

• dsBrowse—>dsEdit

Перевести НД в режим редактирования можно методом Edit. После этого значения полей текущей записи можно изменять.

• dsEdit—> dsBrowse

Метод Post приводит к запоминанию измененной записи в НД. Метод Cancel отменяет изменения, сделанные в полях записи. Запись не запоминается в НД.

• dsBrowse—>dslnsert

Перевести НД в режим вставки можно методами Insert или Append, После этого программе становится доступна пустая запись, полям которой нужно присвоить какие-либо значения. Чтобы полям новой записи присвоить умалчиваемые значения , следует воспользоваться обработчиком события OnNewRecord.

dslnsert—> dsBrowse Метод Post добавляет новую запись в НД. Если НД не находится в режиме dslnsert, возбуждается исключительная ситуация. Метод Cancel отменяет добавление новой записи в НД. Содержимое полей, назначенных новой записи, теряется.

• dsBrowse—>dsSetKey

НД находится в данном состоянии, когда осуществляется поиск записи, удовлетворяющей условию, установленному методом SetKey (и затем, возможно, измененному методом EditKey). Именно эти методы и переводят НД в режим dsBrowse. Поиск записи производится одним из следующих методов: GoToKey, GoToNearest, FindKey, FindNearest. В случае успешного или неуспешного завершения метода поиска, НД переводится в состояние dsBrowse.

• dsBrowse—>dsFilter

НД находится в данном состоянии всякий раз, когда приложение обрабатывает событие OnFilterRecord при фильтрации записей (при свойстве Filtered = True). При этом НД переводится из состояния dsBrowse в состояние dsFilter. Это предотвращает модификацию НД во время фильтрации. После завершения вызова обработчика события OnFilterRecord НД переводится в состояние dsBrowse. Вызов события OnFilterRecord производится для каждой записи НД при установке свойства Filtered в состояние True.

Получить текущее состояние НД

можно, используя метод State. Он возвращает следующие константы: dslnactive, dsBrowse, dsEdit, dslnsert, dsSetKey, dsCalcFields, dsFilter.

Пример

IF Tablel.State = dslnactive THEN Table1.Active := True;

Реакция на изменение состояния набора данных.

Событие OnStateChange (компонент DataSource) наступает всякий раз при изменении состояния НД. Следующий пример показывает, как отобразить на экране (в компоненте Label 1) сообщение о текущем состоянии НД:

procedure TForm1.DataSourcelStateChange(Sender: TObject);

var S : String;

begin

CASE Table1.State OF

dslnactive S = 'He активна' ;

dsBrowse S = 'Просмотр' ;

dsEdit S = 'Редактирование';

dslnsert S = 'Вставка';

dsSetKey S = 'Установка ключа' ;

dsCalcFields S = 'Вычисляемое поле' ;

END; {case}

Label1.Caption := S;

end;

Свойства некоторых компонентов, в первую очередь Enabled, могут зависеть от состояния НД. Например, если кнопка Button 1 должна быть доступной для нажатия только в режиме dslnsert, допустим такой код:

procedure TFormI.DataSourcelStateChange(Sender: Tobject) ;

begin

Button1.Enabled := (Tablel.State = dslnsert);

end;




Начало  Назад  Вперед



Книжный магазин