Как ограничить варианты вводимых в поле символов?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
В окне есть некое поле типа ENTRY
Необходимо сделать так, чтобы в это поле можно было вводить символы только из строго ограниченного набора (в частности, все цифры, пару спец.символов, а также несколько латинских букв в строчном регистре). Все остальные символы в это поле просто не должны вводиться (ну, для красоты можно еще чтобы при попытке ввода неразрешенного символа звучал BEEP).
Как это лучше организовать?
Написал: Booroondook(77)
Необходимо сделать так, чтобы в это поле можно было вводить символы только из строго ограниченного набора (в частности, все цифры, пару спец.символов, а также несколько латинских букв в строчном регистре). Все остальные символы в это поле просто не должны вводиться (ну, для красоты можно еще чтобы при попытке ввода неразрешенного символа звучал BEEP).
Как это лучше организовать?
Написал: Booroondook(77)
Key-In (@k) не пойдет однозначно - там нельзя задать конкретные буквы - можно только задать "любая строчная", "любая прописная" и т.п.
Короче, вот мой разрешенный список символов:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, p, w, n, *, #, +
И это все - никакие другие символы вводить в это поле нельзя.
P.S. Если кто понял, что к чему - это символы, разрешенные в телефонных номерах для стандарта GSM.
Написал: Booroondook(77)
Короче, вот мой разрешенный список символов:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, p, w, n, *, #, +
И это все - никакие другие символы вводить в это поле нельзя.
P.S. Если кто понял, что к чему - это символы, разрешенные в телефонных номерах для стандарта GSM.

Написал: Booroondook(77)
Hi.
Если @K...K не решает, то вешаем на контрол атрибут IMM и обрабатываем каждый символ ручками.
WBR, Nick Tsigouro mailto:nick@arsis.ru
Написал: ClaList(2)
Если @K...K не решает, то вешаем на контрол атрибут IMM и обрабатываем каждый символ ручками.
WBR, Nick Tsigouro mailto:nick@arsis.ru
Написал: ClaList(2)
Начинаю что-то понимать.
Но тем не менее...
Как именно можно "обработать каждый символ ручками"?
Я делаю так:
CASE KEYCHAR()
OF VAL('*')
OROF VAL('0')
! и т.д. - перечисляю все разрешенное
ELSE
! а здесь должны быть инструкции для запрещенных символов
END
так вот вопрос - ЧТО именно нужно прописать в инструкциях для запрещенных символов, чтобы в поле ничего не вводилось (точнее, чтобы то, что уже там есть, то и оставалось)?
Написал: Booroondook(77)
Но тем не менее...
Как именно можно "обработать каждый символ ручками"?
Я делаю так:
CASE KEYCHAR()
OF VAL('*')
OROF VAL('0')
! и т.д. - перечисляю все разрешенное
ELSE
! а здесь должны быть инструкции для запрещенных символов
END
так вот вопрос - ЧТО именно нужно прописать в инструкциях для запрещенных символов, чтобы в поле ничего не вводилось (точнее, чтобы то, что уже там есть, то и оставалось)?
Написал: Booroondook(77)
Делов то на пару минут.
В форме на поле вешаем галочку Immediate
В Embeds на New Selection примерно такой код
fld-строка ввода, которую контролируем
--
С уважением,
Дмитрий Осипов mailto:Dima_Osipov@km.ru
ICQ 14543897
Написал: ClaList(2)
В форме на поле вешаем галочку Immediate
В Embeds на New Selection примерно такой код
fld-строка ввода, которую контролируем
Код: Выделить всё
update(field())
s"=fld[len(clip(fld))]
if ~inlist(upper(s"),'0','1','2','3','4','5','6','7','8','9','P','W','N','*','#','+')
fld=fld[1:len(clip(fld))-1]
beep
display(field())
.
С уважением,
Дмитрий Осипов mailto:Dima_Osipov@km.ru
ICQ 14543897
Написал: ClaList(2)
Вот только update не надо, а то получается, что сначала вводим, а потом правим.
WBR, Nick Tsigouro
Написал: ClaList(2)
Код: Выделить всё
if
inlist(Chr(KeyChar()),'0','1','2','3','4','5','6','7','8','9','P','W','N','*','#','+')
А можно и короче:
if instring(upper(s"),'0123456789PWN*#+',1,1)
fld=Clip(fld) & Chr(KeyChar())
display(field())
else
beep
end
Написал: ClaList(2)
Спасибо и за этот совет.
Тем не менее, он, как и предыдущий вариант (от Дмитрия Осипова), имеет существенный недостаток.
А именно: отрабатывается случай ввода запрещенного символа только в конец поля. А на практике ввод может осуществляться и в начало, и в середину поля.
Собственно, я вчера вечерком немного напрягся и родил вот такой вариант:
(все туда же - в NewSelection). Поле должно быть типа CSTRING.
!========
Update(?fld)
LOOP i#=1 TO LEN(fld)
IF ~INLIST(fld[i#],'+','*','#','n','p','w','0','1','2','3','4','5','6','7','8','9')
fld[i#]=CHR(0)
END
END
!========
...и почти сразу обнаружил недостаток - при вводе "запрещенного" символа в середину или в начало поля обрезается правая часть (потому что CSTRING обрезается первым встретившимся символом NULL).
А вот такой вариант вроде работает красиво (правда, при вводе "запрещенного" символа курсор смещается на один символ вправо, но это уже не так важно):
!========
Update(?fld)
LOOP i#=1 TO LEN(fld)
IF ~INLIST(fld[i#],'+','*','#','n','p','w','0','1','2','3','4','5','6','7','8','9')
fld=SUB(fld,1,i#-1) & SUB(fld,i#+1,LEN(fld)-i#)
BREAK
END
END
!========
Написал: Booroondook(77)
Тем не менее, он, как и предыдущий вариант (от Дмитрия Осипова), имеет существенный недостаток.
А именно: отрабатывается случай ввода запрещенного символа только в конец поля. А на практике ввод может осуществляться и в начало, и в середину поля.
Собственно, я вчера вечерком немного напрягся и родил вот такой вариант:
(все туда же - в NewSelection). Поле должно быть типа CSTRING.
!========
Update(?fld)
LOOP i#=1 TO LEN(fld)
IF ~INLIST(fld[i#],'+','*','#','n','p','w','0','1','2','3','4','5','6','7','8','9')
fld[i#]=CHR(0)
END
END
!========
...и почти сразу обнаружил недостаток - при вводе "запрещенного" символа в середину или в начало поля обрезается правая часть (потому что CSTRING обрезается первым встретившимся символом NULL).
А вот такой вариант вроде работает красиво (правда, при вводе "запрещенного" символа курсор смещается на один символ вправо, но это уже не так важно):
!========
Update(?fld)
LOOP i#=1 TO LEN(fld)
IF ~INLIST(fld[i#],'+','*','#','n','p','w','0','1','2','3','4','5','6','7','8','9')
fld=SUB(fld,1,i#-1) & SUB(fld,i#+1,LEN(fld)-i#)
BREAK
END
END
!========
Написал: Booroondook(77)
А именно: отрабатывается случай ввода запрещенного символа только в конец поля. А на практике ввод может осуществляться и в начало, и в середину поля.
Если введенный символ извлекается через KeyChar(), то мимо контроля не проскочит. А случай вставки/замены на корректный символ не в конце делается не просто легко, а очень легко:
UPDATE(?fld)
Правда это несколько нарушает стандартную логику. По существу на каждый чих производится Accept. Если аккуратно, то корректный ввод нужно сохранять во временной переменной, при неправильном вводе восстанавливать из нее текст в контроле : ?fld{PROP:ScreenText} = "TempFld, а по Event:Accepted копировать ее в Use переменную.
Собственно, я вчера вечерком немного напрягся и родил вот такой вариант:
(все туда же - в NewSelection). Поле должно быть типа CSTRING.
!========
Update(?fld)
Ну что за страсть затирать допустимое значение непроверенным? То, что в контроле отображается можно получить через PROP:ScreenText не портя Use переменную.
А вот такой вариант вроде работает красиво (правда, при вводе "запрещенного" символа курсор смещается на один символ вправо, но это уже не так важно):
А кто мешает поправить через PROP:Selected?
WBR, Nick Tsigouro
Написал: ClaList(2)
Пытался - получаются глюки (не туда курсор перескакивает) в случаях ввода запрещенного символа в начало или конец поля. В середину - нормально.Цитата:А вот такой вариант вроде работает красиво (правда, при вводе "запрещенного" символа курсор смещается на один символ вправо, но это уже не так важно):
А кто мешает поправить через PROP:Selected?
Ну, собственно, то, что курсор смещается вправо, совсем не страшно.
Написал: Booroondook(77)