Институт управления, бизнеса и права
Опубликован: 25.03.2009 | Доступ: свободный | Студентов: 7323 / 1525 | Оценка: 4.41 / 4.15 | Длительность: 14:33:00
Лекция 8:

Отладка приложений, обработка ошибок

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >

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.

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Евгений Ушаков
Евгений Ушаков

Добрый день! Поясните, пожалуйста, 3000 р. стоит документ об окончании курса. Если он не нужен, то можно учиться бесплатно?

Александр Новиков
Александр Новиков

Добрый день! Очень нужен справочник по объектам VBA c описание их методов и свойств.

Кто-нибудь знает, где можно приобрести?

(Он конечно есть в VBA - Object browser, но не очень удобный)