Справочник по компонентам Delphi. Часть 2 - Компонент TMaskEdit
ОГЛАВЛЕНИЕ
Компонент TMaskEdit
TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> TCustomEdit -> TCustomMaskEdit -> TMaskEdit
Модуль MASK
Страница Палитры компонентов Additional
Этот специальный редактор допускает лишь ввод текста, соответствующего заданному программистом шаблону, например, паролей, регистрационных номеров, дат и других данных, которые имеют определенный формат представления.
Шаблон ввода в виде строки содержится в свойстве:
(РЬ) property EditMask: string;
Если он не определен, TMaskEdit работает как обычный редактор. Свойство
(Ro) property IsMasked: Boolean;
показывает, определен ли шаблон редактирования (значение EditMask не равно пустой строке).
"Черновой" текст, содержащий введенные пользователем символы, соответствует свойству:
property EditText: string;
В то же время отформатированный (наложенный на шаблон) текст содержится в свойстве Text.
Опишем правила, применяемые при составлении шаблона. Шаблон состоит из трех частей, разделяемых символом ';' или другим, заменяющим его. Первая часть является обязательной — она определяет собственно маску ввода. Каждому символу в поле ввода редактора соответствует специальный символ в маске, определяющий, что можно ввести на этом месте.
Описатели маски ввода представлены в таблице:
Символ маски | Означает, что на этом месте во вводимом тексте... |
L | должна быть буква (A-Z, a-z, А-Я, а-я). |
I | может быть буква. |
А | должен быть буквенно-цнфровой символ. |
а | может быть буквенно-цифровой символ. |
С | должен быть любой символ ASCII. |
с | может быть любой символ ASCII. |
0 | должна быть любая цифра. |
9 | может быть любая цифра. |
# | может быть любая цифра или знаки '+', •-'. |
"Должен" означает, что пользователь обязан ввести в поле соответствующий символ, "может" — что не обязан. Например, шаблон "LLOO" обязывает пользователя ввести пароль из двух букв и двух цифр, a "LL99" — из двух букв и не более двух цифр.
Кроме описателей полей ввода, в шаблоне могут быть литералы и другие форматирующие символы.
Литералами будем называть символы, которые появляются при отображении строки ввода, но не могут изменяться пользователем и предназначены только для ее оформления. Перед литералом должен стоять символ 'V. Типичный пример — ввод телефонных номеров. Для семизначного номера с возможностью ввода междугороднего кода нужен шаблон "!\(999\)000-0000;1;_". Тогда код города (если он есть) в отформатированном тексте будет заключен в скобки.
Специальные символы приведены в следующей таблице:
Символ | Значение |
\ | Символ, непосредственно предшествующий литералу. |
Разделитель для часов, минут и секунд при вводе времени. | |
/ | Разделитель для дней, месяцев и лет при вводе даты. |
\ | Разделитель полей в маске. |
' | Символ определяет подавление пробелов: если он есть в маске (в любом месте), в выходном тексте подавляются пробелы перед текстом; в противном случае — идущие после текста. |
> | Символ, после которого все вводимые буквы преобразуются к верхнему регистру. |
< | Символ, после которого все вводимые буквы преобразуются к нижнему регистру. |
о | После этой пары символов преобразование регистров отменяется. |
- | Пустое поле при вводе (отображается как пробел). Курсор не будет останавливаться в этой позиции. |
Например, пользователь ввел цифры 1234567. Тогда при действующем шаблоне "999\-99\-00;1;_" свойство Text будет равно "123-45-67", а для шаблона "999\-99\-00;0;_" - "1234567".
Третья часть содержит символ, который будет показываться в полях, предназначенных для ввода. Например, шаблон для ввода номеров машин "L 00\-00 LL;1;X" будет выглядеть как "X ХХ-ХХ XX". По умолчанию этот символ определяется значением константы DefaultBlank(cM. ниже).
Вторая и третья части шаблона могут отсутствовать.
Синтаксис шаблона может быть изменен за счет переопределения программистом специальных символов '_'> ';' и '0'. Для этого нужно изменить определенные в модуле Mask константы:
const DefaultBlank: Char = '_';
MaskFieldSeparator: Char = ';';
MaskNoSave: Char = '0';
Для ввода шаблонов в Delphi есть довольно удобный специальный редактор, содержащий некоторые полезные образцы. К сожалению, в этой версии в нем есть ошибка — при вводе маски он не всегда сразу воспринимает введенные изменения. В этом случае еще раз компилируйте создаваемое приложение.
Непосредственную проверку введенного текста осуществляет метод:
procedure ValidateEdit;
Он обычно вызывается при нажатии кнопки Default в модальной форме и при каждой утере фокуса редактором. При отсутствии введенных символов в тех местах, где они необходимы, возникает исключительная ситуация EDBEditError.
function GetTextLen: Integer;
Функции для форматирования текста
Форматирование текста можно осуществить и без объекта класса TMaskEdit, при помощи описанных в модуле MASK функций:
function FormatMaskText(const EditMask: string; const Value: string): string;
— осуществляет форматирование строки Value по шаблону EditMask;
function MaskGetMaskSave(const EditMask: string): Boolean;
— возвращает значение True, если в обработанном тексте должны сохраняться литералы (соответствует значению второй части шаблона);
function MaskGetMaskBlank(const EditMask: string): Char;
— возвращает символ, который будет использоваться в шаблоне для заполнения (третья часть шаблона);
function MaskGetFldSeparator(const EditMask: string): Integer;
— возвращает положение разделителя, отделяющего первую часть шаблона от последующих. Если он отсутствует, функция возвращает значение -1.