О стоимости курса |
Отладка приложений, обработка ошибок
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.