Страница 1 из 1
Добавлено: 20 Июль 2004, 14:55
Гость
В окне есть некое поле типа ENTRY
Необходимо сделать так, чтобы в это поле можно было вводить символы только из строго ограниченного набора (в частности, все цифры, пару спец.символов, а также несколько латинских букв в строчном регистре). Все остальные символы в это поле просто не должны вводиться (ну, для красоты можно еще чтобы при попытке ввода неразрешенного символа звучал BEEP).
Как это лучше организовать?
Написал: Booroondook(77)
Добавлено: 20 Июль 2004, 15:29
Гость
Из общения на irc.rinet.ru:6669 #Clarion:
[15:22] Yufil: А... Посмотри на формат @K
[15:23] Yufil: Можно, конечно, ещё атрибут Imm на поле поставить и ловить Event:NewSelection на поле после каждого телодвижения
Написал: ClaList(2)
Добавлено: 20 Июль 2004, 15:34
Гость
Key-In (@k) не пойдет однозначно - там нельзя задать конкретные буквы - можно только задать "любая строчная", "любая прописная" и т.п.
Короче, вот мой разрешенный список символов:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, p, w, n, *, #, +
И это все - никакие другие символы вводить в это поле нельзя.
P.S. Если кто понял, что к чему - это символы, разрешенные в телефонных номерах для стандарта GSM.

Написал: Booroondook(77)
Добавлено: 20 Июль 2004, 17:10
Гость
Hi.
Если @K...K не решает, то вешаем на контрол атрибут IMM и обрабатываем каждый символ ручками.
WBR,
Nick Tsigouro mailto:
nick@arsis.ru
Написал: ClaList(2)
Добавлено: 20 Июль 2004, 17:15
Гость
Начинаю что-то понимать.
Но тем не менее...
Как именно можно "обработать каждый символ ручками"?
Я делаю так:
CASE KEYCHAR()
OF VAL('*')
OROF VAL('0')
! и т.д. - перечисляю все разрешенное
ELSE
! а здесь должны быть инструкции для запрещенных символов
END
так вот вопрос - ЧТО именно нужно прописать в инструкциях для запрещенных символов, чтобы в поле ничего не вводилось (точнее, чтобы то, что уже там есть, то и оставалось)?
Написал: Booroondook(77)
Добавлено: 20 Июль 2004, 18:01
Гость
Делов то на пару минут.
В форме на поле вешаем галочку 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)
Добавлено: 20 Июль 2004, 18:06
Гость
Спасибо!!!!
Написал: Booroondook(77)
Добавлено: 20 Июль 2004, 19:11
Гость
Вот только update не надо, а то получается, что сначала вводим, а потом правим.
Код: Выделить всё
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
WBR,
Nick Tsigouro
Написал: ClaList(2)
Добавлено: 21 Июль 2004, 10:15
Гость
Спасибо и за этот совет.
Тем не менее, он, как и предыдущий вариант (от Дмитрия Осипова), имеет существенный недостаток.
А именно: отрабатывается случай ввода запрещенного символа только в конец поля. А на практике ввод может осуществляться и в начало, и в середину поля.
Собственно, я вчера вечерком немного напрягся и родил вот такой вариант:
(все туда же - в 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)
Добавлено: 21 Июль 2004, 16:16
Гость
А именно: отрабатывается случай ввода запрещенного символа только в конец поля. А на практике ввод может осуществляться и в начало, и в середину поля.
Если введенный символ извлекается через 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)
Добавлено: 21 Июль 2004, 16:22
Гость
Цитата:А вот такой вариант вроде работает красиво (правда, при вводе "запрещенного" символа курсор смещается на один символ вправо, но это уже не так важно):
А кто мешает поправить через PROP:Selected?
Пытался - получаются глюки (не туда курсор перескакивает) в случаях ввода запрещенного символа в начало или конец поля. В середину - нормально.
Ну, собственно, то, что курсор смещается вправо, совсем не страшно.
Написал: Booroondook(77)
Добавлено: 21 Июль 2004, 17:13
Гость
Как это? Ты же следующий символ не туда вобьешь.
Nick Tsigouro
presskey(LeftKey)
--
С уважением,
Дмитрий Осипов
Написал: ClaList(2)
Добавлено: 21 Июль 2004, 17:20
Гость
Как это? Ты же следующий символ не туда вобьешь.
Nick Tsigouro
Правее правого конца не смещается.
Поэтому проблема признается несущественной.
presskey(LeftKey)
--
С уважением,
Дмитрий Осипов
Иногда почему-то дает смещение курсора влево на два символа.
Написал: Booroondook(77)