:: Visual Foxpro, Foxpro for DOS
Шаблон для ввода некоторого набора символов
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Положим, есть символьная строка myvar длиной 30 символов.

myvar=space(30)

Пользователь может/должен ввести в эту myvar строго ограниченный набор символов. Разрешается ввод:

- цифр от 0 до 9
- буквы Я - не более одного раза
- символов chr(45) (дефис) и chr(46) (точка)

Порядок следования допустимых символов произвольный.
В реальности это не совсем так, но для "упрощения" пусть будут вот такие ограничения.

Допустим, ввод будет выполняться так (таки FPD) :

@ 10, 10 GET myvar
read

Вопрос. Каким образом можно сделать так, чтобы переменная myvar (может быть, после выполнения ввода и обработки) содержала только допустимые символы?

Ну, понятное дело, что можно посимвольно проверить, является ли символ допустимым для myvar. Или использовать функции CHRTRAN() или STRTRAN(). Но, может быть, есть способ получше?



Исправлено 4 раз(а). Последнее : Simple777, 16.10.21 11:35
Ratings: 0 negative/0 positive
Re: Шаблон для ввода некоторого набора символов
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Сделал покамест посимвольную проверку в цикле на допустимость введённых символов с использованием опоператора $

...
IF SUBSTR(myvar,m.i,1)$[0123456789Я.-]
\m/ юзеру
ENDIF
...

В смысле достаточно юзеру показать козу, а дальше пусть исправляет сам.
Ratings: 0 negative/0 positive
Re: Шаблон для ввода некоторого набора символов
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Simple777
Сделал покамест посимвольную проверку в цикле на допустимость введённых символов с использованием опоператора $
...
IF SUBSTR(myvar,m.i,1)$[0123456789Я.-]
\m/ юзеру
ENDIF

Можно без цикла:
IF EMPTY(CHRTRAN(myvar,[0123456789Я.-],[])) AND OCCURS('Я',myvar)<2
\m/ юзеру
ENDIF

Цитата:
Но, может быть, есть способ получше?
Теоретически можно ловить всё "на лету", заменив GET/READ на свою функцию ввода, основанную на INKEY(), но не уверен, что в общем случае это будет "получше".

Можно даже сохранить GET/READ, подключая некоторую функцию, основанную на ON KEY LABEL, в WHEN и отключая её в VALID (то есть сделать аналог KeyPress в VFP).



Исправлено 7 раз(а). Последнее : akvvohinc, 16.10.21 15:51
Ratings: 0 negative/0 positive
Re: Шаблон для ввода некоторого набора символов
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Из пушки по воробьям стрелять не будем, и предложенный вариант с EMPTY() это как раз то, что я имел в виду, но не догадался, как сделать без цикла. Так что супер!

Одно лишь уточнение. Надо в условие добавить отрицание:

IF !(EMPTY(CHRTRAN(myvar,[0123456789Я.-],[])) AND OCCURS('Я',myvar)<2)
\m/ юзеру
ENDIF



Исправлено 1 раз(а). Последнее : Simple777, 16.10.21 16:06
Ratings: 0 negative/0 positive
Re: Шаблон для ввода некоторого набора символов
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Одно лишь уточнение. Надо в условие добавить отрицание

Тогда это уточнение для тебя - мой пример полностью основан на твоем
IF SUBSTR(myvar,m.i,1)$[0123456789Я.-]
\m/ юзеру
ENDIF
Ratings: 0 negative/0 positive
Re: Шаблон для ввода некоторого набора символов
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Это да.

Когда приводил пример, не поставил знак ! А в проге поставил, конечно.



Исправлено 1 раз(а). Последнее : Simple777, 16.10.21 16:51
Ratings: 0 negative/0 positive
Re: Шаблон для ввода некоторого набора символов
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Реально ещё убираю предварительно все пробелы из myvar. Хвостовые пробелы допускаются, но они потом дополняются по PADR().



Исправлено 3 раз(а). Последнее : Simple777, 16.10.21 17:11
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 30 akvvohinc leonid  (Гостей: 28)

© 2000-2024 Fox Club 
Яндекс.Метрика