| О стоимости курса |
Отладка приложений, обработка ошибок
8.8. Проверка данных, вводимых пользователем
08-02-Проверка введенных даных.docm - пример к п. 8.8.
Для проверки данных, вводимых пользователем, вы можете воспользоваться стандартными конструкциями для принятия решений.
Давайте рассмотрим пример, в котором пользователь должен ввести свой возраст в ответ на запрос программы. Очевидно, что возраст должен удовлетворять следующим условиям.
- должен быть числом
- ограничим введенное значение диапазоном значений для типа данных Byte - то есть введенное значение не может быть больше 256 и меньше 0.
- скорее всего, он не превысит 100 лет, но, учитывая то, что нашей программой могут пользоваться и долгожители (если верить статистике, некоторые доживают и до 150) - переспросим пользователя, уверен ли он в том, что ввел именно это значение, и, если он согласится, примем его.
Так же мы ограничим количество возможных попыток для ввода возраста тремя.
Добавим в документ Microsoft Word две кнопки. Одну из них назовем cmd_AgeInput и подпишем как Введите ваш возраст, вторую назовем cmd_InpAge_Easy и подпишем как Простой ввод возраста.
Для проверок создадим несколько пользовательских функций, реализующих их. Такой подход очень удобен, так как позволяет уменьшить количество сложночитаемых вложенных конструкций If-Then-Else и делает работу с программой и ее отладку проще.
В листинге 8.2. приведена функция, которая проверяет, соответствует ли введенное число нашим требованиям.
Public Function IsGoodNum(var_Inp) As Boolean
'Функция возвращает True, если введенное
'число подходит, иначе - False
If IsNumeric(var_Inp) = True _
And Val(var_Inp) > 0 _
And Val(var_Inp) < 255 _
Then
IsGoodNum = True
Else
IsGoodNum = False
End If
End Function
Листинг
8.2.
Функция для проверки введенного числа
В листинге 8.3 вы можете найти функцию, которая проверяет введенное число и возвращает True, если оно больше 100.
Public Function IsMore100(var_Inp) As Boolean
'Функция возвращает True, если введенное число
'более 100
If Val(var_Inp) > 100 Then
IsMore100 = True
Else
IsMore100 = False
End If
End Function
Листинг
8.3.
Функция для выяснения, больше 100 введенное число или нет
В листинге 8.4. вы можете найти код функции, которая возвращает строку с описанием ошибки, которую допустил пользователь при вводе возраста.
Public Function NotNumber(var_Inp) As String
'Определяет, что именно ввел пользователь
'вместо ожидаемого числа и возвращает
'строку для вывода сообщения об ошибке
'Если не выполнится ни одно из условий
'программа выдаст общее сообщение об
'ошибке ввода данных
NotNumber = "Ошибка ввода данных"
'Если ей удастся определить тип ошибки
'будет выведено более точное сообщение
If var_Inp = "" Then
NotNumber = "Вы забыли ввести возраст"
End If
If Val(var_Inp) < 0 Then
NotNumber = "Вы ввели отрицательное число"
End If
If IsNumeric(var_Inp) = False Then
NotNumber = "Вы ввели не число"
End If
If Val(var_Inp) > 255 Then
NotNumber = "Вы ввели слишком большое число"
End If
End Function
Листинг
8.4.
Функция для выяснения ошибки пользователя
Листинг 8.5 содержит текст программы, которая использует вышеописанные функции для проверки введенного пользователем возраста.
Private Sub cmd_AgeInput_Click()
'Переменная для ввода пользователм
Dim str_Inp
'Сюда запишем возраст после проверки
Dim num_Age As Byte
'А здесь будем хранить ответ пользователя на
'Вопрос о том, уверен ли он в том, что ему
'Больше 100 лет
Dim IsYouMore100 As Variant
'В этой переменной будем хранить количество
'Неправильных попыток ввода
'Если оно превысит 3 - выходим из программы
Dim num_InpTry As Byte
'Эта переменная нужна для того, чтобы
'определить, окончен ли опрос пользователя
Dim bool_Flag As Boolean
bool_Flag = False
'Этот цикл будет длиться до тех пор,
'пока пользователь не введет верное значение
'или пока не совершит максимальное число
'попыток
Do
str_Inp = InputBox("Введите ваш возраст")
If num_InpTry > 3 Then
MsgBox "Вы совершили более 3 ошибок"
Exit Sub
End If
num_InpTry = num_InpTry + 1
'Если введенное число подходит
If IsGoodNum(str_Inp) = True Then
'Проверяем - не больше ли оно 100
If IsMore100(str_Inp) = False Then
'Если не больше - просто устанавливаем
'флаг выхода в True
'и записываем возраст в переменную num_Age
bool_Flag = True
num_Age = CByte(str_Inp)
Else
'Если возраст больше 100 - переспросим
IsYouMore100 = _
MsgBox("Вам точно больше 100?", vbYesNo)
'Если пользователь не ошибся,
'Установим флаг выхода
'и запишем возраст в num_Age
If IsYouMore100 = vbYes Then
bool_Flag = True
num_Age = CByte(str_Inp)
End If
End If
Else
'Если пользователь изначально ввел
'неподходяще число,
'сгенерируем с помощью функции NotNumber
'сообщение об ошибке и выведем его
MsgBox (NotNumber(str_Inp))
End If
Loop Until bool_Flag = True
MsgBox ("Ваш возраст: " + Str(num_Age))
End Sub
Листинг
8.5.
Программа, запрашивающая у пользователя возраст и проверяющая его с помощью вышеописанных функций
Как видите, обычная проверка возраста пользователя оказывается не слишком простым делом. Однако серьезная программа не может обойтись без подобных проверок. Конечно же, возможны варианты проверки. Например, чтобы проверить возраст, и если он нас не устраивает, без дополнительных сообщений предложить пользователю снова ввести его, достаточно такой конструкции (листинг 8.6.):
Private Sub cmd_InpAge_Easy_Click()
Dim str_Inp
Dim num_Age As Byte
'Цикл продолжается до тех пор,
'пока введенное значение не станет
'числом, находящимся в диапазоне от
'0 (не включая 0) до 100
Do
str_Inp = _
InputBox("Введите ваш возраст")
Loop Until _
IsNumeric(str_Inp) = True _
And Val(str_Inp) <= 100 _
And Val(str_Inp) > 0
'Конвертируем введенное число в
'тип данных Byte
num_Age = CByte(Val(str_Inp))
MsgBox ("Ваш возраст: " + Str(num_Age))
End Sub
Листинг
8.6.
Простая проверка введенного возраста
Как видите, здесь мы ограничились тройной проверкой на выходе из цикла с постусловием. А именно, проверили, является ли введенное значение числом, и попадает ли оно в диапазон 0-100, исключая 0.
