Ограничения
Контроль вводимых в поля набора данных в Delphi возложен на объекты полей, а не на компоненты отображения данных. Именно в рамках этого вопроса мы рассмотрим работу методов-обработчиков событий базового класса
TField.
Перед сохранением значения поля в БД всегда вызывается метод-обработчик
onvalidate, при этом автоматически проводится проверка на выполнение задаваемых ограничений и ограничений типа данных. Кроме этого, здесь можно предусмотреть свою дополнительную обработку:
procedure TForml.TablelSomeFieldValidate(Sender: TFieid);
begin
if (Sender as TFieid).Value < 0 then
begin
ShowMessage('Значение поля не может быть отрицательным');
(Sender as TFieid).Value := Null;
end;
end;
Различают контроль значения в целом и посимвольный контроль. Метод
OnValidate проверяет значение поля целиком. Если при проверке обнаружена ошибка, то выдается сообщение и фокус формы устанавливается на соответствующем компоненте отображения данных.
Если метод OnValidate не вызвал исключительной ситуации, то при сохранении значения поля в БД вызывается обработчик события
onchange. В принципе, можно предусмотреть операции по контролю данных и в этом методе, но тогда в случае ошибки возникает нежелательная исключительная ситуация, которая может привести к серьезным сбоям в работе приложения.
Проверить текущее значение поля перед его появлением в компоненте отображения данных можно в методе-обработчике
OnGetText. Если параметр DisplayText принимает истинное значение, то в параметре
Text передается значение свойства
DisplayText (значение в строковом формате в таком виде, как оно будет показано в компоненте отображения данных — с символами форматирования). В противном случае в параметре
Text передается текущее значение в строковом формате.
Примечание
При использовании метода-обработчика
OnGetText на разработчика ложится обязанность самостоятельно предусмотреть
передачу значения в компонент отображения данных, в противном случае компонент
останется незаполненным.
В методе-обработчике onSetText можно осуществлять текущий контроль значения в строковом формате в том виде, как оно представлено в компоненте отображения данных. Напомним, что этот обработчик вызывается при каждом изменении свойства
Text класса TField.
Рассмотренные методы-обработчики удобнее всего использовать для проверки текущего значения с точки зрения программной логики. Например, чтобы отпускная цена не была ниже закупочной или чтобы остаток не был больше первоначального количества товара в партии. Для проверки правильности самого значения класс
TField имеет несколько полезных свойств.
Если на сервере БД задано ограничение на некоторое поле, его можно использовать в приложении Delphi при помощи свойства
importedconstraint
Для создания собственного ограничения можно использовать свойство
Customconstraint, в котором применяется синтаксис
SQL:
Value>10
ИЛИ
OutputPrice>InputPricexl.25
При возникновении ошибки совсем не лишним будет, если программа выдаст некое осмысленное сообщение, которое поможет пользователю исправить оплошность. При работе с методами-обработчиками это можно предусмотреть в программном коде.
Для встроенного контроля предусмотрено специальное свойство —
GonstraintErrorMessage, которое выводится в виде сообщения при возникновении ошибки. Согласитесь, что это гораздо проще, чем исправлять и перекомпилировать соответствующие файлы ресурсов. Если приложение работает с сервером БД и возникла ошибка ограничения поля, то выводится сообщение, определяемое сервером, а не этим свойством.
Если для поля заданы ограничения, то свойство
HasConstraints принимает истинное значение.
Посимвольный контроль данных осуществляется свойством
validchars, в котором можно определить допустимые в строковом представлении значения поля символы, и методом
isvalidchar, который определяет допустимость использования переданного в параметре символа.
Еще один мощный инструмент контроля данных предоставляет свойство
EditMask, которое позволяет создавать шаблоны ввода данных, облегчая тем самым работу пользователя и уменьшая возможность ошибки. Рассмотрим правила создания шаблонов.
Шаблон состоит из трех частей.
Первая часть содержит управляющие символы собственно шаблона. Доступные для создания шаблона символы приведены в табл. 13.2.
Таблица 13.2. Управляющие
символы шаблона
|
|
|
|
|
Все символы после этого преобразуются в заглавные
|
|
Все символы после этого преобразуются в строчные
|
|
Все символы после этого остаются в том регистре, как это было задано пользователем
|
|
Символ, следующий за этим, считается алфавитным, а не управляющим
|
|
В позиции этого символа обязательно должен находиться только алфавитный символ
|
|
В позиции этого символа может находиться алфавитный символ
|
|
В позиции этого символа обязательно должен находиться алфавитный символ или цифра
|
|
В позиции этого символа может находиться алфавитный символ или цифра
|
|
В позиции этого символа обязательно должен находиться знак препинания
|
|
В позиции этого символа может находиться знак препинания
|
|
В позиции этого символа обязательно должна находиться цифра
|
|
В позиции этого символа может находиться цифра
|
|
В позиции этого символа может находиться цифра, плюс или минус
|
|
Символ разделения часов, минут и секунд (зависит от системных установок)
|
|
Символ разделения дней, месяцев, годов (зависит от системных установок)
|
|
Символ разделения частей шаблона
|
|
Символ автоматического ввода в текст пробела
|
В первую часть шаблона можно включать любые алфавитные символы (для создания поясняющих надписей, слов и сокращений), если их нет среди управляющих символов. Также можно использовать в качестве алфавитных и управляющие символы, для этого перед ними нужно помещать символ "\".
Вторая часть состоит из одного символа и определяет, могут ли не арифметические символы быть частью вводимого текста. Если здесь расположен ноль, то можно вводить только цифры, если любой другой символ — можно использовать и алфавитные символы.
В третьей части содержится символ, используемый для обозначения мест, запрещенных для ввода.
Части шаблона разделяются точкой с запятой.
Например, шаблон для ввода телефонного номера выглядит следующим образом:
!\{999\)000-0000;1;_
|