Сценарий обновления записей на одной форме с компонентом TDBGrid
Записи набора данных периодически добавляются, изменяются и удаляются Если выполнение указанных действий ложится на пользователя, в приложении должны быть реализованы удобный интерфейс добавления, изменения и удаления записей
Несомненно, действия над набором данных в этом случае тесно связаны с вопросами реализации пользовательского интерфейса в приложении Материал именно такого рода содержится в данном разделе Он будет полезен начинающим разработчикам или тем, кто только начинает изучать Delphi, поскольку показывает, что соединение пользовательского интерфейса и действий над набором данных не является чем-то исключительно сложным
Если Вас не интересует, как можно реализовать в форме интерфейс пользователя для внесения изменений в набор данных, Вы можете пропустить данный раздел
Существует несколько вариантов внесения изменений в набор данных в приложении-
• изменения реализуются при выполнении программного кода Как правило, такой способ внесения изменений в НД используется для транзакционных таблиц, т е таблиц, данные в которых формируются приложением автоматически Например, в транзакционную таблицу "Суммарный отпуск товаров" приложением автоматически вносятся изменения при вводе записей в другую, операционную таблицу БД, "Отпуск товаров"
• изменения в НД вносит пользователь. Реализовать пользовательский интерфейс в этом случае можно одним из следующих способов
• пользователь вносит изменения в НД, пользуясь компонентом TDBGrid. Например, для добавления новой записи в НД он нажимает на клавиатуре кнопку Insert, после чего в TDBGrid появляется новая, пустая строка; вводит данные в поля новой строки, запоминает новую запись (перемещая курсор на другую запись) или отказывается от запоминания, нажимая на клавиатуре кнопку Esc;
• пользователь нажимает одну из трех кнопок "Добавить", "Изменить", "Удалить", которые размещены в той же форме, что и компонент TDBGrid, в котором показываются записи набора данных По нажатию кнопки набор данных переводится в соответствующее состояние и вызывается другая форма, в которую пользователь вводит новые значения полей записи и нажимает кнопку "Запомнить изменения " , "Отменить" или "Подтвердить удаление записи". После этого реализуются необходимые действия, то есть выполняются методы Post, Cancel или Delete;
• пользователь нажимает одну из трех кнопок "Добавить", "Изменить", "Удалить", которые размещены в той же форме, что и компонент TDBGrid, в котором показываются записи набора данных. По нажатию кнопки набор данных переводится в соответствующее состояние и в этой же форме активизируется панель, на которой расположены поля текущей записи набора данных. Пользователь вводит новые значения полей записи, после чего подтверждает или отменяет добавление или изменение записи, при удалении записи ему, разумеется, ничего вводить не нужно, а нужно лишь удаление подтвердить или отменить. Рассмотрим реализацию последнего сценария. Пусть имеется ТБД Sklady, записи которой содержат наименования складов Предположим, что эта ТБД будет использоваться в приложении как справочник Запись состоит из единственного поля Sklad. По этому полю построен первичный индекс, т е. данное поле может содержать только уникальное значение.
Поместим в форму компонент DBGndl для показа записей из ТБД Sklady Первоначальную высоту TDBGrid определим равной 257 Ниже DBGndl поместим в форме панель PanelToInput Values и определим ее как "невидимую" (свойство Visible = False) В'данной панели расположим компонент DBEdit1, который ссылается на поле Sklad Соответственно, когда панель невидима, невидимы и компоненты, в ней расположенные
Поместим в форму панель InsertEditDeletePanel и установим ее свойство Visible = True. В панели разместим экранные кнопки для работы с отдельной записью "BcTaBHTb"(InsertButton), "Изменить" (EditButton), "Удалить" (DeleteButton), и кнопку для выхода "Выйти" (ExitButton) с модальным свойством ModalResult = mrOk
Поместим в форме панель PostCancelPanel и сделаем ее невидимой (свойство Visible = False) Разместим в панели экранные кнопки "Запомнить" (PostButton) и "Отменить"(Сапсе1Вийоп) для запоминания сделанных изменений в БД или отказа от запоминания (рис 7.15)
Совместим местоположение панелей PostCancelPanel и InsertEditDeletePanel, сделав их одинаковыми по размеру (рис. 7.16):
Напишем следующие обработчики нажатия экранных кнопок:
// константы для обозначения высоты TDBGrid
const
NORMAL_HEIGHT = 257; // в режиме просмотра записей
UPDATE_HEIGHT = 193; // в режимах добавления и изменения
// Обработчик нажатия кнопки "Включить"
procedure TFormI.InsertButtonClick(Sender: TObject);
begin
// визуализируем панель с кнопками "Запомнить", "Отменить'
PostCancelPanel.Visible := True;
// делаем невидимой панель с кнопками "Включить",
// "Изменить" и т.д.
InsertEditDeletePanel.Visible := False;
// уменьшаем высоту DBGrid
DBGridl.Height := UPDATE_HEIGHT;
// делаем видимой панель для ввода значения в запись
PanelToInputValues.Visible := True;
// переводим НД в режим добавления записи
Tablel.Insert;
// передаем фокус управления на ввод значения в запись
DBEditI.SetFocus;
end;
// Обработчик нажатия кнопки "Изменить"
procedure TFormI.EditButtonClick (Sender: TObject);
begin
// делаем невидимой панель с кнопками "Включить",
// "Изменить" и т.д.
InsertEditDeletePanel.Visible := False;
// уменьшаем высоту DBGrid
DBGridl.Height := UPDATE_HEIGHT;
// делаем видимой панель для ввода значения в запись
PanelToInputValues.Visible := True;
// переводим НД в режим редактирования записи
Tablel.Edit;
// передаем фокус управления на ввод значения в запись
DBEditI.SetFocus;
end;
// Обработчик нажатия кнопки "Удалить"
procedure TFormI.DeleteButtonClick(Sender: TObject);
begin
// удаляем запись, в случае подтверждения пользователем
IF MessageDIg('Подтвердите удаление записи',
mtConfirmation,[mbYes,mbNo],0) = mrYes THEN
Tablel.Delete;
// передаем управление на DBGrid
DBGridI.SetFocus ;
end;
// Обработчик нажатия кнопки "Запомнить"
procedure TFormI.PostButtonClick(Sender: TObject);
begin
// пытаемся запомнить изменения в ТБД; при возникновении //исключения полагаем, что его причиной является дублирова
//ние ключа. В этом случае сообщаем пользователю и отменяем
//внесение изменений в ТБД
TRY
Tablel.Post;
EXCEPT
on EDBEngineError do begin
MessageDIg('Такая запись уже есть',mtlnformation, [mbOk],0) ;
Tablel.Cancel;
end; {on}
END; {try}
// увеличиваем высоту DBGrid
DBGridI.Height := NORMAL_HEIGHT;
// делаем невидимой панель для ввода значения в запись
PanelToInputValues.Visible := False;
// делаем невидимой панель для ввода значения в запись
PostCancelPanel.Visible := False;
// делаем видимой панель с кнопками "Включить", "Изменить" и т.д.
InsertEditDeletePanel.Visible := True;
// передаем управление на DBGrid
DBGridI.SetFocus ;
end;
// Обработчик нажатия кнопки "Отменить"
procedure TFormI.CancelButtonClick(Sender: TObject);
begin
Tablel.Cancel;
// увеличиваем высоту DBGrid
DBGridI.Height := NORMAL_HEIGHT;
// делаем невидимой панель для ввода значения в запись
PostCancelPanel.Visible := False;
// делаем видимой панель с кнопками "Включить", "Изменить" и т.д.
InsertEditDeletePanel.Visible := True;
// делаем невидимой панель для ввода значения в запись
PanelToInputValues.Visible := False;
// передаем управление на DBGrid
DBGridI.SetFocus;
end;
// Обработчик события выхода из формы.
// Если в этот момент НД находится в состоянии,
// отличном от dsBrowse, т.е. в dslnsert, dsEdit,
// он принудительно возвращается в состояние dsBrowse.
procedure TFormI.FormDeactivate(Sender: TObject);
begin
IF Tablel.State 0 dsBrowse THEN Tablel.Cancel;
end;
В режиме просмотра записей (dsBrowse) видим окно, показанное на рис. 7.17
А в режимах добавления новой записи (dslnsert) или редактирования (dsEdit) видим окно, (рис. 7.18)
При нажатии кнопки "Удалить" выдается модальная форма подтверждения удаления (рис. 7.19). Эта форма реализуется функцией Delphi MessageDlg.