|
Ограничения
Контроль вводимых в поля набора данных
в 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;_
|