| Пособие-самоучитель on-line "Visual Basic с нуля" |
Глава 5. Функция MsgBox. Иконки, курсоры в программе. Выход из программы. Функция InputBox. Запрет вызова второй копии.
Скачать исходник программы "Я-не вирус" | Дата создания 23.10.2004 {Автор 4us}

В этой главе, други моя, разберем то, что делает программу удобней и привлекательней для пользователя.

Функция MsgBox для вывода диалогового окна.

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

MsgBox ("сообщение", число и тип кнопок, "заголовок окна", "имя файла справки если есть", номер раздела справки если есть имя файла)

Два последних аргумента необязательны. Они используются, если у тебя создан файл помощи (Help).

"сообщение" - это сообственно сообщение пользователю, например, "Ну ты дурак, нет такого файла" (максимальная длина приблизительно 1024 символа)

"заголовок окна" - это то, что выводится в верхней полосочке (заголовке) окна, например, "Это твоя ошибка"

А вот число и тип кнопок разберем подробнее. Это число получается из складывания трех чисел или констант (кому как удобнее):

- количество и тип кнопок
- вид сообщения (какой значок будет в окне)
- какая кнопка является основной (по умолчанию - первая)

Тип кнопок | Вид сообщения | Основная кнопка
константа | или число | выводимые кнопки | константа | или число | значок сообщения | константа | или число | номер основной кнопки
vbOKOnly | 0 |  | VbCritical | 16 |  | VbDefaultButton1 | 0 | первая
VbOKCancel | 1 |  | VbQuestion | 32 |  | VbDefaultButton2 | 256 | вторая
VbAbortRetryIgnore | 2 |  | VbExclamation | 48 |  | VbDefaultButton3 | 516 | третья
VbYesNoCancel | 3 |  | VbInformation | 64 |  | VbDefaultButton4 | 768 | четвертая
VbYesNo | 4 |  |  |  |  | VbApplicationModal (на уровне приложения) | 0 | модальное окно ( не свернется, пока на кнопку не нажмешь)
VbRetryCancel | 5 |  |  |  |  | VbSystemModal (на уровне системы) | 4096

Теперь, например, если нам нужно вывести на экран предупреждающий запрос с тремя кнопками Да, Нет, Отмена и чтоб главной была кнопка Нет, мы пишем цифру 3+48+256 число 307:

PushButton = MsgBox ("Да ты баран! Нажми Нет!", 307, "Нельзя так делать!!!")

или если использовать константы

PushButton = MsgBox("Да ты баран! Нажми Нет!", vbYesNoCancel + vbExclamation + vbDefaultButton2, "Нельзя так делать!!!")

Получится как на рис. 11.

Рисунок 11.

Видишь, Выделена кнопка "Нет". Значит она главная. Это если пользователь давнет клавишу "Enter", то сработает "Нет", а не "Да"

PushButton - это должна быть объявленная переменная. Это я придумал для нее такое имя.В нее записывается число, обозначающее, какую же кнопку нажал пользователь, чтобы мы могли заставить нашу программу среагировать как-нибудь. А числа (вместо них тоже можно писать константы) эти соответствуют следующим кнопкам:

Константа | Число | Какая кнопка нажата
vbOK | 1 | OK
vbCancel | 2 | Отмена (Cancel)
vbAbort | 3 | Прервать (Abort)
vbRetry | 4 | Повторить (Retry)
vbIgnore | 5 | Пропустить (Ignore)
vbYes | 6 | Да (Yes)
vbNo | 7 | Нет (No)

Сечас мы создадим шедевр программирования, где используем диалоговое окно и разберем кое-что еще. Программа наша называется "Я - не вирус", а замечательность ее в том, что она вообще ничего не умеет делать. Смысл ее в том, что, когда пользователь пытается выйти из программы, возникает событие для формы _Unload. Это событие может быть вызвано оператором Unload, выбором команды "Закрыть" из системного меню формы, закрытием приложения из Списка задач (Task List) Windows, закрытием MDI формы, для которой текущая форма является дочерней, или выходом из Microsoft Windows во время работы приложения. При этом значение аргумента этой процедуры Cansel принимает значение False. Присвоение аргументу Cansel любого ненулевого значения предохраняет форму от удаления, но не останавливает другие события, например, выход из Microsoft Windows. Но нам на это налевать. Мы вставляем в эту процедуру MsgBox c запросом на выход. Если нажимается кнопка Отмена выхода, мы присваиваем локальной переменной Cansel значение True, и выход отменяется, а мы переходим к процедуре FikVam(), которая выводит соответствующий текст в форму.

Обратите внимание, что для того, чтобы в диалоговом окне писать сообщение в несколько строк, я использовал CHR(13). А как раз 13 - это ASCII-код перевода строки.

Вот код этого кошмара.

`Option Explicit` `
Dim PushButton As Long ' объявляем переменную для нажатой кнопки`

`Private Sub Form_Load() ' процедура загрузки формы
Form1.Caption = "Я - не вирус!" 'прописываем заголовок формы
Form1.Print " ************************************" 'пишем на форме честно, что это за штука
Form1.Print " Ты запустил классную программу! "
Form1.Print " Только я ни черта делать не умею!"
Form1.Print " Зато я и вреда не приношу! "
End Sub`

`Private Sub Form_Unload(Cancel As Integer) 'процедура выгрузки формы
PushButton = MsgBox("Что ж ты гад делаешь!!" & Chr(13) & "Я к те, как к родному, а ты..." & Chr(13) & "Нажми Отмену сечас же!", 273, "Ты же закрываешь меня!") ' вывод диалогового окна при попытке закрыть форму
If PushButton = 1 Then ' условие, если нажата кнопка ОК
Cancel = False ' подтверждаем выход, хотя это необязательно, она и так выйдет
Else ' в противном случае
Cancel = True ' отменяем выход
FikVam 'ссылка на процедуру, которая срабатывает при нижатии Отмена
End If 'конец условия
End Sub`

`Private Sub FikVam() 'процедура, которая срабатывает при нижатии Отмена
Form1.Cls ' очистка формы
Form1.Print "Вот Молодец! Лучше я, чем вирус" ' вывод текста на форму
End Sub`

Как вставить в программу иконку и курсор.

Сейчас сделаем нашу никчемушку красивой. Во-первых заменим идиотский значок Бейсика на наш. Для этого в окне свойств Form1 ткнем в свойство Icon и в открывшемся окне Загрузить Иконку выберем подходящую. В исходнике программы я положил иконку scin.ico для примера. Если у тебя нет иконок, можно пойти двумя путями: найти их в Интернете (их там полно) или изготовить самому. Я считаю, что достойная программа должна иметь свою, уникальную иконку, а не стыренную у других. Мы что, такие безрукие, что иконку сделать не сможем? Ты можешь скачать простую самопальную программку ICA Converter (не мою) для иконкоделанья. Не самая крутая, зато бесплатно и худо-бедно работает.
Теперь выберем для нашей формы другой курсор. Для этого в окне свойств Form1 найдем свойство MousePointer и выберем там 99 - Custom. Это значит, что значком будет тот файл, который мы выберем (расширение должно быть .ico или .cur). Потом ткнем в свойство MouseIcon и в открывшемся окне Загрузить Иконку выберем подходящую (в исходник я положил hns.cur). Надо сказать, что так сказать штатные курсоры Windows лежат в "C:\WINDOWS\Cursors". Ну конечно лучше сделать свой.

Для полного обалдения можно еще воткнуть фоновую картинку в форму Form1, чтобы наш шедевр выглядел привлекательней. Для этого в окне свойств Form1 ткнем в свойство Picture и в открывшемся окне Загрузить Рисунок выберем подходящий. Надо только брать картинку разумного размера. В исходнике я положил картинку 00027.jpg размером 118Kb c небольшой контрастностью, чтобы лучше была видна надпись и подогнал размер формы под нее, а также в окне свойств выставил размер и тип (свойство .Font) и цвет (свойство .ForeColor) шрифта.

Функция InputBox для получения данных от пользователя

Теперь бы как хорошо было бы, если бы.... пользователь помимо нажатия кнопок мог отвечать нам какими-нибудь данными, ввести например, пороль, или имя, или еще чего-нибудь. Для этого используется функция InputBox.

Синтаксис этой функции таков:

InputBox("сообщение", "заголовок окна", "данные по умолчанию", расстояние между левой границей экрана и левым краем экрана,то же для верхней границы, "имя Help-файла" , номер раздела Help-файла)

Обязательным здесь является только первый аргумент (), но желательно использовать второй и третий. Четвертый и пятый - при необходимости, шестой и седьмой - если есть Help (а у нас его нет). Смысл аргументов такой же, как и в MsgBox'е. Итак

- "сообщение" - это, что мы пишем для пользователя, например, "Введи свое имя" (максимальная длина приблизительно 1024 символа)
- "заголовок окна" - это то, что выводится в верхней полосочке окна, например, "Авторизация!"
- "данные по умолчанию" -это то что выведется в поле окна, как бы предложение юзеру
- расстояние между левой границей экрана и левым краем экрана - ну это понятно, только расстояние это в Твипах (такая неведомая единица измерения, принятая по-умолчанию в Бейсике, я думаю, что 1 пиксель приблизительно равен 27 твипам, но зуб за это не дам)
- то же для верхней границы - то же самое, только по вертикали

Последние два аргумента нам пока ни к чему.

Добавим теперь в нашу замечательную программу "Я - не вирус" InputBox так, чтобы при загрузке он очень строго спрашивал пароль юзера, а поскольку тот его не знает, пускал бы и так. Вставим в процедуру Form_Load, сразу после определения заголовка формы (Form1.Caption = "Я - не вирус!") следующий код:

`Dim` `Password As String 'объявим локальную переменную, чтоб записать то, что введет юзер`

`Password = InputBox ("Этот программный продукт доступен только по паролю." _ 'выведем окно InputBox
& "Если Вы приобрели его законно, Прочитайте пароль на диске и введите его в это окно.", _
"Авторизация пользователя", "Ж4д17") 'это я такой пароль придумал - Ж4д17`

`If Password ="Ж4д17" Then 'если юзер воспользовался нашим паролем`

`PushButton = MsgBox ("Ты что, не смог ничего придумать?" & Chr(13) & _
"А пароля, то и нет", 0 + 48, "Результат авторизации")`

`ElseIf Password = "" Then 'в противном случае, если юзер ничего не ввел или нажал кнопку Отмена
PushButton = MsgBox ("Думаешь, можно так взять и уйти? " _
& Chr(13) & Password & Chr(13) & "Ну-ка заходи, сволочь", 0 + 48, _
"Результат авторизации")`

`
Else ' в противном случае, если юзер ввел свой пароль
PushButton = MsgBox ("Ты что, не смог ничего придумать?" & Chr(13) & _
"А пароля, то и нет", 0 + 48, "Результат авторизации")
End If`

Обрати внимание, что так, как некоторые строки кода получаются очень длинными, я использую перенос. Для этого надо поставить курсор в то место, с которого хотите перенести строчку и нажиматьпробел, нижнее подчеркивание и ENTER. Не надо только разрывать строчку, заключенную в кавычки, а то это вызовет ошибку.

Запрет вызова второй копии программы

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

`If` `App.PrevInstance = True Then
MsgBox "Программа Я - не вирус уже загружена. Не надо вызывать ее еще раз.", 16, "Ошибка пользователя"
End
End If`

Здесь все ясно. При запуске программы "Я - не вирус" App.PrevInstance проверяет, запущена ли эта программа ранее. Если нет, то App.PrevInstance принимает значение False, если запущена, то True. Это условие проверяется оператором If. Выводится диалоговое окно MsgBox, и вторая копия закрывается.

Ну вот, пока все. Код программы можно скачать вверху страницы. В следущей главе наверное разберем PictureBox и IimageBox для работы с картинками.

Copyright © 2004 4us