Приложения для работы с локальными базами данных_______________525

Методы Insert и InsertRecord вставляют новую пустую запись в набор данных,
выполняют еще ряд операций, о которых вы можете посмотреть в справке C++Buil-
der, и переводят State в состояние dslnsert.

Методы EditKey, SetRange, SetRangeStart, SetRangeEnd и ApplyRange, свя-
занные с поиском записи и с заданием допустимого диапазона изменения данных,
переводят State в состояние dsSetKey. Эти методы будут рассмотрены позднее.

Многие другие методы также устанавливают автоматически различные состоя-
ния набора данных. При программировании работы с базой данных надо следить за
тем, чтобы набор данных вовремя был переведен в соответствующее состояние. На-
пример, если вы стали редактировать запись, не переведя предварительно набор
данных в состояние dsEdit методом Edit, то будет сгенерировано исключение EData-
baseError с сообщением «Dataset not in edit or insert mode» — «Набор данных не в ре-
жиме Edit или Insert».

9.11.2 Пересылка записи в базу данных

Пока идет редактирование текущей записи, изменения осуществляются в бу-
фере, а не в самой базе данных. Пересылка записи в базу данных производится то-
лько при выполнении метода Post. Метод может вызываться только тогда, когда
набор данных находится в состоянии dsEdit или dslnsert. Этот метод можно вызы-
вать явно, например, Tablel->Post(). Но кроме того он вызывается неявно при лю-
бых перемещениях по набору данных, т.е. при перемещении курсора на новую те-
кущую запись, если набор данных находится в состоянии dsEdit или dslnsert. От-
менить изменения, внесенные в запись, можно методом Cancel. При выполнении
этого метода, если предварительно не был вызван метод Post, запись возвращается
к состоянию, предшествовавшему редактированию, и набор данных переводится в
состояние dsBrowse.

В ряде случаев плохо то, что метод Post вызывается неявно при перемещениях
по базе данных. Пользователь может по ошибке сделать неверные исправления в
какой-то записи и, переместившись на другую запись, невольно занести их в таб-
лицу без какой-то предварительной проверки. Надо принимать меры, чтобы без
проверки данных и без подтверждения пользователем в базу данных ничего не за-
носилось. Это можно сделать, используя множество событий компонента Table.

Перед началом выполнения каждого из рассмотренных выше методов и после
его выполнения генерируются соответствующие события набора данных Table.
Например, перед выполнением метода Post возникает событие BeforePost, а после
его окончания — событие AfterPost. Аналогичные события Beforelnsert и Afte-
rinsert сопровождают выполнения метода Insert и т.п. Подобные события и надо
использовать для проверки данных и получения подтверждения на их изменение.

Один из множества возможных вариантов заключается в использовании собы-
тия BeforePost. Обработчик этого события может иметь вид:

void   fastcall TFormI::TablelBeforePost(TDataSet *DataSet)

if (проверка введенных данных)
{

if (Application->MessageBox(

"Хотите занести текущую запись в базу данных?",
"Подтвердите занесение в базу данных",
MB_YESNOCANCEL + MB_ICONQUESTION) != IDYES)
(

DataSet->Cancel ();

Abort();