Иллюстрированный самоучитель по Turbo Pascal

Объекты-контролеры

Использование объектов-контроллеров

Контроль текстового ввода

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

var
InpLine: PInputLine;
Validator: PRangeValidator;
begin
{Создаем строку ввода}
InpLine: = New(PInputLine,Init(…));
{Создаем объект-контролер}
Validator: = New(PRangeValidator,Init(0.10));
{Связываем контролер с редактором}
InpLineA.SetValidator(Validator);
…..
end;

Можно объединить оба действия в одном операторе:

InpLine^.SetValidator(New(PRangeValidator,Init(0.10))

При работе совместно с объектом TInputLine контролер может активно воздействовать на ввод пользователя. Это относится к объектам TFilterValidator и TPXPicture-Validator: они контролируют ввод каждого символа и игнорируют нажатие пользователем клавиши, если очередной символ не соответствует требуемому. Объект TPXPictureValidator, кроме того, способен автоматически дополнять ввод пользователя неспециальными символами шаблона. Если, например, шаблон задан следующим образом:

InpLine^.SetValidator(New(PPXPictureValidator, Init('#/#/#',True)))

То нажатие пользователем любых клавиш, кроме цифровых, будет игнорироваться, а сразу после нажатия первой (второй) цифровой клавиши в строке ввода появится символ "/". Вставкой неспециальных символов шаблона управляет второй параметр обращения к методу TPXPictureValidator.Init (True – разрешить вставку, False – запретить).

Проверка других объектов

Хотя чаще всего для реализации текстового ввода Вы будете использовать объект TInputLine или его специализированного потомка, не исключена возможность проверки данных, подготовленных другими видимыми объектами. Для этого в поле Options любого видимого элемента предусмотрен бит ofValidate, единичное состояние которого приведет к тому, что при каждой потере видимым элементом фокуса ввода будет вызываться его метод Valid, который он наследует от TView. Перекрыв этот метод, Вы сможете обратиться к любому объекту-контролеру для проверки данных.

Реализация нестандартного контроля

Возможно, Вам понадобится сконструировать собственный объект-контролер. В этом случае Вы должны помнить, что за контроль отвечают четыре метода базового объекта TValidator: Valid, IsValidInput, IsValid и Error, причем абстрактные методы IsValid и Error перекрываются в потомках, вызываются другими методами объекта-контролера и не предназначены для вызова извне.

Метод Valid получает строку, введенную пользователем, осуществляет ее контроль и возвращает True или False в зависимости от результатов контроля (True означает правильный ввод). Метод IsValidlnput также получает строку символов ввода, однако, в отличие от Valid, он получает ее после каждого изменения пользователем входной строки. Метод IsValidlnput имеет два параметра обращения:

Function TValidator.IsValidlnput(var S: String; SuppressFill: Boolean): Boolean

Параметр SuppressFill указывает, должен ли метод автоматически форматировать строку перед ее проверкой. Если этот параметр имеет значение True, метод должен дополнить подготовленный пользователем ввод S нужными в этом месте символами и только после этого производить контроль. Поскольку параметр S определен как параметр-переменная, метод может вставлять дополнительные символы непосредственно в строку ввода, но ни в коем случае не должен удалять ошибочно введенные символы из нее. Из всех стандартных контролеров только TPXPictureValidator использует SuppressFill = True.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.