Шрифт:
Интервал:
Закладка:
End Sub
'Это новый текст программы:
Private Sub Command1_Click()
Picture1.Picture = LoadPicture("c: tempRockies.bmp")
Рисуем_мой_значок Picture1.Print, "21.07.2001"
End Sub
Private Sub Command2_Click()
Picture1.Picture = LoadPicture("c: tempPorthole.bmp")
Рисуем_мой_значок Picture1.Print, "28.07.2001"
End Sub
Private Sub Command3_Click()
Picture1.Picture = LoadPicture("c: tempBalloons.bmp")
Рисуем_значок_друга Picture1.Print, "12.08.2001"
End Sub
Private Sub Command4_Click()
Picture1.Picture = LoadPicture("c: tempGuitar.bmp")
Рисуем_значок_друга Picture1.Print, "20.07.2001"
End Sub
Пояснение того же самого другими словами: У нас добавилось две процедуры. Каждая из этих процедур представляет собой цепочку операторов, из которых состоит упомянутый фрагмент. Сверху цепочки вы пишете заголовок процедуры (Private Sub…), а снизу — конечную строчку процедуры (End Sub). Все операторы, из которых состоит процедура, кроме заголовка и конечной строки, будем называть телом процедуры. Как только эти процедуры написаны, компьютер "узнает", что такое Рисуем_мой_значок и Рисуем_значок_друга. Поэтому в остальных процедурах слова Рисуем_мой_значок и Рисуем_значок_друга используются, как настоящие операторы, и выполняются, как настоящие операторы. Суть их выполнения в том, что когда Visual Basic во время выполнения программы натыкается на оператор Рисуем_мой_значок, он ищет в программе процедуру с именем Рисуем_мой_значок и выполняет тело этой процедуры, после чего возвращается к выполнению программы. Этот процесс называется вызовом процедуры или обращением к процедуре.
Обязательно выполните эту программу в пошаговом режиме! Обязательно обратите внимание, что после выполнения тела вызываемой процедуры (Рисуем_мой_значок) компьютер возвращается в вызывающую процедуру (Command1_Click) к выполнению оператора, следующего за оператором Рисуем_мой_значок (в нашем случае это оператор Print).
Две дописанные нами процедуры называются процедурами пользователя, в отличие от привычных нам процедур обработки событий. Их коренное отличие от последних в том, что вызываются они не наступлением каких-то событий, а упоминанием их имени в других процедурах. Процедуры пользователя и являются "процедурами типа "Как"".
Вы можете сами посчитать, насколько новая программа будет короче старой при де сяти фотографиях.
Есть еще один способ обратиться к процедуре. Вместо оператора
Рисуем_мой_значок
можно написать оператор
Call Рисуем_мой_значок
Смысл их совершенно одинаков. Вторым способом часто пользовались раньше. С английского слово "Call" переводится "Вызов".
Взаимодействие процедур в программе
Вызываемая процедура сама в процессе своей работы может вызвать какую-нибудь другую процедуру. И так далее. Потренируемся:
Определите без компьютера, что напечатает программа:
Private Sub Command1_Click()
Print 1;: A: Print 2;: В: Print 3;
End Sub
Private Sub A()
Print 4;
End Sub
Private Sub B()
Print 5;: С: Print 6;
End Sub
Private Sub С()
Print 7;
End Sub
Работать программа начинает по щелчку по кнопке Command1. Вряд ли вам с непривычки удасться дать правильный ответ. Тогда непременно программу — в компьютер и пошаговый режим. Желтая полоска будет скакать по программе туда-сюда. Перед каждым нажатием на F8 вы обязаны предсказать, куда она прыгнет! Не сможете — нет смысла читать книгу дальше.
Ответ:
1 4 2 5 7 6 3
Начинающим программистам не хочется писать процедуры пользователя, как не хочется им писать длинные имена и соблюдать отступы от левого края окна кода. "Наши программы отлично работают и безо всего этого". Верно, работают. Потому что программы коротенькие.
Запомните еще одно хорошее правило: Размеры любой процедуры не должны превышать одного экрана монитора. Если превышают, то даже если в ней нет повторяющихся фрагментов, все равно разбейте ее по смыслу на два-три фрагмента и каждый сделайте процедурой. Ваша программа будет гораздо легче читаться.
Задание 86: Дополните ваш фотоальбом процедурой пользователя, которая перед показом очередной фотографии воспроизводит один и тот же музыкальный звук, например, "c: WindowsMediaChimes.wav".
Операторы Stор,
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