русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Зачем нужны процедуры пользователя


Дата добавления: 2015-06-12; просмотров: 680; Нарушение авторских прав


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

Задача легкая, мы ее уже решали в 9.3. Вот программа для 4 фотографий:

Private Sub Command1_Click()

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

Picture1.Print , "21.07.2001"

End Sub

 

Private Sub Command2_Click()

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

Picture1.Print , "28.07.2001"

End Sub

 

Private Sub Command3_Click()

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

Picture1.Print , "12.08.2001"

End Sub

 

Private Sub Command4_Click()

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

Picture1.Print , "20.07.2001"

End Sub

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

 

 
 

Усложним задачу: Некоторые из фотографий сняли вы, некоторые - ваш друг. Вы хотите, чтобы в знак этого на ваших фото в левом верхнем углу появлялся один значок, а на фото вашего друга другой. Ваш любимый значок такой:

 
 

а у вашего друга такой:

Пусть они и появляются.

Давайте значки будем рисовать при помощи методов. Ваша программа станет такой:

Private Sub Command1_Click()

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

'Это ваше фото, рисуем значок:

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

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



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

Picture1.Print , "21.07.2001"

End Sub

 

Private Sub Command2_Click()

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

'Это ваше фото, рисуем значок:

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

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



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

Picture1.Print , "28.07.2001"

End Sub

 

Private Sub Command3_Click()

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

'Это фото вашего друга, рисуем значок:

Picture1.Circle (200, 200), 20

Picture1.Circle (200, 200), 70

Picture1.Circle (200, 200), 120

Picture1.Circle (200, 200), 170

Picture1.Print , "12.08.2001"

End Sub

 

Private Sub Command4_Click()

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

'Это фото вашего друга, рисуем значок:

Picture1.Circle (200, 200), 20

Picture1.Circle (200, 200), 70

Picture1.Circle (200, 200), 120

Picture1.Circle (200, 200), 170

Picture1.Print , "20.07.2001"

End Sub

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

'Это ваше фото, рисуем значок:

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

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



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

и фрагмент

'Это фото вашего друга, рисуем значок:

Picture1.Circle (200, 200), 20

Picture1.Circle (200, 200), 70

Picture1.Circle (200, 200), 120

Picture1.Circle (200, 200), 170

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

В этом случае программисты всего мира поступают так. Они придумывают повторяющимся фрагментам имена, например,

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

и

Рисуем_значок_друга

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

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

 

Private Sub Рисуем_значок_друга() 'Это другая специальная процедура

Picture1.Circle (200, 200), 20

Picture1.Circle (200, 200), 70

Picture1.Circle (200, 200), 120

Picture1.Circle (200, 200), 170

End Sub

'Это новый текст программы:

Private Sub Command1_Click()

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

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

Picture1.Print , "21.07.2001"

End Sub

 

Private Sub Command2_Click()

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

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

Picture1.Print , "28.07.2001"

End Sub

 

Private Sub Command3_Click()

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

Рисуем_значок_друга

Picture1.Print , "12.08.2001"

End Sub

 

Private Sub Command4_Click()

Picture1.Picture = LoadPicture("c:\temp\Guitar.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; : B : Print 3;

End Sub

 

Private Sub A()

Print 4;

End Sub

 

Private Sub B()

Print 5; : C : Print 6;

End Sub

 

Private Sub C()

Print 7;

End Sub

Работать программа начинает по щелчку по кнопке Command1. Вряд ли вам с непривычки удасться дать правильный ответ. Тогда непременно программу - в компьютер и пошаговый режим. Желтая полоска будет скакать по программе туда-сюда. Перед каждым нажатием на F8 вы обязаны предсказать, куда она прыгнет! Не сможете - нет смысла читать книгу дальше.

Ответ:

1 4 2 5 7 6 3

 

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

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

 

Задание 86: Дополните ваш фотоальбом процедурой пользователя, которая перед показом очередной фотографии воспроизводит один и тот же музыкальный звук, например, "c:\Windows\Media\Chimes.wav".



<== предыдущая лекция | следующая лекция ==>
Использование случайных величинпри рисовании | Операторы Stop, End и Exit Sub


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.062 сек.