Операторы Stop, End и Exit Sub 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операторы Stop, End и Exit Sub



До сих пор мы писали процедуры, которые выполняли свою работу до конца и заканчивали ее только на операторе End Sub, не раньше. Существуют ли операторы, которые подобно операторам выхода из цикла Exit Do и Exit For заставляют компьютер покинуть процедуру, не доходя до ее конца? Такие операторы существуют.

Оператор End заставляет Visual Basic завершить работу не только процедуры, а всего проекта, не доходя до конечного End Sub. Пример: программа

Private Sub Command1_Click()

Print 1;: Print 2;: End: Print 3;

End Sub

напечатает 1 2. Правда, заметить это вы успеете только в пошаговом режиме, так как End завершает режим работы и проект мгновенно переходит в режим проектирования.

Ненавистник пошагового режима мог бы мечтать: "Хорошо бы существовал специальный оператор паузы, чтобы наткнувшись на него, компьютер приостанавливал выполнение программы, а мы могли бы спокойно посмотреть на результаты и подумать". Такой оператор есть, это Stop. Наткнувшись на него, компьютер переходит в режим прерывания и делает паузу до тех пор, пока вы снова не щелкните на кнопке Start. Тогда он продолжает работу с того места, где остановился. Вот вариант программы, при котором вы успеваете разглядеть результат:

Private Sub Command1_Click()

Print 1;: Print 2;: Stop: End: Print 3;

End Sub

Еще пример: программа

Private Sub Command1_Click()

Print 2;: A: Print 3;: End: Print 4;

End Sub

 

Private Sub A()

Print 6;: End: Print 7;

End Sub

напечатает 2 6.

 

Оператор Exit Sub не такой решительный, как End. Он не выбрасывает Visual Basic из режима работы, а просто заставляет компьютер выйти из процедуры, в которой он выполнился. Если он выполнился в вызываемой процедуре, то Visual Basic возвращается в процедуру, ее вызвавшую. Если он выполнился в процедуре обработки события, то Visual Basic просто завершает работу этой процедуры.

Пример: Заменим в предыдущей программе оба End на Exit Sub:

Private Sub Command1_Click()

Print 2;: A: Print 3;: Exit Sub: Print 4;

End Sub

Private Sub A()

Print 6;: Exit Sub: Print 7;

End Sub

Эта программа напечатает 2 6 3.

 

Задание 87: Вот вам программа с процедурами. Вам нужно, не запуская ее, записать на бумажке весь разговор, который ведут герои “Трех мушкетеров”.

Private Sub Command1_Click()

Print "Я, король Франции, спрашиваю вас - кто вы такие? Вот ты - кто такой?"

ATOS

Print "А ты, толстяк, кто такой?"

PORTOS

Print "А ты что отмалчиваешься, усатый?"

DARTANIAN

Print "Анна! Иди-ка сюда!!!"

Exit Sub

Print "Аудиенция закончена, прощайте!"

End Sub

 

Private Sub ATOS()

Print "Я - Атос"

End Sub

 

Private Sub ARAMIS()

Print "Это так же верно, как то, что я -Арамис!"

End Sub

 

Private Sub PORTOS()

Print "А я Портос! Я правильно говорю, Арамис?"

ARAMIS

Print "Он не врет, ваше величество! Я Портос, а он Арамис."

End Sub

 

Private Sub DARTANIAN()

Print "А я все думаю, ваше величество - куда девались подвески королевы?"

Exit Sub

Print "Интересно, что ответит король?"

PORTOS

End Sub

Сверьте с ответом. Если не сходится, запустите программу в пошаговом режиме.

 

Теперь вы достаточно знаете о процедурах, чтобы они стали для вас удобными кирпичиками для постройки программ. Более мощным средством являются процедуры с параметрами, о которых вы сейчас узнаете.

Задание 88: В программе для задания 60 из 9.3 о продавце автомобилей есть два повторяющихся фрагмента. Сам бог велел сделать их процедурами.

Задание 89: Аналогичную вещь можно проделать для калькулятора из 5.9

 

Переменные вместо чисел

Наша цель - процедуры с параметрами. Данный раздел - подготовка к взятию этой крепости.

Вернемся к задаче из 10.1 о фотоальбоме со значками. Вспомним, что мы написали процедуру пользователя для рисования значка. Вот она:

Private Sub Рисуем_мой_значок()

Picture1.Line (100, 100)-(300, 300), vbBlue, B

Picture1.Line (100, 100)-(300, 300), vbBlue

Picture1.Line (100, 300)-(300, 100), vbBlue

End Sub

Значок рисуется в левом верхнем углу фото с отступом в 100 твипов как от левого края фото, так и от верхнего. Предположим, вам разонравился такой отступ и вы решили сделать его поменьше, скажем, 50. Вам нужно в программе в 6 местах поменять число 100 на 50. Вот то-то и неудобно, что в 6, а не в одном. Слишком много труда. В нашей программе это, конечно, пустяк, а вот в больших и сложных программах одна и та же величина может встречаться сотни раз, и чтобы ее изменить, придется вносить сотни исправлений.

Посмотрим, как нам помогут переменныевеличины. Придумаем переменную величину с именем Otstup. Теперь напишем вариант той же процедуры, но с использованием переменной величины:

Dim Otstup As Integer

Private Sub Рисуем_мой_значок()

Otstup = 100

Picture1.Line (Otstup, Otstup)-(300, 300), vbBlue, B

Picture1.Line (Otstup, Otstup)-(300, 300), vbBlue

Picture1.Line (Otstup, 300)-(300, Otstup), vbBlue

End Sub

Теперь для того, чтобы изменить отступ, достаточно заменить число только в одном месте.

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

 

Будем дальше улучшать нашу процедуру. Теперь вы легко можете управлять отступом, но вот беда - правый нижний угол значка остается всегда в одном и том же месте и поэтому размер значка уменьшается с увеличением отступа, а при отступе = 300 значок вообще превращается в точку. Вам хочется так же легко и удобно управлять размером значка, как и отступом. Вы замечаете, что размер квадратного значка равен разнице координат в скобках операторов Line. Вы придумываете переменную с именем Razmer и переписываете программу:

Dim Otstup As Integer

Dim Razmer As Integer

 

Private Sub Рисуем_мой_значок()

Otstup = 100

Razmer = 200

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), vbBlue, B

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), vbBlue

Picture1.Line (Otstup, Otstup + Razmer)-(Otstup + Razmer, Otstup), vbBlue

End Sub

 

Последнее, что вам хочется, это управлять цветом. Нет проблем:

Dim Otstup As Integer

Dim Razmer As Integer

Dim Tsvet As Long

 

Private Sub Рисуем_мой_значок()

Otstup = 100

Razmer = 200

Tsvet = vbBlue

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), Tsvet, B

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), Tsvet

Picture1.Line (Otstup, Otstup + Razmer)-(Otstup + Razmer, Otstup), Tsvet

End Sub

Заметьте, что Tsvet я объявил, как Long, а то 16 миллионов в Integer не уместятся.

Задание 90: Помогите вашему другу менять при помощи переменных отступ, размер и цвет его значка.

Константы

Константами называются те конкретные значения величин, которые мы видим в программе. Например, во фрагменте

a = 1 + 0.25

b = "Амазонка"

Debug.Print "Волга", 10

Form1.BackColor = 15767511

If a > 3 Then Cls

константы это 1 0.25 "Амазонка" "Волга" 10 15767511 3.

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

Вернемся к примеру из предыдущего раздела. Там мы объявили переменную Otstup и везде в процедуре стали писать вместо константы 100 имя этой переменной. Программист имеет право вместо оператора объявления

Dim Otstup As Integer

написать другой оператор объявления:

Const Otstup = 100

Тогда процедура изменит свой вид:

Const Otstup = 100

Private Sub Рисуем_мой_значок()

Picture1.Line (Otstup, Otstup)-(300, 300), vbBlue, B

Picture1.Line (Otstup, Otstup)-(300, 300), vbBlue

Picture1.Line (Otstup, 300)-(300, Otstup), vbBlue

End Sub

В чем разница? В первом случае величина Otstup - переменная величина. Во втором случае величина Otstup объявлена константой, а это значит, что ей запрещено менять свое значение 100, присвоенное ей при объявлении. При попытке изменить значение константы Visual Basic выдаст сообщение об ошибке. Например, ошибкой завершится выполнение такой программы:

Const a = 5

Private Sub Command3_Click()

a = a + 2

End Sub

Хорошо это или плохо? Это плохо там, где величина по смыслу задачи должна менять свое значение, и хорошо там, где не должна. Например, если в программе

Const Пи = 3.14

Private Sub Command4_Click()

r = 50

Длина_окружн = 2 * Пи * r

Площадь_круга = Пи * r ^ 2

End Sub

мы по небрежности где-нибудь напишем оператор типа Пи = 2.87, то Visual Basic выдаст сообщение об ошибке и мы будем этому рады, так как число Пи – очень известная константа, равная 3.14, и никто не имеет права менять ее значение.

Таким образом, при помощи объявления констант мы повышаем надежность программирования.

Обратите внимание, что термином "константа" мы обозначаем два близких понятия: с одной стороны число 100, строку "Волга" и т.п., а с другой стороны имена Otstup, Пи и т.п., обозначающие эти величины. Не думаю, что в будущем эта путаница принесет нам какой-нибудь вред.

Кроме перечисленных выше констант существует еще большое число так называемых внутренних констант Visual Basic. Объявлять их не надо, ими можно сразу пользоваться, если знать их имена и смысл. Например, такими константами являются названия цветов - vbRed, vbBlack и т.п. Каждая из таких констант имеет конкретное численное значение (например, vbRed=255), но названия запоминаются легче, чем числа. Имена, смысл и значение внутренних констант вы найдете в Object Browser.

Процедуры с параметрами

Процедуры с параметрами - мощный инструмент программирования и применяется программистами очень широко.

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

Фото неважное Otstup = 100 Razmer = 200 Tsvet = vbBlue
Фото хорошее Otstup = 200 Razmer = 400 Tsvet = RGB(100,250,150)

Но как это сделать? Ведь в процедуре Рисуем_мой_значок каждой из этих переменных присвоено одно единственное значение, поэтому, какую бы фотографию ни взять, значок всегда будет одинаковый. Можно было бы написать отдельную процедуру для каждого значка, но делать этого не хочется, потому что процедуры эти будут почти одинаковы. А тогда где экономия?

Выход есть. Заметим, что присваивать значения переменным не обязательно внутри процедуры Рисуем_мой_значок. Вот вариант программы, который будет работать:

Dim Otstup As Integer

Dim Razmer As Integer

Dim Tsvet As Long

 

Private Sub Рисуем_мой_значок()

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), Tsvet, B

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), Tsvet

Picture1.Line (Otstup, Otstup + Razmer)-(Otstup + Razmer, Otstup), Tsvet

End Sub

 

Private Sub Command1_Click()

Picture1.Picture = LoadPicture("c:\temp\Rockies.bmp")

'Фото неважное

Otstup = 100

Razmer = 200

Tsvet = vbBlue

Рисуем_мой_значок

Picture1.Print, "21.07.2001"

End Sub

 

Private Sub Command2_Click()

Picture1.Picture = LoadPicture("c:\temp\Porthole.bmp")

'Фото хорошее

Otstup = 200

Razmer = 400

Tsvet = RGB(100, 250, 150)

Рисуем_мой_значок

Picture1.Print, "28.07.2001"

End Sub

Как видите, в процедуре Рисуем_мой_значок значения переменным не присваиваются, а присваиваются в процедурах, которые ее вызывают, причем присваиваются непосредственно перед вызовом. Убедитесь в пошаговом режиме, что все работает нормально.

 

Нормально-то нормально, да вот опять наша программа начала разбухать - в каждой вызывающей процедуре добавилось по три лишних строчки. За красивую жизнь приходится платить. Но и тут создатели языков программирования идут навстречу программистам. Имеется возможность вместо

Otstup = 100

Razmer = 200

Tsvet = vbBlue

Рисуем_мой_значок

писать

Рисуем_мой_значок 100, 200, vbBlue

Все так и делают. Значения, идущие после имени процедуры через запятую, называются параметрами процедуры. Но откуда компьютер знает, что, например, Otstup = 100 и Razmer = 200, а не наоборот - Otstup = 200 и Razmer = 100? Компьютеру это объясняют в заголовке процедуры Рисуем_мой_значок, который теперь пишется по-другому:

Private Sub Рисуем_мой_значок (Otstup As Integer, Razmer As Integer, Tsvet As Long)

Как видите, здесь задаются и порядок параметров и их тип.

Вот как компактно теперь выглядит наша программа. Это и есть ее окончательный вид, к которому мы стремились на протяжении этой главы:

Private Sub Рисуем_мой_значок (Otstup As Integer, Razmer As Integer, Tsvet As Long)

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), Tsvet, B

Picture1.Line (Otstup, Otstup)-(Otstup + Razmer, Otstup + Razmer), Tsvet

Picture1.Line (Otstup, Otstup + Razmer)-(Otstup + Razmer, Otstup), Tsvet

End Sub

 

Private Sub Command1_Click()

Picture1.Picture = LoadPicture("c:\temp\Rockies.bmp")

Рисуем_мой_значок 100, 200, vbBlue

Picture1.Print, "21.07.2001"

End Sub

 

Private Sub Command2_Click()

Picture1.Picture = LoadPicture("c:\temp\Porthole.bmp")

Рисуем_мой_значок 200, 400, RGB(100, 250, 150)

Picture1.Print, "28.07.2001"

End Sub

Обратите внимание, что мы убрали за ненадобностью фрагмент объявлений:

Dim Otstup As Integer

Dim Razmer As Integer

Dim Tsvet As Long

так как эти переменные уже объявлены в заголовке процедуры.

Наткнувшись в процессе выполнения программы на обращение к процедуре (Рисуем_мой_значок 100, 200, vbBlue), Visual Basic присваивает параметрам, приведенным в заголовке процедуры (Otstup, Razmer, Tsvet), указанные значения, а затем выполняет тело процедуры.

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

Рисуем_мой_значок 100, 200, vbBlue

можно было написать

a=100

Рисуем_мой_значок a, 2 * a, vbBlue

Типы параметров

Параметры могут иметь не только числовой, но и строковый и многие другие типы. Пример:

Private Sub Печатаем_3_раза(Что_нибудь As String)

Print Что_нибудь

Print Что_нибудь

Print Что_нибудь

End Sub

 

Private Sub Command1_Click()

Печатаем_3_раза "Кто там? - Это почтальон Печкин!"

Печатаем_3_раза "Дядя Федор"

End Sub

Здесь вы видите процедуру пользователя Печатаем_3_раза и ее параметр - строковую переменную с именем Что_нибудь. При нажатии на кнопку Command1 программа начинает работать и печатает следующий текст:

Кто там? - Это почтальон Печкин!

Кто там? - Это почтальон Печкин!

Кто там? - Это почтальон Печкин!

Дядя Федор

Дядя Федор

Дядя Федор

 

Вот другой пример. Для начала отметим, что величины, которые указываются в скобках функций (например, в Round(5.82716, 3) или LoadPicture("c:\temp\Rockies.bmp")), тоже называются параметрами, хотя их называют также аргументами. Здесь в функции LoadPicture адрес файла взят в кавычки, значит этот параметр является строкой. Можно написать такую программу, которая по нажатии на кнопку Command1 показывает сразу два фото:

 

Private Sub Показываем_два_фото (Фото_1 As String, Фото_2 As String)

Picture1.Picture = LoadPicture (Фото_1)

Picture2.Picture = LoadPicture (Фото_2)

End Sub

 

Private Sub Command1_Click()

Показываем_два_фото "c:\temp\Rockies.bmp", "c:\temp\Porthole.bmp"

End Sub

Теперь мы понимаем, зачем в конце заголовка процедуры ставится пара скобок (). Это для параметров, буде они объявятся.

Дальше о процедурах вы прочтете в Глава 17.

 

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

Задание 92: В задании 90 вы написали процедуру пользователя, которая рисовала значок вашего друга. Перепишите ее, сделав процедурой с тремя параметрами: отступ, размер и цвет значка.

Задание 93: Среди графических методов Visual Basic нет методов "крестик" и "треугольник". Вы можете возместить этот недостаток, написав две соответствующие процедуры с тремя параметрами: координата_х, координата_у, размер.

Задание 94: Представьте себе куб, собранный из 16777216 кубиков - по числу цветов в Visual Basic. Его высота - 256 кубиков, ширина и толщина - тоже по 256 кубиков. Каждый кубик покрашен в свой цвет. Цвета не повторяются. Систему раскраски придумать легко. Например, слева направо растет от 0 до 255 красная составляющая в цвете кубиков, сверху вниз - зеленая, от нас вдаль - синяя. Так что самый левый верхний ближний кубик получается абсолютно черным, а самый правый нижний дальний кубик - абсолютно белым. Сразу все кубики видеть мы, конечно, не можем, но мы можем делать срез куба в любом месте параллельно любой из его граней, в результате чего на срезе будем видеть квадрат, состоящий из 256*256 разноцветных квадратиков. Вот эту задачу среза я бы и хотел вам предложить. Программа предлагает пользователю выбрать один из трех основных цветов (это удобно сделать через меню) и его насыщенность (число от 0 до 255). Этим определяется место среза. Затем программа чертит на форме этот разноцветный срез. Конечно, квадратики получатся очень маленькими, но это ничего.

Указание: Используйте процедуру с двумя параметрами: выбранный пользователем цвет (один из трех) и его насыщенность.

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

 

 



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 355; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.201.37.128 (0.114 с.)