Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3490 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 13:

Проектирование интерфейса. Диалоговые окна

Вывод сообщений. Функция MsgBox

Рассмотрим сейчас встроенные диалоговые окна, которые появляются при вызове некоторых функций VBA. И начнем наше рассмотрение с функции MsgBox, предназначенной для вывода сообщений. Диалоговое окно, создаваемое функцией MsgBox, служит для вывода на экран сообщения программы и получения от пользователя простой реакции на это сообщение в виде щелчка одной из кнопок окна. В простейшем случае эта функция вызывается как процедура. Например, вызов:

MsgBox "Сегодня на календаре" & Date

выведет окно:

Пример окна сообщений

Рис. 12.3. Пример окна сообщений

После щелчка кнопки OK вызов функции завершится, и выполнение программы возобновится с оператора, стоящего непосредственно за этим вызовом.

Диалоговое окно, выводимое функцией MsgBox, можно обогатить несколькими кнопками, чтобы пользователь мог указать с их помощью направление дальнейшего вычисления, а также присоединить к нему контекстную справку. В общем случае вызов MsgBox имеет вид:

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

Здесь параметр prompt (сообщение) - строковое выражение, значение которого выводится в окне. Его максимальная длина не должна превышать 1024 символов. Разбиение на строки в этом выражении можно производить, используя символ возврата каретки ( Chr(13) ), символ перевода строки ( Chr(10) ), их комбинацию ( Chr(13) & Chr(10) ) или константу vbCrLf. Числовой параметр buttons (кнопки) задает виды командных кнопок, помещаемых в окне, кнопку, выбираемую по умолчанию, и модальность диалогового окна. Он получается как сумма кодов соответствующих кнопок и свойств. Явно не заданный, этот параметр считается равным 0. Строковое выражение title (заголовок) задает заголовок окна. Если его нет, заголовком становится имя приложения (см. пример, приведенный выше, где мы использовали Word). Параметры helpfile (файл справки) и context (контекст) должны присутствовать (или отсутствовать) вместе. Первый из них - имя файла, содержащего справку, которая будет выведена при нажатии клавиши F1, а второй - числовое выражение, задающее номер темы со справкой в этом файле.

Вот коды кнопок и других свойств окна функции MsgBox:

Имя константы Код Описание
Коды наборов командных кнопок
vbOKOnly 0 только кнопка OK (Готово)
VbOKCancel 1 кнопки OK и Cancel (Отказ)
VbAbortRetryIgnore 2 кнопки Abort (Прервать), Retry (Продолжить) и Ignore (Игнорировать)
VbYesNoCancel 3 кнопки Yes (Да), No (Нет) и Cancel
VbYesNo 4 кнопки Yes и No
VbRetryCancel 5 кнопки Retry и Cancel
Коды пиктограмм
VbCritical 16 важное сообщение (крестик в круге)
VbQuestion 32 запрос (вопросительный знак)
VbExclamation 48 предупреждение (восклицательный знак)
VbInformation 64 информационное сообщение (i в круге)
Кнопка, выбранная по умолчанию
VbDefaultButton1 0 первая кнопка
VbDefaultButton2 256 вторая кнопка
VbDefaultButton3 512 третья кнопка
VbDefaultButton4 768 четвертая кнопка
Модальность диалога
VbApplicationModal 0 модален относительно приложения
VbSystemModal 4096 модален относительно системы

Диалоговое окно модально относительно приложения, если для продолжения работы в текущем приложении пользователь должен закончить работу в этом окне (ответить на сообщение). Модальность относительно системы означает, что все приложения будут приостановлены до завершения работы в данном окне.

Может показаться странным, что константа VbDefaultButton4 указывает на четвертую кнопку, хотя максимальное количество кнопок, определяемых кодами от 0 до 5, - три. Дело в том, что некоторые приложения (например, Excel) при наличии параметров справка и контекст могут автоматически добавить в окно кнопку справки Help, вызывающую окно справки.

Результирующее значение параметра buttons получается как сумма кодов по одному из каждой группы. Например, значение 36 = 4 + 32 = VbYesNo + VbQuestion означает, что в окне будет пиктограмма с вопросительным знаком и две кнопки Yes и No, причем первая из них будет считаться выбранной, если пользователь ее щелкнет или нажмет клавишу Enter.

Как узнать, какую кнопку выбрал пользователь? Присвоить значение функции MsgBox некоторой целочисленной переменной и проверить его. Возвращаемые MsgBox значения приведены в таблице:

Имя константы Значение Нажатая кнопка
vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No

Если в окне есть кнопка Cancel, нажатие клавиши Esc завершает работу в окне и возвращается тот же код vbCancel, что и при выборе кнопки Cancel.

В следующем примере создается окно с сообщением об ошибке и вопросом о продолжении вычисления. В нем пиктограмма важного сообщения и кнопки Yes и No, причем вторая - кнопка, выбираемая по умолчанию. Файл со справкой называется ERRORS.HLP, а номер контекстной справки в этом файле равен 200.

Public Sub Mes2()
	Dim Msg As String, MyString As String
	Dim Btns As Integer
	Dim Title As String, Help As String
	Dim NmbCont As Integer, Result As Integer
	
	Title = " Вы ввели неверные данные !"           ' заголовок окна.
	Msg = "Будем продолжать работу ?"               ' сообщение.
	Btns = vbYesNo + vbCritical + vbDefaultButton2  ' кнопки и свойства
	Help = "ERRORS.HLP"                             ' имя файла со справкой
	NmbCont = 200                                   ' номер темы
			' Вывод сообщения.
	Result = MsgBox(Msg, Btns, Title, Help, NmbCont)
	If Result = vbYes Then	         ' пользователь нажал кнопку Yes.
		MyString = "Да"              ' действия по продолжению работы
	'...
	Else                             ' пользователь нажал кнопку No.
		MyString = "Нет"             ' действия по прекращению работы
	'...
End If

End Sub
12.1.

При этом вызове на экране появится окно:

Сообщение о неверных данных

Рис. 12.4. Сообщение о неверных данных
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.