Пропустить навигацию.
Главная

Специфика работы с объектом MaskEdit в средах BCB и Delphi

Объект MaskEdit предназначен для ввода символьных строк по шаблону, заданному значением свойства EditMask. В отличие от среды VB набор шаблона и установка символа замещения (Character for Blanks) осуществляется здесь в специальном диалоговом окне (рис. 3.10). Здесь же вам продемонстрируют вид окна ввода, каким он будет в работающем приложении. Дополнительные удобства заключаются в возможности просмотреть и выбрать типовые маски для ввода наиболее распространенных данных — телефонов, кодов адреса, дат, значений времени и т.п. Галочка слева от метки Save Literal Characters позволяет считывать введенный код из свойства Text, включая литеральные символы маски. Если галочка в этой строке отсутствует, то считанное значение содержит только набиравшиеся символы. Если содержимое окна ввода извлекается из свойства EditMask, то вместе с набранными символами извлекаются и литералы независимо от метки в окне Input Mask Editor. Маску ввода можно извлечь и из файла с расширением dem. Для этого в редакторе маски имеется кнопка Masks… .

Обработка строк

Рис 3.10. Окно редактора маски ввода

Управляющие символы маски здесь несколько иные, чем в среде VB (см. табл. 3.3).

Таблица 3.3

Управляющий символ маски Символ, который должен или может быть набран в данной позиции
! Если это символ представлен в шаблоне, то недовведенные необязательные символы превращаются в лидирующие пробелы. В противном случае недостача восполняется пробелами в конце введенной строки.
> Все буквы в разрешенных позициях, начиная с данной, будут заменяться большими до тех пор, пока не встретится символ <.
< Все буквы в разрешенных позициях, начиная с данной, будут заменяться малыми до тех пор, пока не встретится символ >.
<> Блокировка замены вводимых букв кодами другого регистра
\ Следующий символ считать литералом, даже если он совпадает с одним из управляющих.
L Буква A-Z, a-z (ввод обязателен)
l Буква A-Z, a-z (ввод не обязателен)
A Буква или цифра (ввод обязателен)
a Буква или цифра (ввод не обязателен)
C Любой символ (ввод обязателен)
c Любой символ (ввод не обязателен)
0 Цифра (ввод обязателен)
9 Цифра (ввод не обязателен)
# Цифра, знак + или — (ввод не обязателен) ???
: Разделитель компонент времени — часов, минут, секунд (возможна замена в соответствии с настройкой операционной системы)
/ Разделитель компонент даты — день, месяц, год (возможна замена в соответствии с настройкой операционной системы)
; Разделитель трех компонент маски
_ Символ подчерк вставляет пробелы в текст

Маска ввода, вообще говоря, представлена тремя компонентами, которые разделяются точкой с запятой. Первая часть — собственно маска. Вторая часть может быть равна 0 или 1 в зависимости от того, сохраняются или не сохраняются литералы в значении свойства Text. Третья часть состоит из символа замен, которым отображаются разрешенные позиции в поле ввода.

Алгоритм работы объекта MaskEdit отработан гораздо лучше, чем в среде VB. Курсор всегда переходит в нужную позицию, даже если вводимые символы содержатся среди литералов шаблона.

Ниже приводится текст обработчика события OnChange, которое происходит при вводе или изменении каждого символа в разрешенных позициях окна MaskEdit. Каждый раз при возникновении такого события содержимое окна ввода переносится в заголовок метки Label1, и для этого понадобилась всего одна строка программы. Вид окна приложения в процессе работы показан на рис. 3.11. Для сокращения времени набора код города включен в качестве литералов маски.

Приложение 3_16 (BCB). Ввод номера телефона

void __fastcall TForm1::MaskEdit1Change(TObject *Sender)

{

Label1->Caption=MaskEdit1->Text;

}

Обработка строк

Рис. 3.11. Вид окна в процессе набора номера телефона

Приложение 3_17 (Delphi). Ввод номера телефона

В приводимом ниже приложении добавлен обработчик события OnKeyPress, который, принимая код клавиши <Enter>, производит очистку поля ввода. Однако засылка пустой строки в свойство Text восстанавливает в окне ввода маску, обеспечивая тем самым подготовку к вводу следующего номера телефона. Точно такая же "очистка" произойдет и в случае, когда вы, выделив все содержимое окна, нажмете клавишу <Delete>.

procedure TForm1.MaskEdit1Change(Sender: TObject);

begin

Label1.Caption:=MaskEdit1.Text;

end;

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);

begin

if Key=Chr(13) then MaskEdit1.Text:='';

end;