The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Оптимальный путь ввода данных

By Matt Hamilton - mhamilton@bunge.com.au

Перевод Руденко Е.В.   janer@newmail.ru   июнь 2001 года

 

Какую форму вы используете для ввода данных в вашу базу данных? 

Я часто делаю так:

Во-первых, я вставляю запись, а затем показываю диалог, подобный этому :

procedure TMainWindow.NewButtonClick(Sender: TObject);
begin
   DataModule1.MyTable.Insert;
   if DataEntryDialog.ShowModal = mrOk then
      DataModule1.MyTable.Post
   else
      DataModule1.MyTable.Cancel;
end;
Затем, в событии OnСlick кнопки  OK , я проверяю правильность ввода данных:
procedure TDataEntryDialog.OkButtonClick(Sender: TObject);
begin
   ModalResult := mrNone;

   // в данном примере проверяется  - не пустое ли поле ввода
   if DataModule1.MyStringField.AsString = '' then
   begin

      ShowMessage('Вы должны ввести данные в данное поле !');
      ActiveControl := MyStringEdit;
   end
   else
      ModalResult := mrOk;
end;

Итак, это прекрасно работает, но мне это перестало нравиться  по одной существенной причине. Форма ввода данных должна  "знать слишком много" о "формальных правилах" , по которым обрабатываются данные. Вся логика типа  "это поле не может быть пустым" должна храниться в модуле данных.

Ниже приведен способ это сделать. Он использует пользовательское прерывание для передачи сведений об ошибке диалогу ввода данных. Первое изменение - это способ показа диалога. Мы собираемся сохранять данные при нажатии кнопки OK , так что нам необходимо сделать возможность отката при ошибке:

procedure TMainWindow.NewButtonClick(Sender: TObject);
begin
   DataModule1.MyTable.Insert;
   if DataEntryDialog.ShowModal <> mrOk then
      DataModule1.MyTable.Cancel;
end;
Далее, мы добавим пользовательское прерывание в наш модуль данных.  Для этого введем:
type
   EMyStringNotEntered = class(Exception);
Затем в событии  BeforePost компонента MyTable, мы проводим такую же проверку:
procedure TDataModule1.MyTableBeforePost(Sender: TObject);
begin
   if MyStringField.AsString = '' then
      raise EMyStringNotEntered.Create('Вы должны ввести данные в поле MyString');
end;
Окончательно, мы модифицируем событие OnClick кнопки OK , чтобы вызвать обработку нашего прерывания:
procedure TDataEntryDialog.OkButtonClick(Sender: TObject);
begin
   try
      ModalResult := mrNone;

      DataModule1.MyTable.Post;

      { если не было прерывания, то все OK! }
      ModalResult := mrOk;
   except
      on E: EMyStringNotEntered do
      begin
         ShowMessage(E.Message);
         ActiveControl := MyStringEdit;
      end;
   end;
end;

Теперь нам необходимо только одно - знать имена прерываний , которые вы определяете.

 

Matt Hamilton
Возврат в Tips&Tricks