ObjectWindows представляет вам несколько гибких способов проверки допустимости информации, набираемой пользователем в управляющем элементе редактирования, путем связи объектов проверки допустимости с объектами управляющих элементов редактирования. Использование объектов проверки допустимости облегчает добавление механизма проверки допустимости к существующим приложениям ObjectWindows или для изменения способа проверки в поле его данных.
    Данная глава охватывает следующие темы, относящиеся к проверке допустимости:
    Проверка допустимости обрабатывается методом CanClose интерфейсных объектов. В любой момент вы можете проверить содержимое любого конкретного управляющего элемента редактирования или экрана данных, вызвав метод CanClose объекта, но ObjectWindows предусматривает также механизм автоматизации проверки допустимости данных. В большинстве случаев проверка допустимости данных практически не требует от программиста никаких усилий.
    Существует три различных типа проверки допустимости данных,
и ObjectWindows поддерживает их по-разному. Этими тремя видами
являются:
    Заметим, что эти методы не являются взаимно-исключающими.
Ряд стандартных средств проверки допустимости могут комбинировать
в одном механизме проверки допустимости различные методы.
    Важно запомнить, что проверка допустимости выполняется
объектом проверки допустимости, а не объектом управляющего элемента
редактирования. Если вы уже создали для особого назначения
специализированный управляющий элемент редактирования, то возможно
сдублировали возможность, встроенную в управляющие элементы
редактирования и их средства проверки допустимости.
    В разделе данной главы "Как работают средства проверки
допустимости" описываются различные способы, с помощью которых
объекты управляющего элемента редактирования автоматически вызывают
объекты проверки допустимости.
    Простейший способ обеспечения включения в поле только
допустимых данных состоит в обеспечении ввода пользователем только
допустимых данных. Например, числовое поле ввода может быть
ограничено вводом пользователем только цифровых данных.
    Объект фильтра проверки допустимости ObjectWindows
представляет общий механизм, ограничивающий вид символов, которые
пользователь может вводить в данном управляющем элементе
редактирования. Объекты проверки допустимости рисунков могут также
контролировать форматирование и типы символов, которые может набирать
пользователь.
    Иногда удобно гарантировать, чтобы пользователь обеспечивал
для конкретного поля допустимый ввод перед переходом к следующему
полю. Этот подход часто называют "проверкой допустимости по
табуляции", поскольку переход в новое поле обычно выполняется по
клавише Tab.
    В качестве примера можно привести приложение, которое
выполняет поиск в базе данных, где пользователь вводит в поле
некоторые виды ключевой информации, а приложение отвечает на это
считыванием соответствующей записи и фильтрацией остальных полей. В
таком случае вашему приложению перед действием по клавише
требуется проверка, что пользователь набрал в этом ключевом поле
правильную информацию.
    Проверить допустимость полных экранов вы можете тремя
различными способами:
    Когда пользователь закрывает режимное окно, оно перед
закрытием автоматически проверяет допустимость всех своих подобластей
просмотра (если закрывающей командой не была cmCancel). Для
проверки допустимости всех подобластей окно вызывает метод CanClose
каждой подобласти, и если каждый из них возвращает True, то окно
можно закрыть. Если любая из подобластей возвращает значение
False, то окно закрыть нельзя.
    Пока пользователь не обеспечит допустимые данные, режимное
окно с недопустимыми данными можно только отменить.
    В любой момент вы можете указать окну на необходимость
проверки всех его подокон путем вызова метода CanClose. CanClose по
существу спрашивает окно "Если сейчас будет дана команда
закрытия, являются ли все поля допустимыми?" Окно вызывает методы
CanClose всех своих дочерних окон в порядке включения и
возвращает True, если все они возвращают значение True.
    Вызов CanClose не обязывает вас фактически закрывать окно.
Например, вы можете вызвать CanClose, когда пользователь
"нажимает" командную кнопку Save (Сохранение), обеспечивая проверку
допустимости данных перед их сохранением.
    Вы можете проверить любое окно (режимное или безрежимное) и
в любое время. Однако автоматическую проверку допустимости при
закрытии имеют только режимные окна. Если вы используете
безрежимные окна ввода данных, то нужно обеспечить, чтобы приложение
перед выполнением действий с введенными данными вызывало метод
CanClose окна.
    Использование объекта проверки допустимости данных с
управляющим элементом редактирования требует двух шагов:
    После того, как вы построите объект проверки допустимости и
свяжите его с управляющим элементом редактирования, вам не
потребуется взаимодействовать с ним непосредственно. Управляющий
элемент редактирования знает, когда вызывать методы проверки
допустимости и в какие моменты.
    Так как объекты проверки допустимости не являются
интерфейсными объектами, их конструкторам требуется только информация,
достаточная для установки критерия проверки допустимости.
Например, объект проверки допустимости числового диапазона
воспринимает два параметра - минимальное и максимальное значения в
допустимом диапазоне:
    Каждый управляющий элемент редактирования имеет поле с
именем Validator, установленное по умолчанию в nil, которое может
указывать на объект проверки допустимости. Если вы не
присваиваете объекта полю Validator, то управляющий элемент редактирования
ведет себя так, как описано в Главе 12. После присваивания с
помощью вызова SetValidator объекта проверки допустимости
управляющий элемент редактирования автоматически проверяется им при
обработке основных событий и при самом вызове для проверки
допустимости.
    Обычно, как показано ниже, объект проверки допустимости
строится и присваивается в одном операторе:
    В ObjectWindows предусмотрено несколько видов объектов
проверки допустимости, которые должны охватывать большинство ваших
потребностей по проверке данных. Из абстрактных типов проверки
допустимости вы можете также построить свои собственные
производные типы.
    В данном разделе освещаются следующие темы:
    Каждый объект проверки допустимости наследует от
абстрактного объектного типа TValidator четыре важных метода. Различным
образом переопределяя эти методы, наследующие объекты проверки
допустимости выполняют свои конкретные задачи по проверке. Если
вы собираетесь модифицировать стандартные объекты проверки
допустимости или написать собственные объекты проверки допустимости,
то нужно понимать, что делает каждый из этих методов и как их
используют управляющие элементы редактирования.
    Этими четырьмя методами являются следующие:
    Единственными методами, вызываемыми вне объекта, являются
Valid и IsValidInput. Error и IsValid - единственные методы,
вызываемые другими методами объекта проверки допустимости.
    Основным внешним интерфейсом с объектами проверки
допустимости данных является метод Valid. Аналогично методу CanClose
интерфейсных объектов, Valid представляет собой булевскую функцию,
которая возвращает значение True, если переданная ей строка
содержит допустимые данные. Один из компонентов метода CanClose
управляющего элемента редактирования является вызов метода Valid с
переданным ему текущим текстом управляющего элемента
редактирования.
    При использовании средств проверки допустимости с
управляющими элементами редактирования вам никогда не требуется вызывать
или переопределять метод Valid объекта проверки допустимости. По
умолчанию Valid возвращает True, если возвращает True метод
IsValid. В противном случае для уведомления пользователя об
ошибке и возврата значения False вызывается Error.
    Объекты проверки допустимости содержат виртуальный метод
IsValid, который воспринимает в качестве единственного аргумента
строку и возвращает True, если строка представляет допустимые
данные. IsValid - это метод, который выполняет фактическую
проверку допустимости, так что если вы создаете собственные объекты
проверки допустимости, то почти всегда переопределяете IsValid.
    Заметим, что метод IsValid не вызывается вами явно.
Используйте для вызова IsValid метод Valid, так как для уведомления
пользователя в случае возврата методом IsValid значения False
Valid вызывает метод Error. Не путайте также проверку
допустимости сообщением об ошибке.
    Когда объект управляющего элемента редактирования получает
имеющее для него значение событие нажатия клавиши, он вызывает
метод IsValidInput объекта проверки допустимости. По умолчанию
методы IsValid всегда возвращают True. Это означает, что
воспринимаются все нажатия клавиш. Однако, наследующие объекты проверки
допустимости могут переопределять метод IsValidInput, чтобы
отфильтровывать нежелательные нажатия клавиш.
    Например, средства проверки допустимости диапазона, которые
используются для числового ввода, возвращают из IsValidInput True
только для цифр и символов '+' и '-'.
    IsValidInput воспринимает два параметра. Первый параметр
это параметр-переменная, содержащая текущий текст ввода. Второй
параметр - это булевское значение, указывающее, следует ли перед
попыткой проверки допустимости применять к строке ввода
дополнение или заполнение. TPictureValidator - это единственный из
стандартных объектов проверки допустимости, использующий второй
параметр.
    Виртуальный метод Error уведомляет пользователя, что
содержимое управляющего элемента редактирования не прошло проверку
допустимости. Стандартные объекты проверки допустимости в общем
случае представляет простой блок сообщения, уведомляющий
пользователя, что содержимое ввода недопустимо, и описывающее, каким
должен быть правильный ввод.
    Например, метод Error для проверки допустимости диапазона
создает блок сообщения, указывающий, что значение в управляющем
элементе редактирования не находится между указанными минимальным
и максимальным значениями.
    Хотя большинство объектов проверки допустимости
переопределяют Error, вам не следует вызывать его непосредственно. Метод
Error вызывается методом Valid, если IsValid возвращает False
(что является единственным моментом, когда необходимо вызывать
Error).
    ObjectWindows включает в себя шесть стандартных типов
объектов проверки допустимости, включая абстрактный объект проверки
допустимости и следующие пять специальных типов таких объектов:
    Абстрактный тип TValidator служит базовым типом для всех
объектов проверки допустимости, но сам по себе он не делает
ничего полезного. По существу, TValidator - это объект проверки
допустимости, для которого всегда допустим любой ввод: IsValid и
IsValidInput возвращают True, а Error не выполняет никаких
функций. Наследующие типы переопределяют IsValid и/или IsValidInput
для фактического определения того, какие значения являются
допустимыми.
    Если никакие из других объектных типов проверки допустимости
не годятся в качестве исходных, вы можете использовать TValidator
в качестве отправной точки собственных объектов проверки
допустимости.
    Фильтрующие объекты проверки допустимости - это простая
реализация средств проверки допустимости, при которой проверяется
только набираемый пользователем ввод. Конструктор фильтрующего
объекта проверки допустимости воспринимает один параметр - набор
допустимых символов:
    Объект проверки допустимости диапазона TRangeVaidator - это
потомок TFilterValidator, которые воспринимают только числа и
добавляют к итоговым результатам проверку диапазона. Конструктор
воспринимает два параметра, определяющим минимальное и
максимальное допустимое значение:
    Объект проверки допустимости диапазона сам строит числовое
средство проверки-фильтрации, воспринимающее только цифры
'0'..'9' и символы плюса и минуса. Таким образом, наследуемый
IsValidInput обеспечивает отфильтрацию только цифр. Затем
TRangeValidator переопределяет IsValid, чтобы он возвращал True
только если введенные числа находятся в допустимом диапазоне,
определяемом в конструкторе. Метод Error выводит блок сообщения,
указывающий, что введенное значение находится вне диапазона.
    Абстрактный объект проверки допустимости с просмотром
TLookupValidator обеспечивает основу для общего типа объекта
проверки допустимости, который для определения допустимости
сравнивает введенное значение со списком воспринимаемый элементов.
    TLookupValidator - это абстрактный тип, который никогда не
используется сам по себе, но служит важным изменением и
дополнением к стандартному объекту проверки допустимости.
    Примечание: Пример работы такого объектного типа вы
можете найти в разделе по преобразованию строк.
    Новый метод, вводимый объектом TLookupValidator называется
Lookup. По умолчанию Lookup возвращает значение False, но при
образовании производного абстрактного объекта проверки допустимости
c просмотром вы можете переопределить Lookup для сравнения
переданной строки со списком и возвращать True, если строка содержит
допустимую запись.
TLookupValidator переопределяет IsValid для возврата True
только если Lookup также возвращает True. В наследующих типах
проверки допустимости с просмотром вам следует переопределять не
IsValid, а Lookup.
Три вида проверки допустимости данных
Фильтрация ввода
Проверка допустимости каждого поля
Проверка допустимости полных экранов
Использование механизма проверки допустимости данных
Построение объектов проверки допустимости
constructor TRangeValidator.Init(AMin, AMax: Integer);
Добавление к управляющим элементам редактирования средств проверки допустимости
.
.
{ создание трехсимвольного управляющего элемента
редактирования }
Ed := New(PEdit, Init(@Self, id_Me, '', 10, 10, 50, 30, 3,
False));
Ed^.SetValidator(New(PRangeValidator, Init(100, 999)));
.
.
.
Как работает проверка допустимости
Методы объекта проверки допустимости
Проверка допустимости данных
Проверка полной строки
Проверка допустимости нажатий клавиш
Сообщение о недопустимых данных
Стандартные средства проверки допустимости
Абстрактный объект проверки допустимости
Фильтрация
constructor TFilterValidator.Init(AValidChars: TCharSet);
TFilterValidator переопределяет IsValidInput для возврата
True только в том случае, если все символы в текущей строке ввода
содержатся в наборе символов, переданных конструктору.
Управляющие элементы редактирования включают символы только в том случае,
если IsValidInput возвращает True, так что нет необходимости
переопределять IsValid. Поскольку символы проходят через фильтр
ввода, полная строка допустима по определению.
Потомки TFilterValidator, такие как TRAngeValidator, могут
сочетать фильтрацию ввода с другими проверками завершенной
строки.
Проверка диапазона
constructor TRangeValidator.Init(AMin, AMax: Integer);
Проверка допустимости с просмотром