Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Оператор цикла For | Оглядимся вокруг | Отладка программы. Окна отладки. Режимы отладки. | Глава 8. Типичные маленькие программы | Вложение циклов в разветвления и наоборот | Объекты. Их свойства, их события, их методы | Первый способ - Загрузка в Visual Basic готовых изображений | Цвет в Visual Basic | Способ - Рисуем при помощи графических методов | Переменные вместо чисел |


Читайте также:
  1. II. Порядок выплаты ежемесячной компенсации на оплату проезда до места проведения процедуры гемодиализа инвалидам, находящимся на постоянном диализном лечении.
  2. ISBN, УДК, ББК, авторский знак. Что это за коды и для чего они нужны?
  3. RENDERING 2. Нужны ли переводчики
  4. Административные процедуры как форма реализации компетенции органов внутренних дел.
  5. Административные регламенты как акты управления, устанавливающие административные процедуры.
  6. Анализ и оценка напряженности трудового процесса пользователя
  7. Аутентификация Пользователя

Задача: Вы записали на диск десяток фотографий, снятых во время каникул, и решили сделать фотоальбом. Поместили на форму десяток кнопок с названиями фотографий и один 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".


Дата добавления: 2015-11-16; просмотров: 56 | Нарушение авторских прав


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

mybiblioteka.su - 2015-2024 год. (0.013 сек.)