Глава 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
* IsValid
* IsValidInput
* Error
Единственными методами, вызываемыми вне объекта, являются
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 пытается сформатировать заданную строку ввода
в соответствии с шаблоном формата и возвращает значение, указы-
вающее степень успеха: полный, неполный или ошибка.
Назад | Содержание | Вперед