Реализация бизнес-правил в иных компонентах
Бизнес-правила могут реализоваться и при помощи иных компонентов приложения. Обычно при попытке выполнения некоторого действия проверяются значения каких-либо переменных, которые затем станут значениями полей (столбцов) таблицы БД, или - при вводе пользователем неверных значений -блокируется кнопка подтверждения изменений или выхода из формы.
Проверка правильности значения
Приводимый ниже пример проверяет значение в Edit 1.Text на предмет соответствия формату даты. В дальнейшем это значение, приведенное к формату даты, планируется записать в поле типа даты таблицы БД. Проверка производится в обработчике события OnButtonClick (компонент TButton):
procedure TToObrForm.GoButtonClick(Sender: TObject);
var Tmp: TDateTime;
begin
TRY
Tmp := StrToDate(Editl.Text);
EXCEPT
ShowMessage('Неверная дата') ;
Editl.SetFocus;
Exit;
END;//try
end;
Запрет подтверждения изменений в БД
В случае невыполнения какого-либо условия в форме может быть запрещена кнопка, реализующая запоминание внесенных изменения в БД:
procedure TToObrForm.GoButtonClick(Sender: TObject);
var Tmp: TDateTime;
begin
TRY
Tmp := StrToDate(Editl.Text);
EXCEPT
ShowMessage('Неверная дата');
Edit1.SetFocus;
PostButton.Enabled := False;
Exit;
END;//try
end;
Отмена выхода из формы до осуществления каких-либо действий
В случае изменения какого-либо значения и до выполнения какого-либо условия в форме может быть запрещена кнопка, реализующая выход из модальной формы:
procedure TForm1.DBEditlChange(Sender: TObject);
begin
ExitButton.Enabled := False;
end;
procedure TForm1.Table1AfterPost(DataSet: TDataSet) ;
begin
ExitButton.Enabled := True;
end;
Заметим, что из такой формы можно выйти при помощи системного меню и комбинации клавиш Alt + F4. Поэтому нужно отменить для формы системное меню и при попытке выхода в обработчике события OnCloseQuery формы такую попытку блокировать.
Выполнение действий при переходе на другую запись
Событие OnDataChange компонента TDataSource происходит при изменении текущей записи в НД (в режиме dsBrowse} или при изменении какого-либо поля записи (режим dsEdit).
В приводимом примере подразумевается, что для текущей записи в ParentTable по запросу (нажатие кнопки SelectChildRecordsButton) в НД ChildTable фильтруются дочерние записи.
При переходе на новую запись в ParentTable содержимое ChildTable до нового нажатия кнопки SelectChildRecordsButton становится неактуальным. Поэтому таблица TDBGrid, показывающая дочерние записи, окрашивается в серый цвет и визуализируется кнопка SelectChildRecordsButton:
procedure TForm1.ParentDataSourceDataChange(Sender: TObject;
Field: TField) ;
begin
IF ParentTable.State <> dsBrowse THEN Exit;
ChildDBGrid.Enadbled := True;
ChildDBGrid.Color := cISilver;
SelectChildRecordsButton.Visible := True;
end;
Те же действия можно реализовать в обработчике события AfterScroll набора данных, возникающем после перехода на новую запись в НД.