Событие OnBeforePost в наборе данных (dataset) в Delphi происходит перед тем, как набор данных сохранит изменения в базу данных. Это событие позволяет вам выполнить пользовательскую логику или проверить данные перед сохранением.
Осуществить проверку данных через событие OnBeforePost можно следующим образом:
procedure TfrmPrihod.adoQuery1BeforePost(DataSet: TDataSet); var iKolvo: Integer; begin iKolvo:=DataSet.FieldByName('Количество').AsInteger; if iKolvo<0 then begin Application.CreateForm(TfrmMessage,frmMessage); frmMessage.Left:=Round(frmPrihod.Left +(frmPrihod.Width-frmMessage.Width)/2); frmMessage.Top:=Round(frmPrihod.Top +(frmPrihod.height-frmMessage.height)/2+20); frmMessage.lblMessage.Caption:='Поле "Количество" должно содержать положительное значение!'; frmMessage.ShowModal(); abort; end; end;
В данном примере имеется набор данных adoQuery1, в котором есть поле «Количество». Пользователь через элемент управления TDBGrid (О том, как настроить красоту в TDBGrid смотрите в статье: «Как улучшить внешний вид DBGrid» и «Как улучшить внешний вид DBGrid (часть 2)») или TDBEdit ввел количество в данное поле и теперь ему нужно сохранить эти данные. Что мы можем сделать в данном случае, чтобы проверить корректность ввода данных. Ну, например, чтобы пользователь случайным образом не ввел отрицательное значение.
Сначала мы считываем значение из поля «Количество» и запоминаем его в переменной.
iKolvo:=DataSet.FieldByName('Количество').AsInteger;
Дальше проверяем, что если наша переменная меньше нуля, то мы выводим диалоговое окно, в котором сообщаем пользователю, что количество должно содержать положительное значение.
В данном примере такое диалоговое окно выводится с помощью отдельной формы, а не с использованием стандартных функций Delphi. На мой взгляд использование собственных окон является более информативным, чем окна, генерируемые стандартными средствами Delphi.
Окно обязательно следует вывести модально, чтобы пользователь обязательно прочитал и не смог проигнорировать данное сообщение:
frmMessage.ShowModal();
Ключевым моментов во всем этом является команда Abort, которая в буквальном смысле останавливает выполнение кода в процедуре приложения. К сведению, процедура в Delphi — это тоже самое, что и метод в C#.
Таким образом, при выполнении данной процедуры происходит вывод окна-предупреждения и последующая остановка выполнения кода приложения.
Теперь пользователь должен будет закрыть окно и внести поправку в значение поля «Количество».
Еще одним вариантом контроля может быть использование события onKeyPress. Оно возникает при нажатии и отпускании кнопки клавиатуры. Данное событие уже относится не к набору данных, а к элементу управления. Это может быть как TEdit, TDBEdit, TDBGrid и т.п. Например, сделаем запрет на ввод отрицательных чисел в объект txtKolVoKeyPress, образованный от класса TEdit:
procedure TfrmProdagi.txtKolVoKeyPress(Sender: TObject; var Key: Char); begin if not (Key in ['0'..'9', #8]) then Key := #0; end;
Как видим, процедура очень короткая.
Теперь давайте посмотрим на пример того, как можно запретить ввод с клавиатуры в определённое поле объекта TDBGrid. Это можно сделать и использовав поле набора данных, которое привязано к одноименному полю объекту TDBGrid. Но бывают случаи, когда необходимо ограничить ввод только в одном из элементов управления. В этом случае удобно проводить ограничение именно в в самом элементе управления.
procedure TfrmMatchi.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if DBGrid1.SelectedField.fieldName='Тип_обучения' then key:=Chr(0); end;
В этом коде, если активным является поле «Тип обучения», ну то есть, мы пытаемся в него что-то записать с клавиатуры, то любое нажатие будет сбрасываться путем присваивания параметру Key значения Chr (0). Это может пригодиться в том случае, если у поля есть предустановленные значения, которые должны быть введены в поле. Чаще всего — это список с определенными значениями, одно из которых следует выбрать.
Ну вот, мы рассмотрели несколько примеров того, как можно проводить контроль ввода данных. Если статья была интересная, оставь комментарий и поделись с друзьями!