Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Операторы 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. Процедуры с параметрами Процедуры с параметрами - мощный инструмент программирования и применяется программистами очень широко. Вообразите, что вы решили фотографии разного с вашей точки зрения качества помечать значками разного отступа, размера и цвета, чтобы по значку легко было догадаться о качестве. Вот ваши предпочтения:
Но как это сделать? Ведь в процедуре Рисуем_мой_значок каждой из этих переменных присвоено одно единственное значение, поэтому, какую бы фотографию ни взять, значок всегда будет одинаковый. Можно было бы написать отдельную процедуру для каждого значка, но делать этого не хочется, потому что процедуры эти будут почти одинаковы. А тогда где экономия? Выход есть. Заметим, что присваивать значения переменным не обязательно внутри процедуры Рисуем_мой_значок. Вот вариант программы, который будет работать: 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; просмотров: 390; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.33.239 (0.013 с.) |