Страница 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)