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

Конструируя диалоговое окно с полями ввода текстовой или числовой информации, желательно иметь механизм проверки вводимых данных, чтобы, например исключить случайный ввод вместо фами­лии строки "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 (в этом случае автоматически изменится и цветной символ на кнопке). Нажатие на кнопку "Отмена" не вызывает проверку правильности содержимого полей диалога, и закрыть этой кнопкой диалог можно будет и при отсутствии в поле года како­го-либо содержимого.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: