End Sub

advertisement
Занятие 15 «Процедуры и функции в Visual Basic.
Диалог с пользователем.»
В занятии рассказывается, как в своих проектах использовать команду и
функцию MsgBox. Слушатели делают проект prjDialogue, реализующий диалог с
пользователем, используя InputBox .и MsgBox. Кроме этого в занятии объясняется,
как создавать новые процедуры и функции. Слушатель модифицирует проект
prjDialogue так, чтобы каждый этап диалога был реализован в отдельной
процедуре или функции
1. Окно MsgBox, команда MsgBox
Для вывода различных сообщений в Visual Basic имеется окно, подобное
InputBox – MsgBox. Почти все приложения Windows используют MsgBox, т. к. этот
компонент входит в состав Windows. Visual Basic только предоставляет
возможность его вызова.
Вид окна может быть различным, но в его состав всегда входит:
-текст сообщения (prompt);
-заголовок (title);
-пиктограмма;
-набор кнопок.
Синтаксис команды:
MsgBox prompt [,type] [,title]
где type – целая константа (или несколько констант), определяющая, какие кнопки
(комбинации кнопок) и пиктограммы будут отображаться в окне сообщения.
Необязательные параметры приведены в квадратных скобках.
Параметр type определяет внешний вид MsgBox. Значение параметра
формируется из нескольних частей, которые можно складывать: button, icon,
default, modal, extras.
Для категории параметра button, icon, default, modal можно использовать
только одну из допустимых констант. Для категории extras допусткается
применение комбинации значений.
Ниже приведена таблица констант параметра type MsgBox.
1
Константа
Значение
Описание
Категория Button
VbOkOnly
0
Только кнопка ОК
VbOkCancel
1
VbAbortRetryIgnore
2
Кнопки ОК и Отмена
Кнопки
Стоп,
Повторить,
Пропустить
VbYesNoCancel
3
Кнопки Да, Нет и Отмена
VbYesNo
4
Кнопки Да и Нет
VbRetryCancel
Категория Icon
5
Кнопки Повторить и Отмена
VbCritical
16
VbQuestion
32
VbExclamation
48
VbInformation
Категория Default
64
VbDefaultButton1
0
VbDefaultButton2
256
VbDefaultButton3
512
VbDefaultButton4
Категория Modal
768
По умолчанию активна первая
кнопка
По умолчанию активна вторая
кнопка
По умолчанию активна третья
кнопка
По умолчанию активна четвертая
кнопка
0
Модальное диалоговое
приложения
окно
VbApplicationModal
4096
Модальное
системы
окно
VbSystemModal
Категория Extras
VbMsgBoxHelpButton
16384
VbMsgBoxSetForeground
65536
VbMsgBoxRight
524288
VbMsgBoxRtReading
1048576
Отображает
пиктограмму
Critical Message
Отображает
пиктограмму
WarningQuery
Отображает
пиктограмму
Warning Message
Отображает
пиктограмму
Information Message
диалоговое
Дополнительная кнопка для
справки
Отображение диалогового окна в
фоновом режиме
Текст выровнен по правому краю
Текст
отображается
справа
налево (еврейский, арабский)
2
Для того, чтобы лучше понять, какие значения какого параметра в операторе
MsgBox что могут дать для окна сообщения, разберем несколько маленьких
примеров.
Начните новый проект, поместите на форму командную кнопку command1 и
составьте для нее следующий код:
Private Sub Command1_Click( )
MsgBox "Мое первое окно сообщения"
End Sub
Если теперь запустить проект на выполнение и щелкнуть на командной
кнопке, то на экране появится вот такое окно сообщения:
Чтобы оно пропало, нужно щелкнуть на его кнопке. Давайте
теперь в строку кода попробуем вставить второй параметр (buttons).
Сразу после того, как вы поставите запятую, следующую за вторым
параметром, Visual Basic предложит вам список констант, которые вы
можете выбрать:
Выберем из них vbCritical. Тогда строка кода примет вид:
MsgBox "Мое первое окно сообщения", vbCritical
В результате на окне сообщения окажется пиктограмма:
Попробуйте поставить в качестве значения второго параметра константу
vbQuestion. Окно станет таким:
3
Можно выбрать одну из четырех пиктограмм для отображения в окне
сообщения.
Предположим теперь, что вы хотите, чтобы в окне MsgBox отображались
вопросительный знак, кнопки ДА, НЕТ, и при этом кнопка НЕТ была кнопкой по
умолчанию. Кроме того, выполнение дальнейших операторов программы должно
продолжаться только после закрытия окна (окно должно быть модальным окном
приложения). Для этого следует просуммировать соответствующие значения:
t$=vbYesNo Or vbQuestion Or DefaultButton2 Or vbApplicationModal
Обратите внимание, что корректное суммирование значений констант
выполняется оператором Or.
Оператор будет таким:
MsgBox “Первое окно сообщения”,t$
Не забудьте в коде определить переменную t$. В результате ваше окно
сообщения будет иметь вид:
Так как всем символьным константам Visual Basic соответствуют числовые
значения, код, реализующий те же требования, мог бы выглядеть следующим
образом:
t$ = 4 + 32 + 256 + 0
MsgBox “Первое окно сообщения”, t$
Попробуем теперь в строку кода добавить значение еще одного параметра title.
Напишите, например, свою фамилию:
MsgBox "Первое окно сообщения",t$, “Истомина”
В строке заголовка окна сообщения напечатается ваша фамилия:
4
2. Функция MsgBox( )
Если вам необходимо не только что-либо сообщить пользователю, но и
получить информацию о том, какое решение принял пользователь, можно
воспользоваться функцией MsgBox. Функция MsgBox( ) не только отображает
окно сообщения, но еще и возвращает некоторое значение (ответ пользователя о
том, какое он принял решение). Приведем формат функции MsgBox( ):
Возвращаемое_значение= MsgBox (prompt [,type] [,title])
Возвращаемое_значение позволяет определить, какую кнопку нажал
пользователь. В таблице, которая приведена ниже, содержатся значения,
возвращаемые функцией MsgBox:
Константы
VbOk
VbCancel
VbAbort
VbRetry
VbIgnore
VbYes
VbNo
Значение
1
2
3
4
5
6
7
Нажата кнопка
ОК
Отмена
Стоп
Повторить
Пропустить
Да
Нет
Синтаксис команды предназначен для окна сообщения MsgBox с одной
кнопкой, т. к. в этом случае возвращаемое значение не важно. Однако при
запросах требуется вызывать MsgBox как функцию, т. к. возвращаемое значение
используется для определения кнопки, нажатой пользователем.
Необходимо корректно использовать функцию MsgBox. Обычными для нее
являются вопросы типа: «Хотите ли Вы сохранить изменения в…?»
(Да/Нет/Отмена). Вопрос должен формулироваться четко и ясно, чтобы
пользователь мог дать на него однозначный ответ.
Кнопка Default (активная по умолчанию) должна определяться таким
образом, чтобы при случайном нажатии клавиши <Enter> действия, реализуемые
в процедуре обработки нажатия кнопки по умолчанию, не могли нанести
большого вреда. Например, не следует в окне с вопросом: «Удалить все
внесенные изменения?» (Да/Нет) назначать кнопку Да по умолчанию.
5
3. Проект prjDialogue
Cделаем небольшой проект. Смысл проекта заключается в том, что
пользователю в несколько этапов будут задаваться вопросы (с помощью окна
InputBox). Ответы будут использоваться для некоторых вычислений или
сравнений, после которых на каждом этапе ему с помощью функции MsgBox
будет сообщаться об итогах данного этапа и будет предлагаться продолжить
диалог или закончить его. Если пользователь принимает решение продолжить
работать с программой, задаются вопросы следующего этапа, ответы на которые
будут использоваться для некоторых вычислений или сравнений. И опять в окне
MsgBox будет даваться некоторое сообщение пользователю и предложение
продолжить или закончить диалог.
Этапов в проекте может быть сколько угодно. Совместно мы сделаем один
из них, еще два Вы сделаете самостоятельно. Если хотите, можете сделать и
больше.
На форму поместим одну командную кнопку (свойство Caption зададим –
«Диалог»). Весь код проекта будем составлять в коде этой командной кнопки.
На первом этапе запросим имя пользователя, после чего поприветствуем его,
используя метод Print и функцию Tab, на форме.
YourName = InputBox (“Как Вас зовут?”)
Print Tab (10);”Приветствуем Вас,”;YourName
Не забудьте объявить переменную YourName.
Далее запросим возраст пользователя:
YourAge = InputBox (“Сколько Вам лет?”, “Ваш возраст”)
После этого запросим возраст соседа пользователя:
HimAge = InputBox (“Сколько ему лет?”, “возраст соседа”)
Вопросы первого этапа завершены. Обработаем их: сравним эти два
возраста. С помощью функции MsgBox сообщим результаты сравнения
пользователю и предложим перейти ко второму этапу. При этом пользователь
должен иметь возможность выйти из программы и закончить отвечать на
вопросы.
Блок кода, в котором производится сравнение возрастов может быть таким:
f$ = vbYesNo Or vbExclamation Or vbDefaultButton1
If YourAge > HimAge Then
Answer1%=MsgBox("Вы старше соседа! Продолжим диалог?", f$)
ElseIf HimAge > YourAge Then
Answer1% = MsgBox("Ваш сосед старше Вас! Продолжим диалог?", f$)
Else
Answer1% = MsgBox("Вы одногодки! Продолжим диалог?", f$)
End If
6
На этом этапе окно MsgBox мы вызываем с помощью функции MsgBox, т. к.
нам важен ответ пользователя на вопрос: хочет он продолжить работу с проектом
или нет. Переменную, в которой будет храниться ответ пользователя, назовем
Answer1%. Теперь обработаем ответ пользователя. Если он ответил <No>, то,
согласно таблице, Answer1% = 7. Перед последней строкой процедуры (End Sub)
поместим еще одну строку и слева обозначим ее меткой, например, 100:
100 Print: Print: Print Tab(5); “До свидания!”
Если значение переменной Answer1% = 7, то будем делать переход на
строку с меткой 100.
Goto 100
После нее выполнится строка End Sub, то есть вопросов пользователю
больше не будет, программа закончит свою работу.
Если пользователь решил продолжить диалог (согласно таблице значение
Answer1% = 6), то будем делать переход на следующий блок программного кода –
этап 2. Первую строку кода этого этапа обозначим меткой 10:
Goto 10
Тогда блок анализа ответа пользователя может выглядеть вот так:
If Answer1% = 7 Then
GoTo 100
Else
GoTo 10
End If
Не забудьте в начале процедуры объявить все необходимые переменные:
Dim YourName As String, YourAge As Integer
Dim HimAge As Integer, f$, Answer1%
А теперь придумайте вопросы для следующих этапов диалога с
пользователем, составьте код для них сначала в тетради, потом проверьте и
отладьте его на компьютере.
4. Создание новых процедур
Visual Basic – язык процедур. Как и во многих других языках
программирования в Visual Basic весь программный код находится внутри
процедур.
Процедура – это подпрограмма (часть программного кода). Она начинается
оператором Sub, заканчивается оператором End Sub. Между ними помещается
код. Процедура обязательно имеет имя. Процедуры могут вызываться самим
Visual Basic. Это процедуры обработки событий. Такие процедуры относятся к
7
конкретному объекту и событию, связанному с ним. Имя процедуры обработки
события состоит из имени объекта и имени события. Например:
Private Sub Command1_Click( )
End Sub
Можно создавать собственные процедуры, так называемые общие
процедуры. Такие процедуры относятся к секции General (Declaration).
Существует два способа добавления процедуры в проект. Первый способ
заключается в том, чтобы написать код прямо в разделе General объявлений
формы или модуля. Другой способ – использование пункта Add Procedure
(добавить процедуру) из меню Tools (Сервис).
Начните новый проект и добавьте общую процедуру:
Public Sub Remember( )
Dim t As String
t = vbOKOnly Or vbExclamation Or vbMsgBoxSetForeground
MsgBox "Учи уроки!", t, "Напоминание"
End Sub
После того, как общая процедура получила свое имя, она может быть
вызвана и выполнена. Вызвать процедуру можно в любой другой процедуре кода
с использованием оператора Call или просто указав ее имя, столько раз, сколько
нужно по смыслу проекта. Использование ключевого слова Call делает
программный код более удобным для чтения.
Сделайте в своем проекте командную кнопку, а в ее коде вызов процедуры
Remember( ):
Call Remember
Теперь, если вы запустите проект на выполнение и щелкните на кнопке,
увидите окно MsgBox:
В любом другом месте программы, если вы захотите напомнить
пользователю, что надо учить уроки, вам достаточно будет вставить в
соответствующее место вызов процедуры Remember( ), а не писать ее снова.
8
Процедуры общего назначения не связаны ни с каким событием, и их вызов
разработчик осуществляет по собственному усмотрению.
5. Создание новых функций
Функция построена также, как процедура. Однако есть отличия. Как и в
математике, результатом работы функции является только одно возвращаемое
значение.
Добавить в проект функцию можно теми же двумя способами, которые
используются для добавления процедур: либо ввести код функции
непосредственно в раздел General формы или модуля, либо с помощью
диалогового окна Add Procedure. Для определения функции используется
ключевое слово Function. В конце функции вместо End Sub пишется End Function.
Добавьте в свой проект любым способом функцию, которая бы с помощью
окна InputBox запрашивала имя пользователя.
Public Function Surname( ) As String
Surname = InputBox("ВВедите свою фамилию", "фамилия")
End Function
В объявлении функции определяется тип возвращаемого значения.
Выполнить функцию можно в любом месте кода столько раз, сколько потребуется
разработчику, использовав в коде возвращаемое ею значение. Например, можно
напечатать на форме введенное пользователем имя:
Print Surname
6. Изменение проекта prjDialogue
На предыдущем уроке вы сделали проект prjDialogue, в котором
пользователю задавалось несколько вопросов в несколько этапов. На каждом
этапе ответы пользователя анализировались, сравнивались, или с их помощью
производились вычисления. На основе анализа делался некоторый вывод и
печатался в окне MsgBox.
Все этапы диалога с пользователем содержались в одной процедуре
командной кнопки события Click( ). Процедура получилась громоздкая, плохо
читаемая, со множеством ссылок.
Попробуем изменить проект следующим образом: каждый этап диалога
будем делать в отдельной процедуре общего назначения.
Этап проекта, на котором пользователю задается вопрос об имени, и он
приветствуется на форме, поместим в процедуру Name( ):
9
Private Sub Name( )
Dim SurName As String
SurName = InputBox(“Как Вас зовут?”)
Cls
Print:Print:Print:Print
FontSize = 14
Print Tab(5);”Приветствуем Вас,”; SurName
End Sub
В процедуре Age( ) будут задаваться вопросы и анализироваться ответы
пользователя о возрасте:
Private Sub Age( )
Dim YourAge%, HimAge%, Answer%,F $
YourAge% = InputBox (“Сколько Вам лет?”,”ваш возраст”)
HimAge%=InputBox (“Сколько лет Вашему соседу”,”сосед”)
F$ = vbYesNo Or vbExclamation Or vbDefaultButton1
If YourAge% > HimAge% Then
Answer%=MsgBox(“Вы старше своего соседа! Продолжим_
диалог?”, F$)
ElseIf HimAge% > YourAge% Then
Answer%=MsgBox(“Ваш сосед старше Вас! Продолжим_
диалог?”, F$)
Else
Answer%=MsgBox(“Вы одногодки! Продолжим диалог?”,F$)
End If
If Answer%< > 7 Then
Call…
Else
Print: Print: Print Tab(5);”Большое спасибо за беседу.”
Print Tab(10);”До свидания.”
End If
End Sub
В последнем блоке процедуры, если пользователь не ответил «нет» на
вопрос, хочет ли он продолжить диалог (переменная Answer%<>7), вызывается
процедура следующего этапа (Call…), в противном случае процедура заканчивает
свою работу, вопросы пользователю больше не задаются.
Процедура командной кнопки будет иметь вид:
10
Private Sub Command1_Click( )
Call Name
Call Age
End Sub
Доделайте код проекта, поместив код каждого этапа в отдельную процедуру.
Такой код лучше читается, не имеет ссылок, его легче модифицировать.
Например, чтобы поменять очередность этапов, достаточно указать другое имя
процедуры в операторе Call.
7. Область видимости переменных в процедурах.
Инкапсуляция
В первом варианте проекта prjDialogue без отдельных процедур, чтобы
проанализировать ответ пользователя о его желании продолжить диалог, на
каждом этапе приходилось вводить новую переменную для ответа: answer1% - на
первом этапе, answer2% - на втором этапе и т. д.
Во втором варианте проекта для хранения ответа на аналогичный вопрос на
первом этапе проекта в процедуре Age( ) объявлена переменная Answer%. Она
объявлена с помощью оператора Dim. Эта переменная остается в действии, т. е.
она «видима» только для операторов блока кода этой процедуры. После
завершения работы процедуры эта переменная удаляется из памяти. Значит в
процедуре следующего этапа проекта для хранения ответа пользователя на
аналогичный вопрос можно объявить локальную переменную с тем же именем.
Эта переменная «скрыта» для остальной части кода.
Способность процедуры скрывать свою внутреннюю работу называется
инкапсуляцией. Хорошо инкапсулированной называется такая процедура, которая
не зависит от других частей кода и конкретных объектов. Такая процедура
«работает» всегда одинаково.
8. Задания
Сделайте проект prjDialogue, реализующий диалог с пользователем,
описанный в пункте 6 и пришлите на проверку.
11
Download