CftClub.ru
Клуб специалистов ЦФТ-Банк

Маска ввода (InputMask) для поля типа Строка
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеСр Сен 26, 2012 06:58   Маска ввода (InputMask) для поля типа Строка Ответить с цитатой
Полезность: Нет оценки
Здавствуйте все,

Проблема такая:
В структуре "Контакты для связи" нужно в операции ввода контакта сделать ввод по маске для телефонных номеров.
В зависимости от "Типа связи" маска ввода может меняться, или ее может вообще не быть.

Что сделано:
Создал подтип типа Строка с указанием маски "&(&&&) &&&-&&&", и на форме конструктора разместил переменную этого типа. На смену "Типа связи" повесил валидатор, и при изменении типа связи и принадлежности через клиент-скрипт меняю маску, примерно так:
Код:

    txtNumber.InputMask = "0(&&&&) &&-&&&"
    ' или
    txtNumber.InputMask = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


Проблема в том, что при маске "aaa" могут быть введены только цифры и буквы, а мне нужно чтобы можно было ввести любой символ и спец.символы тоже. Установка InputMask в пустую строку "" не помогла.
И еще, можно ли не указывая такую длинную маску, использовать квадратные(или фигурные) скобки наподобие "[a&]" где можно указать какие символы должны быть в вводимой строке, не ограничивая длинну? Если можно, то как(синтаксис, пример)

ЦФТ-Банк версия 8.8.10.1
Версия ТЯ 7.1.1.4
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Сен 26, 2012 07:41   Re: Маска ввода (InputMask) для поля типа Строка Ответить с цитатой
Полезность: Нет оценки
samsonbek пишет:
Проблема такая:
В структуре "Контакты для связи" нужно в операции ввода контакта сделать ввод по маске для телефонных номеров.
В зависимости от "Типа связи" маска ввода может меняться, или ее может вообще не быть.

...

Проблема в том, что при маске "aaa" могут быть введены только цифры и буквы, а мне нужно чтобы можно было ввести любой символ и спец.символы тоже. Установка InputMask в пустую строку "" не помогла.


А не проще тупо обработать OnKeyDown на поле ввода?
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеСр Сен 26, 2012 07:48   Re: Маска ввода (InputMask) для поля типа Строка Ответить с цитатой
Полезность: Нет оценки
Random пишет:
samsonbek пишет:
Проблема такая:
В структуре "Контакты для связи" нужно в операции ввода контакта сделать ввод по маске для телефонных номеров.
В зависимости от "Типа связи" маска ввода может меняться, или ее может вообще не быть.

...

Проблема в том, что при маске "aaa" могут быть введены только цифры и буквы, а мне нужно чтобы можно было ввести любой символ и спец.символы тоже. Установка InputMask в пустую строку "" не помогла.


А не проще тупо обработать OnKeyDown на поле ввода?


Не хотелось бы в коде клиент-скрипта весь код обработки писать, зачем писать кучу vbscript кода если все можно решить простой маской?
К тому же при смене "Типа связи" или "Принадлежности" маска меняется и фокус не на поле ввода находится.
kai
Профи


Вступление в Клуб: 16.08.2012
СообщениеСр Сен 26, 2012 15:22    Ответить с цитатой
Полезность: Нет оценки
samsonbek,

А не пробовали для формирования нужной маски вместо символа "а" (строчная латинская) использовать символ & ("амперсанд"), значение которого трактуется как "Любой символ (буква, цифра, знак) или пробел. В эту позицию можно ввести один символ или пробел, но необязательно."

Информация взята из документации по следующему пути:
Администратор словаря данных > Глава 2. Типы Базовых Понятий > Создание и редактирование Типов Базовых Понятий > Технология создания (редактирования) типа данных > Простые типы параграф "Значения – Маска ввода"
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеСр Сен 26, 2012 15:31    Ответить с цитатой
Полезность: Нет оценки
kai пишет:
samsonbek,

А не пробовали для формирования нужной маски вместо символа "а" (строчная латинская) использовать символ & ("амперсанд"), значение которого трактуется как "Любой символ (буква, цифра, знак) или пробел. В эту позицию можно ввести один символ или пробел, но необязательно."

Информация взята из документации по следующему пути:
Администратор словаря данных > Глава 2. Типы Базовых Понятий > Создание и редактирование Типов Базовых Понятий > Технология создания (редактирования) типа данных > Простые типы параграф "Значения – Маска ввода"


Дааа, верно, что-то я этот вариант не рассматривал, наверно потому что у меня в документашке написано "любой символ, ОБЯЗАТЕЛЬНО присутствующий" (в приложенном архиве).

Спасибо за помощь, это было то что надо! Very Happy
devor
Профи


Вступление в Клуб: 13.02.2012
СообщениеСр Сен 26, 2012 15:49   Re: Маска ввода (InputMask) для поля типа Строка Ответить с цитатой
Полезность: Нет оценки
samsonbek пишет:

Код:

    txtNumber.InputMask = "0(&&&&) &&-&&&"
    ' или
    txtNumber.InputMask = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


Проблема в том, что при маске "aaa" могут быть введены только цифры и буквы, а мне нужно чтобы можно было ввести любой символ и спец.символы тоже. Установка InputMask в пустую строку "" не помогла.
И еще, можно ли не указывая такую длинную маску, использовать квадратные(или фигурные) скобки наподобие "[a&]" где можно указать какие символы должны быть в вводимой строке, не ограничивая длинну? Если можно, то как(синтаксис, пример)

ЦФТ-Банк версия 8.8.10.1
Версия ТЯ 7.1.1.4


ЦФТ-Банк и ТЯ не при чем.
Тут надо читать MSDN

http://msdn.microsoft.com/en-us/library/office/aa160023(v=office.10).aspx

Цитата:

0 Digit (0 to 9, entry required, plus [+] and minus [–] signs not allowed).
9 Digit or space (entry not required, plus and minus signs not allowed).
# Digit or space (entry not required; spaces are displayed as blanks while in Edit mode, but blanks are removed when data is saved; plus and minus signs allowed).
L Letter (A to Z, entry required).
? Letter (A to Z, entry optional).
A Letter or digit (entry required).
a Letter or digit (entry optional).
& Any character or a space (entry required).
C Any character or a space (entry optional).
. , : ; - / Decimal placeholder and thousand, date, and time separators. (The actual character used depends on the settings in the Regional Settings Properties dialog box in Windows Control Panel).
< Causes all characters to be converted to lowercase.
> Causes all characters to be converted to uppercase.
! Causes the input mask to display from right to left, rather than from left to right. Characters typed into the mask always fill it from left to right. You can include the exclamation point anywhere in the input mask.
\ Causes the character that follows to be displayed as the literal character (for example, \A is displayed as just A).
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеСр Сен 26, 2012 15:56   Re: Маска ввода (InputMask) для поля типа Строка Ответить с цитатой
Полезность: Нет оценки
devor пишет:

ЦФТ-Банк и ТЯ не при чем.
Тут надо читать MSDN

http://msdn.microsoft.com/en-us/library/office/aa160023(v=office.10).aspx

Цитата:

0 Digit (0 to 9, entry required, plus [+] and minus [–] signs not allowed).
9 Digit or space (entry not required, plus and minus signs not allowed).
# Digit or space (entry not required; spaces are displayed as blanks while in Edit mode, but blanks are removed when data is saved; plus and minus signs allowed).
L Letter (A to Z, entry required).
? Letter (A to Z, entry optional).
A Letter or digit (entry required).
a Letter or digit (entry optional).
& Any character or a space (entry required).


Тут тоже написано что значение должно быть введено обязательно. Это собственно и смутило меня...
kai
Профи


Вступление в Клуб: 16.08.2012
СообщениеСр Сен 26, 2012 19:02    Ответить с цитатой
Полезность: Нет оценки
samsonbek, по скриншоту я заметил, что я привёл выдержку из последней версии документации...
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеЧт Сен 27, 2012 06:01    Ответить с цитатой
Полезность: Нет оценки
kai пишет:
samsonbek, по скриншоту я заметил, что я привёл выдержку из последней версии документации...


Однако, тут с маской возникла другая проблема, в маску оказывается можно ввести максимум 40 символов(при максимуме в 64), и получается, что даже если текстовый тип должен иметь длинну 100 символов, он будет ограничен до 64, потому что маска не позволит ввести больше.

Кто-нибудь знает как выйти из этой ситуации?
Это баг ЦФТ?
kai
Профи


Вступление в Клуб: 16.08.2012
СообщениеЧт Сен 27, 2012 18:00    Ответить с цитатой
Полезность: Нет оценки
samsonbek пишет:

Однако, тут с маской возникла другая проблема, в маску оказывается можно ввести максимум 40 символов(при максимуме в 64), и получается, что даже если текстовый тип должен иметь длинну 100 символов, он будет ограничен до 64, потому что маска не позволит ввести больше.

Кто-нибудь знает как выйти из этой ситуации?
Это баг ЦФТ?


Это не баг (и не "фича"). Это ограничение на длину хранения значения маски. В типе словаря для строки можно сохранить маску длиной 40 символов. В клиент-скрипте можно увеличить до 64. Значит никто не закладывал в реализацию использование маскированного поля более 64 символов. Кстати, для чего нужно-то?

"как выйти из этой ситуации"? Разбить, например, на 2 поля. Или поставить задачу по-другому.
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеЧт Сен 27, 2012 18:07    Ответить с цитатой
Полезность: Нет оценки
kai пишет:

Это не баг (и не "фича"). Это ограничение на длину хранения значения маски. В типе словаря для строки можно сохранить маску длиной 40 символов. В клиент-скрипте можно увеличить до 64. Значит никто не закладывал в реализацию использование маскированного поля более 64 символов. Кстати, для чего нужно-то?

"как выйти из этой ситуации"? Разбить, например, на 2 поля. Или поставить задачу по-другому.


Нужна маска длиннее чем 64 символа, потому что длинна самого типа равна 100 символам.

PS. По какой причине в ЦФТ длинна маски ограничена?
kai
Профи


Вступление в Клуб: 16.08.2012
СообщениеЧт Сен 27, 2012 18:17    Ответить с цитатой
Полезность: Нет оценки
samsonbek пишет:
Нужна маска длиннее чем 64 символа, потому что длинна самого типа равна 100 символам.


да понятно, что нужно, не понятно, кто принял такое решение, что нужно? А главное, на основании чего, какая задача при этом решается?

samsonbek пишет:
PS. По какой причине в ЦФТ длинна маски ограничена?


...причина ограничения хранения данных определяется на этапе разработки всегда и везде...

p.s. 1-ый приём хаккеров - использовать эту "неидеальность" мира...
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеЧт Сен 27, 2012 18:38    Ответить с цитатой
Полезность: Нет оценки
kai пишет:
samsonbek пишет:
Нужна маска длиннее чем 64 символа, потому что длинна самого типа равна 100 символам.


да понятно, что нужно, не понятно, кто принял такое решение, что нужно? А главное, на основании чего, какая задача при этом решается?


Задачу я объяснял в начале. Поясняю еще раз. В это поле, в зависимости от "Типа" контакта, может быть вписан и номер телефона, и адрес почты, и еще какая-нибудь контактная белиберда типа "почта: sombody@somesite.com, но лучше писать на othermail@mail.ru".
Все данные вводятся через одно поле(один параметр). Тип у этого параметра "Строка (100)".

Так вот, когда "Тип" связи указан как "Телефон" маска должна быть #(###) ###-###.

Когда "Тип" меняется на другой, то маска сбрасывается на "&&&&&&&&&&&&&&&&&&&&&&&&&&&&" длинною в 100 символов.
А тут получается что при длине поля в 100, маска позволяет ввести всего лишь 64 символа, и то, при сохранении и обратном редактировании урезает до 40 символов.


Выход вижу только один - использовать две переменные, одна с маской для телефонного номера, а другая без маски. Расположить их на форме поверх друг друга, при смене "Типа" связи, скрывать одну и показывать другую. Для пользователя создастся иллюзия что он всегда вводит данные в одно поле...
Просто в коде тут придется погеморроится с синхронизацией этих переменных и данных в них.

Более дельных предложений ни у кого нет?
kai
Профи


Вступление в Клуб: 16.08.2012
СообщениеПт Сен 28, 2012 05:32    Ответить с цитатой
Полезность: Нет оценки
samsonbek,

постановку задачи я понял так: есть два режима ввода данных пользователем, определяемые по параметру "Тип": Маскированный текст; 2. НеМаскированный текст.

Не понятно следующее:
1. Где будет храниться введённая информация ? В нескольких полях или нет?
2. Маскированние требуется только при вводе? Редактирование ранее введённой информации планируется или нет? При редактировании маскированная информация должна будет, насколько я понимаю, отображаться маскированной ?

В итоге, хотелось бы понять: что останавливает для ввода данных от использования нескольких полей, своё для каждой единицы информации? Даже если части её храниться будут в одном большом текстовом поле, параметров-то можно сделать сколько нужно?

В целом, я с Вашим выводом об использовании для разных типов разных полей согласен.

А если от выполнения задуманного останавливает только нежелание обрабатывать в клиент-скрипте несколько полей (для отображения и скрытия), то рекомендую использовать вспомогательный параметр типа "Выбор из двух". С помощью него в валидаторе эту задачу можно решить, практически, одной строкой:

Код:
case P_MESSAGE of
:'VALIDATE':
   case P_INFO of
   :'P_TYPE':
      P_CASE.[0]   := bool_num(P_TYPE,1,2,2);
   End;
End;


Как это будет выглядеть, можно посмотреть в отчёте [MAIN_DOCUM]::[CJ2481U]. Оконтовки областей и выбор сделаны невидимыми. переключение происходит по крыжу "Задать условие выбора нескольких счетов".

p.s. Разработка интерфейса часто объёмна.
samsonbek
Участник


Вступление в Клуб: 25.03.2011
СообщениеПт Сен 28, 2012 06:04    Ответить с цитатой
Полезность: Нет оценки
kai пишет:
samsonbek,

Не понятно следующее:
1. Где будет храниться введённая информация ? В нескольких полях или нет?
2. Маскированние требуется только при вводе? Редактирование ранее введённой информации планируется или нет? При редактировании маскированная информация должна будет, насколько я понимаю, отображаться маскированной ?

В итоге, хотелось бы понять: что останавливает для ввода данных от использования нескольких полей, своё для каждой единицы информации? Даже если части её храниться будут в одном большом текстовом поле, параметров-то можно сделать сколько нужно?

В целом, я с Вашим выводом об использовании для разных типов разных полей согласен.


Отвечаю:
1. любая введенная информация, будь то номер телефона или адрес почты или т.п., хранится в одном поле(в одном реквизите типа СТРОКА(100) ).
2. маскировка требуется также и при редактировании. Если был введен номер телефона, при редактировании отображаться он должен тоже по маске(это нужно чтобы при редактировании не перебили формат, думаю это логично).


При использовании нескольких полей(отдельное поле для каждого типа связи) как я уже говорил, много операций придется делать дабы синхронизировать эти поля. Нужно учитывать следующие ньюансы:
- В каждый момент времени видимым должно быть только одно поле(соответсвтующее типу контакта)
- Пользователь может сначала внести данные в поле, а потом уже выбрать "Тип связи", и если он поменял "тип связи", поле, в которое он вводил данные должно скрыться, а другое стать видимым, и данные которые он вводил в старое поле, должны отобразится в новом(если подходят по маске ввода). Поэтому при любом вводе данных значение поля нужно будет копировать на все поля.

Вобщем вот такой вот геморрой Sad .

Ну, видимо все таки придется остановится на этом варианте...
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru