Уточнение структуры циклической программы (уровень-2)
Подход к уроку: В этой короткой теме мы реализуем два усовершенствования, относящиеся к структуре нашей программы. После этих дополнений структура циклической программы с командным управлением приобретет законченный вид. Пожалуй, эти два усовершенствования являются последними, которые могут быть практически реализованы без коренной переработки проекта. Защита от неверных действий пользователя Защита от неверных действий пользователя – это общее требование к хорошо сделанным программам. В нашем тесте напрашивается следующее применение этого принципа: если пользователь не выбрал вариант ответа, программа не должна переходить к следующему вопросу. Реализация защиты основана на следующих соображениях: · Если ответ не выбран, то надо сообщить об этом пользователю и просто остановиться. Пользователь выберет вариант ответа, щелкнет по кнопке «Дальше» и тем самым вновь запустит процедуру Дальше_Click. · Факт того, что ответ не выбран, можно определить с помощью переменной, в которой лежит номер ответа. · Очевидно, что для проверки отсутствия ответа надо использовать ветвление. · С точки зрения логики программы отсутствие ответа пользователя может считаться скорее исключением, чем одним из двух равновероятных вариантов. · Для обработки исключений рекомендуется использовать неполную форму ветвление с немедленным выходом из процедуры. В результате раздел «обработка ответа пользователя» событийной процедуры Дальше_Click может выглядеть так:
Переход программы на вывод результатов
Как уже говорилось, основная часть нашего теста имеет циклический характер. Понятно, что когда на все вопросы будут даны ответы, цикл должен закончиться. Разумное продолжение программы – вывод информации о результатах работы. Переход программы на вывод результатов должен осуществляться: · из процедуры Дальше_Click (по щелчку пользователя по кнопке «Дальше»); · в том случае, если вопросы кончились (если ячейка с вопросом пустая); · «вместо» вывода очередного вопроса. Таким образом получается, что вывод вопроса и переход на результаты – это два альтернативных действия, выбор одного из которых зависит от условия. Соответственно, надо использовать ветвление с двумя ветвями. Действия по выводу результатов удобно оформить как вложенную процедуру (назовем ее results). Соответственно, раздел «вывод вопроса» событийной процедуры Дальше_Click приобретает следующий вид: If Len(mesto1.Value) > 0 Then vopros Else results End If Работа над проектом Задание: Реализовать защиту в случае отсутствия ответа пользователя, а также выход программы из цикла. Программирование Реализация защиты описана достаточно подробно и не требует дополнительных уточнений. Для проверки перехода к результатам воспользуемся приемом «установки заглушек». Заглушкой принято называть процедуру, которая вместо выполнения ожидаемых действий лишь объявляет о том, что она запущена. Заглушки часто используются при разработке программы методом последовательной детализации «сверху вниз». Вот возможный текст такой заглушки: Sub results Msgbox “Здесь будут результаты” End Sub После набора такой процедуры можно: · в процедуре Дальше_Click заменить вызов процедуры vopros на ветвление, описанное выше;
· проверить работу проекта Включение в программу заставки и результатов Подход к уроку: Данной темой мы заканчиваем работу над нашей первой диалоговой программой. В ней описывается, что должно происходить до основной циклической части и после нее. Последовательность изложения основана на «проектном» подходе: новый материала привязан к тем или иным этапам работы над программой, хотя некоторые вопросы являются универсальными и могут быть актуальны и для других задач. Стиль изложения некоторых вопросов станет более конспективным, в частности, полный текст программы будет приводиться не во всех случаях. Работа с несколькими экранами К настоящему моменту у нас реализована основная часть тестовой программы. Однако, понятно, что программа должна иметь и другие части. Так, обязательной частью программы считается заставка, которая обычно содержит информацию о программе, инструкцию по работе с ней, а также дает возможность пользователю зарегистрировать себя. В предыдущем разделе речь шла о показе результатов работы, а это тоже отдельная часть программы. Не исключены еще какие-либо варианты. Также понятно, что для реализации различных частей пользовательская форма должна иметь различный внешний вид, на ней должны быть размещены различные элементы управления. Примерно это и имеется в виду под словом «экран». Различные экраны не обязаны существовать одновременно, скорее всего они будут просто сменять друг друга. Возможны два варианта реализации нескольких экранов: · одна форма со сменой видимости элементов управления; · несколько форм. Основным мы будем считать вариант с несколькими формами, как более соответствующий технологии WYSIWYG. Однако прокомментируем оба варианта. Одна форма 1. Все ЭУ располагаем на одной форме. Допустимо, если ЭУ, относящиеся к разным экранам, будут накладываться один на другой. 2. Видимостью ЭУ управляем с помощью свойства Visible («видимость»). Пример: Text1.Visible = False ListBox1.Visible = True Несколько форм 1. Стараемся придерживаться правила: «один экран – одна форма». 2. Все глобальные переменные и общие процедуры описываем в обычном модуле, а не в модуле формы. При объявлении переменных используем ключевое слово Public вместо Dim.
3. Убедительно рекомендуется присваивать формам осмысленные имена. 4. Для смены форм используем методы объекта «Форма»: Show (показать) и Hide (спрятать). Пример: Form_Zastavka.Hide Form_Vopros.Show Для закрытия формы, вместо метода Hide, можно (и даже рекомендуется) использовать команду UnLoad, выгружающую форму из памяти (Load – «загрузить», Un – обратное действие). Формат: UnLoad <Имя_формы> Пример: UnLoad Form_Zastavka Обратите внимание на отличие синтаксиса метода объекта (Hide) и команды с аргументом (UnLoad). 5. При закрытии текущей формы (а именно текущую форму как правило приходится закрывать) можно пользоваться принципом умолчания. Это очень удобно, так как позволяет не задумываться об имени формы. Для метода Hide имя формы просто опускается. Формат: Hide Для команды UnLoad имя текущей формы можно заменить словом Me. Получается что-то вроде «выгрузи меня»: UnLoad Me 6. При запуске метода Show выполнение текущей процедуры приостанавливается до того момента, пока форма не будет закрыта (Hide или UnLoad). Об этом удобно думать так: метод Show похож на вложенную процедуру, которая заканчивается только тогда, когда форма закрывается. Учесть эту особенность метода позволяет следующее правило: · Строка <Имя_формы>.Show должна быть в процедуре последней (писать что-либо после нее не имеет смысла) · Действия, которые должны выполняться при открытии формы (которые должны были бы быть написаны после строки <Имя_формы>.Show), надо включить в событийную процедуру <Форма_Инициализация> открывающейся формы. Еще раз отметим, что использование нескольких форм мы считаем основным вариантом реализации нескольких экранов, и дальнейшее изложение основано на этом варианте. Работа над проектом Задание: В процедуре results реализовать переход на другую форму. В дальнейшем мы используем эту форму для вывода результатов. Пока на ней надо разместить текст-заглушку, например «Здесь будут результаты». Редакторские действия: 1. В текущем файле создайте еще одну пользовательскую форму (Редактор Visual Basic – Меню–Вставка–UserForm)
2. В окне свойств присвойте форме имя Form_Results (свойство Name), а свойству Caption значение «Результаты». 3. Разместите на форме ЭУ «Надпись»; убедитесь, что имя элемента – Label1. 4. Получите для новой формы программный модуль и в нем – заготовку событийной процедуры UserForm_Initialize Программирование Приведем схему необходимых действий:
Пока никакого другого текста в указанных процедурах не будет. Для проверки запустите на выполнение основную форму и посмотрите, как теперь будет выглядеть выход из цикла. Реализация заставки Как уже говорилось, обычно заставка содержит информацию о программе, инструкцию по работе с ней, а также дает возможность пользователю зарегистрировать себя. Рассмотрим простой вариант заставки с реализацией всех этих функций на одной форме (будем считать, что имя формы – Form_Zastavka):
Инструкция | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<текст инструкции> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Кто ты? | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Поле или список для регистрации:> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Начало | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Организация действий
В программном модуле заставки будут две процедуры: «Форма_Инициализация» и «Начало_Click».
Форма заставки будет стартовой в нашем проекте, поэтому установку начальных значений глобальных переменных рекомендуется перенести в процедуру «Форма_Инициализация» этой формы.
Задачи процедуры «Начало_Click»:
· проверить регистрацию и сохранить данные о ней (см. далее)
· закрыть текущую форму
· открыть форму с вопросами (будем считать, что теперь ее имя – Form_Vopros)
Следующая схема показывает перераспределение действий между процедурами в сравнении со старым вариантом – без заставки:
Без заставки |
Действия
Инициализация
вопросов
Установка значений глобальных переменных
Кнопка «Начало»
(_Click)
Вывод первого вопроса
Обработка ответа
Следующий вопрос
|
|