Студопедия

Главная страница Случайная страница

Разделы сайта

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






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






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






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.