Глава 13. Проверка допустимости данных


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

    Данная глава охватывает следующие темы, относящиеся к проверке допустимости:

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

Три вида проверки допустимости данных


    Существует три различных типа проверки допустимости данных, и ObjectWindows поддерживает их по-разному. Этими тремя видами являются:

    Заметим, что эти методы не являются взаимно-исключающими. Ряд стандартных средств проверки допустимости могут комбинировать в одном механизме проверки допустимости различные методы.

    Важно запомнить, что проверка допустимости выполняется объектом проверки допустимости, а не объектом управляющего элемента редактирования. Если вы уже создали для особого назначения специализированный управляющий элемент редактирования, то возможно сдублировали возможность, встроенную в управляющие элементы редактирования и их средства проверки допустимости.

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

Фильтрация ввода


    Простейший способ обеспечения включения в поле только допустимых данных состоит в обеспечении ввода пользователем только допустимых данных. Например, числовое поле ввода может быть ограничено вводом пользователем только цифровых данных.

    Объект фильтра проверки допустимости ObjectWindows представляет общий механизм, ограничивающий вид символов, которые пользователь может вводить в данном управляющем элементе редактирования. Объекты проверки допустимости рисунков могут также контролировать форматирование и типы символов, которые может набирать пользователь.

Проверка допустимости каждого поля


    Иногда удобно гарантировать, чтобы пользователь обеспечивал для конкретного поля допустимый ввод перед переходом к следующему полю. Этот подход часто называют "проверкой допустимости по табуляции", поскольку переход в новое поле обычно выполняется по клавише Tab.

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

Проверка допустимости полных экранов


    Проверить допустимость полных экранов вы можете тремя различными способами:

Проверка допустимости режимных окон

    Когда пользователь закрывает режимное окно, оно перед закрытием автоматически проверяет допустимость всех своих подобластей просмотра (если закрывающей командой не была cmCancel). Для проверки допустимости всех подобластей окно вызывает метод CanClose каждой подобласти, и если каждый из них возвращает True, то окно можно закрыть. Если любая из подобластей возвращает значение False, то окно закрыть нельзя.

    Пока пользователь не обеспечит допустимые данные, режимное окно с недопустимыми данными можно только отменить.

Проверка допустимости по запросу

    В любой момент вы можете указать окну на необходимость проверки всех его подокон путем вызова метода CanClose. CanClose по существу спрашивает окно "Если сейчас будет дана команда закрытия, являются ли все поля допустимыми?" Окно вызывает методы CanClose всех своих дочерних окон в порядке включения и возвращает True, если все они возвращают значение True.

    Вызов CanClose не обязывает вас фактически закрывать окно. Например, вы можете вызвать CanClose, когда пользователь "нажимает" командную кнопку Save (Сохранение), обеспечивая проверку допустимости данных перед их сохранением.

    Вы можете проверить любое окно (режимное или безрежимное) и в любое время. Однако автоматическую проверку допустимости при закрытии имеют только режимные окна. Если вы используете безрежимные окна ввода данных, то нужно обеспечить, чтобы приложение перед выполнением действий с введенными данными вызывало метод CanClose окна.

Использование механизма проверки допустимости данных


    Использование объекта проверки допустимости данных с управляющим элементом редактирования требует двух шагов:

    После того, как вы построите объект проверки допустимости и свяжите его с управляющим элементом редактирования, вам не потребуется взаимодействовать с ним непосредственно. Управляющий элемент редактирования знает, когда вызывать методы проверки допустимости и в какие моменты.

Построение объектов проверки допустимости


    Так как объекты проверки допустимости не являются интерфейсными объектами, их конструкторам требуется только информация, достаточная для установки критерия проверки допустимости. Например, объект проверки допустимости числового диапазона воспринимает два параметра - минимальное и максимальное значения в допустимом диапазоне:

     constructor TRangeValidator.Init(AMin, AMax: Integer);

Добавление к управляющим элементам редактирования средств проверки допустимости


    Каждый управляющий элемент редактирования имеет поле с именем Validator, установленное по умолчанию в nil, которое может указывать на объект проверки допустимости. Если вы не присваиваете объекта полю Validator, то управляющий элемент редактирования ведет себя так, как описано в Главе 12. После присваивания с помощью вызова SetValidator объекта проверки допустимости управляющий элемент редактирования автоматически проверяется им при обработке основных событий и при самом вызове для проверки допустимости.

    Обычно, как показано ниже, объект проверки допустимости строится и присваивается в одном операторе:

     .
     .
  { создание трехсимвольного управляющего элемента
   редактирования }
     Ed := New(PEdit, Init(@Self, id_Me, '', 10, 10, 50, 30, 3,
                False));
     Ed^.SetValidator(New(PRangeValidator, Init(100, 999)));
     .
     .
     .

Как работает проверка допустимости


    В 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 в качестве отправной точки собственных объектов проверки допустимости.

Фильтрация


    Фильтрующие объекты проверки допустимости - это простая реализация средств проверки допустимости, при которой проверяется только набираемый пользователем ввод. Конструктор фильтрующего объекта проверки допустимости воспринимает один параметр - набор допустимых символов:

     constructor TFilterValidator.Init(AValidChars: TCharSet);
TFilterValidator переопределяет IsValidInput для возврата True только в том случае, если все символы в текущей строке ввода содержатся в наборе символов, переданных конструктору. Управляющие элементы редактирования включают символы только в том случае, если IsValidInput возвращает True, так что нет необходимости переопределять IsValid. Поскольку символы проходят через фильтр ввода, полная строка допустима по определению. Потомки TFilterValidator, такие как TRAngeValidator, могут сочетать фильтрацию ввода с другими проверками завершенной строки.

Проверка диапазона


    Объект проверки допустимости диапазона TRangeVaidator - это потомок TFilterValidator, которые воспринимают только числа и добавляют к итоговым результатам проверку диапазона. Конструктор воспринимает два параметра, определяющим минимальное и максимальное допустимое значение:

     constructor TRangeValidator.Init(AMin, AMax: Integer);

    Объект проверки допустимости диапазона сам строит числовое средство проверки-фильтрации, воспринимающее только цифры '0'..'9' и символы плюса и минуса. Таким образом, наследуемый IsValidInput обеспечивает отфильтрацию только цифр. Затем TRangeValidator переопределяет IsValid, чтобы он возвращал True только если введенные числа находятся в допустимом диапазоне, определяемом в конструкторе. Метод Error выводит блок сообщения, указывающий, что введенное значение находится вне диапазона.

Проверка допустимости с просмотром


    Абстрактный объект проверки допустимости с просмотром TLookupValidator обеспечивает основу для общего типа объекта проверки допустимости, который для определения допустимости сравнивает введенное значение со списком воспринимаемый элементов.

    TLookupValidator - это абстрактный тип, который никогда не используется сам по себе, но служит важным изменением и дополнением к стандартному объекту проверки допустимости.

    Примечание: Пример работы такого объектного типа вы можете найти в разделе по преобразованию строк.

    Новый метод, вводимый объектом TLookupValidator называется Lookup. По умолчанию Lookup возвращает значение False, но при образовании производного абстрактного объекта проверки допустимости c просмотром вы можете переопределить Lookup для сравнения переданной строки со списком и возвращать True, если строка содержит допустимую запись. TLookupValidator переопределяет IsValid для возврата True только если Lookup также возвращает True. В наследующих типах проверки допустимости с просмотром вам следует переопределять не IsValid, а Lookup.

Просмотр строк


    Рабочий пример объекта проверки допустимости с преобразованием представляет TStringLookupValidator, сравнивающий переданную из управляющего элемента редактирования строку с элементами в списке строк. Если переданная строка содержится в списке, метод объекта проверки допустимости с просмотром строки возвращает True. Конструктор воспринимает только один параметр - список допустимых строк:

     constructor TStringLookupValidator.Init(AString:
                                              PStringCollection);

    Чтобы после построения объекта проверки допустимости с просмотром использовать другой список строк, передайте новый список методу NewStringList объекта проверки допустимости (который уничтожает старый список и задает новый). TStringLookupValidator переопределяет методы Lookup и Error, так что Lookup возвращает True, если переданная строка содержится в наборе строк, а Error выводит на экран блок сообщения, указывающий, что строка отсутствует в списке.

Проверка допустимости по шаблону


    Объекты проверки допустимости с шаблоном сравнивают строки, набранные пользователем, с шаблоном, описывающим формат допустимого ввода. Применяемые шаблоны совместимы с теми, которые используются для контроля ввода в реляционной базе данных Paradox фирмы Borland. При построении объекта проверки допустимости по шаблону используется два параметра: строка, содержащая образ шаблона, и булевское значение, указывающее, нужно ли заполнять по шаблону литеральные строки.

    Примечание: Синтаксис шаблонов описывается в справочнике. См. TPXPictureValidator.Picture.

     constuctor TPictureValidator.Init(const APic: String;
                                       AAutoFill: Boolean);

    TPictureValidator переопределяет Error, IsValidInput и IsValid и добавляет новый метод Picture. Изменения в Error и IsValid просты: Error выводит на экран блок сообщения, указывающий, какой формат должна иметь строка, а IsValid возвращает True только если True возвращается функцией Picture, позволяя получать новые производные типы проверки допустимости по шаблону путем переопределения только метода Picture. IsValidInput проверяет символы по мере набора их пользователем, допуская только те символы, которые разрешены в шаблоне формата, и возможно дополняя литеральные символы из шаблона.

    Метод Picture пытается сформатировать заданную строку ввода в соответствии с шаблоном формата и возвращает значение, указывающее степень успеха: полный, неполный или ошибка.