Конструируя диалоговое окно с полями ввода текстовой или числовой информации, желательно иметь механизм проверки вводимых данных, чтобы, например исключить случайный ввод вместо фамилии строки "1936" или вместо года рождения строки "Иван". Библиотека OWL предоставляет несколько классов, специально предназначенных для проверки правильности вводимых данных. Все они имеют в качестве общего прародителя класс TValidator и позволяют проанализировать правильность вводимых данных по различным параметрам - на отсутствие запрещенных символов, соответствие заданному шаблону (например, время обычно вводится в формате чч:мм:сс) или попадание вводимого числа в заданный диапазон. Рассмотрим модификацию примера 28-2, позволяющую контролировать правильность вводимых в диалог данных. Контролю подвергаются поля фамилии, должности и года рождения.
Принципиальные отличия модифицированной программы заключаются лишь в изменении текста конструктора диалогового окна:
MyDialog::MyDialog(TWindow*parent,TResId resId):TDialog(parent,resId){ TEdit* edit; //Указатель на класс TEdit
|
|
TValidator* valid; //Указатель на базовый класс TValidator
edit=new TEdit(this,IDC_NAME,sizeof(tsb.nameEdit)); //Создаем управляющий объект valid=new TFilterValidator("А-Яа-яА-za-z.");//Создаем объект фильтра контроля -edit->SetValidator(valid); //Назначаем этот контроль для управляющему объекта edit=new TEdit(this,IDC_JOB,sizeof(tsb.jobEdit)); //Аналогично для второго объекта valid=new TFilterValidator("А-Яа-я"); //Фильтр для русских букв edit->SetValidator(valid);
edit=new TEdit(this,IDC_YEAR,sizeof(tsb.yearEdit)); //Аналогично для 3-го объекта valid=new TRangeValidator(1900,1999); //Фильтр на принадлежность диапазону edit->SetValidator(valid);
new TCheckBox(this,IDC_M); //Для кнопок контролировать нечего new TCheckBox(this,IDC_F);
TransferBuffer=&tsb; //Назначили ts буфером обмена memset(&tsb,0,sizeof(TSB)); index=0; //Начинаем с карточки #0 }
Прежде всего объявляются указатель на класс TEdit, с помощью которого будут создаваться управляющие объекты для полей ввода и указатель на базовый по отношению ко всем классам контроля класс TValidator для создания объектов-фильтров производных классов (вспомним, что с помощью указателя на базовый класс можно создавать объекты производных классов). Далее для каждого поля ввода выполняется однотипная процедура:
• создается управляющий объект
• создается объект - контролирующий фильтр требуемого класса (в примере используются фильтры
классов TFilterValidator для контроля символов и TRangeValidator для контроля числового диапазона)
• для управляющего объекта вызывается функция SetValidator(), в качестве аргумента которой вы
ступает объект-фильтр
В принципе описанными изменениями можно было бы ограничиться. Программа позволит вводить в поля для фамилии или должности только прописные или строчные буквы (при этом в фамилии допустимы как русские, так латинские буквы, а в должности - только русские), а в поле года - только числа от 1900 до 1999. При вводе в поле года неправильных данных после нажатия кнопок "Добавить" или "ОК" на экран будет выведено предупреждающее окно (без текста).
|
|
Такой простейший вариант контроля неудобен. Во-первых, довольно странно выглядит пустое предупреждающее окно; во-вторых, с помощью кнопки "ОК" нельзя будет закрыть диалог при пустом поле года, так как при нажатии этой кнопки выполняется проверка правильности содержимого окна года, а пустое окно считается неправильным.
Диалоговые окна 265
Для заполнения предупреждающего окна разумной надписью в файл ресурсов надо ввести ресурс STRINGTABLE (текстовые строки) с требуемым текстом в указанном ниже формате:
STRINGTABLE{
IDS_VALNOTINRANGE "Введенное значение не в диапазоне от %ld до %ld." }
Этот ресурс используется той функцией класса контроля, которая выводит на экран предупреждающее окно. Для класса TRangeValidator строка с содержимым предупреждающего окна должна иметь идентификатор IDS_VALNOTINRANGE, значение которого (32522) описано в файле validate.rh. Чтобы не включать весь этот файл в программу, достаточно в файле заголовков повторить строку из него:
#define IDS_VALNOTINRANGE 32522
В результате при вводе неправильного года на экран будет выводиться окно, показанное на рис. 28.8.
Для устранения второго недостатка можно вместо кнопки "ОК" использовать кнопку "Отмена", что достигается путем замены идентификатора ШОК на идентификатор IDCANCEL (в этом случае автоматически изменится и цветной символ на кнопке). Нажатие на кнопку "Отмена" не вызывает проверку правильности содержимого полей диалога, и закрыть этой кнопкой диалог можно будет и при отсутствии в поле года какого-либо содержимого.