- Обработка строк
- Строковые данные в BCB и методы их обработки
- Отображение строк в поле метки
- Использование компонента TextBox (VB)
- Использование объекта MaskEdBox (VB)
- Специфика компонента RichTextBox (VB)
- Использование компонент типа TEdit (BCB и Delphi)
- Специфика работы с объектом MaskEdit в средах BCB и Delphi
- Объект TextBox в многострочном режиме
Использование объекта MaskEdBox (VB)
Опубликовано admin в Сб, 01/30/2010 - 20:06
Объект MaskEdBox предназначен для ввода символьных данных по установленному шаблону и отличается от компонента TextEdit тем, что на отдельные позиции поля ввода накладывается одно из двух ограничений:
- в данной позиции пользователь может набрать один из символов, разрешенных шаблоном;
- в данной позиции пользователь ничего набрать не может, т.к. ее значение повторяет соответствующую позицию шаблона.
При вводе курсор такие позиции пропускает, поэтому изменить их содержимое нельзя.
Таким образом, шаблон, значение которого устанавливается в свойстве Mask, играет роль фильтра вводимых данных.
Среди стандартных компонент панели General объект MaskEdBox отсутствует и для его подключения к приложению необходимо проделать следующее. Войти в позицию главного меню Project и выполнить команду Components. В появившемся диалоговом окне на закладке Controls выбрать строку Microsoft Masked Edit Control (рис. 2.5), и щелчком мыши установить галочку в соответствующем квадратике слева. После нажатия клавиши OK новый компонент дополнит стандартный набор. Этим набором сможет пользоваться только данное приложение, в противном случае вновь добавляемые к разным приложениям компоненты будут засорять экран.
Шаблон ввода представляет собой символьную строку, которую мы заносим в свойство Mask либо на стадии проектирования приложения, либо во время его работы. Среди символов шаблона различают управляющие символы, контролирующие вводимые в данной позиции коды, и литералы — символы переносимые в поле ввода программой. Перечень управляющих символов приведен в табл. 3.2.
Таблица 3.2
| Управляющий символ маски | Символ, который должен или может быть набран в данной позиции |
| # | Цифра (ввод обязателен) |
| 9 | Цифра (ввод не обязателен, позицию можно пропустить) |
| A | Цифра или буква (ввод обязателен) |
| A | Цифра или буква (ввод не обязателен) |
| & | Любой символ с кодом 32-126 или 128-255 (ввод обязателен) |
| C | Любой символ с кодом 32-126 или 128-255 (ввод не обязателен) |
| > | Буква будет преобразована в заглавную |
| < | Буква будет преобразована в строчную |
| . | Десятичная точка, отделяющая целую часть числа от дробной |
| , | Запятая — разделитель тысяч в больших числах |
| : | Двоеточие — разделитель компонент времени (часы: минуты: сек) |
| / | Разделитель компонент даты (год / месяц / день) |
Символы маски, не относящиеся к разряду управляющих, считаются литералами, которые переносятся в поле ввода без изменения и не могут быть исправлены пользователем. Естественно, возникает вопрос — а как включить в состав литералов те нормальные символы, которые отнесены к управляющим. В этом случае в маске перед нужным символом ставится обратная косая черта, которой не соответствует отдельная позиция в поле ввода. Например, Mask = "(0\95)-###-##-##". Здесь символ "9" рассматривается не как управляющий, а как литерал, позволяющий задать междугородний телефонный код Москвы. Для включения в состав литералов символа backslash нужно задать две обратные косые черты — "\\".
Во время выполнения программы контролируемые позиции поля ввода выделены знаком подчеркивания. Однако это не всегда удобно. Используя два свойства компонента MaskEdBox, вы можете заменить символ подчеркивания на любой другой, более подходящий по смыслу:
AllowPrompt = True ‘Разрешить замену подчерка
PromtChar = “*” ‘Назначить новый символ
Продемонстрируем использование окна ввода по шаблону на примере ввода телефонных номеров.
Приложение 3_05 (VB). Ввод номера телефона.
Поместим на форму объект MaskEdBox и установим следующие значения его свойств:
Name = Input1
Mask = (831-2)-##-##-##
Чтобы лучше разглядеть вид шаблона на стадии проектирования увеличим размер букв маски до 14 пунктов (рис. 3.3).

Рис. 3.3. Маска для ввода телефонных номеров
Пусть наше приложение предлагает пользователю ввести телефонный номер, и после нажатия клавиши <Enter> переносит поступившее значение в заголовок метки Label1. После этого на поле ввода восстанавливается маска для приема следующего номера. Ниже приводится текст модуля формы:
Private Sub MaskInput_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then
Label1.Caption = MaskInput.Text
MaskInput.Mask = ""
MaskInput.Text = ""
MaskInput.Mask = "(831-2)-##-##-##"
End If
End Sub
Обратите внимание на то, что для очистки окна перед вводом следующего номера, приходится сначала сбросить маску, а потом восстановить ее. Очистка поля ввода без сброса маски приведет к генерации ошибочной ситуации. Вид приложения после его старта приведен на рис. 3.5.
При наборе номера можно столкнуться с некоторой недоработкой компонента. Если вы начнете набор с одной из цифр, включенных в литерал, то курсор переходит в соответствующую позицию литеральных символов вместо того, чтобы переместиться в начальную позицию номера. Правда, искажения литеральных символов при этом не происходит. Но если первая же цифра телефона не содержится в начальном литерале, то ввод без осложнений начинается с нужной позиции. В позиции поля ввода, которой соответствует управляющий символ маски "#", можно набрать только цифру. Нажатие таких клавиш как <F1> игнорируется молча, на нажатие какой-либо буквы раздается звуковой сигнал. Такой же сигнал вы услышите, если попытаетесь ввести текст, превышающий длину маски.

Рис. 3.4. Начальный вид приложения перед вводом номера
Из рис. 3.4 видно, что подчерки в позициях ввода сливаются. Можно выделить каждую из вводимых позиций, если заменить свойство PromptChar, например, на звездочку (рис: 3.5).

Рис. 3.5. Окно с нестандартной маской в процессе ввода
Литеральные символы маски попадают в свойство Text, однако от них можно избавиться, если выделить всю строку и скопировать выделенный текст в Clipboard. Если значение свойства ClipMode при этом равно 1% (или константе mskExcludeLiterals), то в буфер обмена литеральные символы не передаются. По умолчанию ClipMode = 0, что соответствует режиму сохранения литералов при копировании или вырезании.
