Понятие о процедурах пользователя
Рассмотрим бессмысленную программу:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows Form Designer generated code
Dim a, b, d, f As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
d = 100
a = 2
b = 30
Debug.WriteLine(a + b)
Debug.WriteLine(a * b + 1)
Debug.WriteLine(a ^ b - 20)
d = 9 - b
f = 0
a = 2
b = 30
Debug.WriteLine(a + b)
Debug.WriteLine(a * b + 1)
Debug.WriteLine(a ^ b - 20)
d = a + 1
a = 2
b = 30
Debug.WriteLine(a + b)
Debug.WriteLine(a * b + 1)
Debug.WriteLine(a ^ b - 20)
f = f - a
End Sub
End Class
Предположим, эта программа раздражает нас не своей бессмысленностью, а своей длиной. Как сократить ее?
Замечаем, что программа содержит 3 одинаковых фрагмента (в тексте я их выделил полужирным курсивом):
a = 2
b = 30
Debug.WriteLine(a + b)
Debug.WriteLine(a * b + 1)
Debug.WriteLine(a ^ b - 20)
В этом случае программисты всего мира сокращают программу так. Они придумывают повторяющемуся фрагменту произвольное имя, например,
Печать_разных_чисел
Затем они вписывают в окно кода этот фрагмент отдельно, снабдив его заголовком
Sub Печать_разных_чисел()
и конечной строкой
End Sub
Получается вот что:
Sub Печать_разных_чисел()
a = 2
b = 30
Debug.WriteLine(a + b)
Debug.WriteLine(a * b + 1)
Debug.WriteLine(a ^ b - 20)
End Sub
Они называют все это процедурой пользователя, после чего имеют право во всем окне кода вместо полного текста фрагмента писать только его имя Печать_разных_чисел. Посмотрите на получившуюся программу целиком:
Public Class Form1
Inherits System.Windows.Forms.Form
Windows Form Designer generated code
Dim a, b, d, f As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
d = 100
Печать_разных_чисел()
d = 9 - b
f = 0
Печать_разных_чисел()
d = a + 1
Печать_разных_чисел()
f = f - a
End Sub
Sub Печать_разных_чисел()
a = 2
b = 30
Debug.WriteLine(a + b)
Debug.WriteLine(a * b + 1)
Debug.WriteLine(a ^ b - 20)
End Sub
End Class
Получившаяся программа выполняет абсолютно то же самое, что и исходная.
Как видите, программа получилась короче, а если бы в исходной программе фрагмент встретился не 3 раза, а больше (как часто и бывает), то укорочение было бы еще заметнее.
Все операторы, из которых состоит процедура, без заголовка и конечной строки, будем называть телом процедуры. А вместе с ними – объявлением процедуры.
Слово Печать_разных_чисел используется внутри процедуры Sub Button1_Click, как настоящий оператор, и выполняется, как настоящий оператор. Суть его выполнения в том, что когда VB в процессе выполнения программы натыкается на оператор Печать_разных_чисел, он ищет в программе объявление процедуры с именем Печать_разных_чисел и начинает выполнять тело этой процедуры. Этот процесс называется вызовом процедуры или обращением к процедуре. Говорят также, что управление передается процедуре. После выполнения тела процедуры VB возвращается к выполнению программы. Говорят, что управление возвращается к программе.
Вы обязательно должны проверить то, что я только что сказал, и собственными глазами убедиться в правдивости моих слов. Для этого обязательно выполните эту программу в пошаговом режиме! Это самое необходимое из того, что вы должны сделать. При этом обязательно же обратите внимание вот на что:
Порядок исполнения операторов показывает желтая полоса. Она перескакивает с оператора Печать_разных_чисел() на строку Sub Печать_разных_чисел(), после чего пробегает по всем 5 операторам тела процедуры. Дойдя до конечной строки End Sub, она возвращается на тот же оператор Печать_разных_чисел(), с которого и «прыгала», после чего переходит на оператор, следующий сразу же за этим самым оператором (в первый раз в нашем случае это оператор d=9-b). Вы просто обязаны усвоить этот порядок на всю жизнь.
Два вида процедур. Вот у вас в окне кода две процедуры. Одна из них – Button1_Click и вы знаете, когда она выполняется – когда нажимается кнопка Button1. Она принадлежит к числу привычных нам процедур обработки событий. А когда выполняется другая – Печать_разных_чисел? Только тогда (и если), когда (и если) в других процедурах компьютер наткнется на оператор Печать_разных_чисел(). А если этот оператор мы забыли там написать, то процедура Печать_разных_чисел не выполнится никогда.
Вы усвоили, что когда завершает свою работу процедура пользователя, VB возвращается в процедуру, которая ее вызвала. А куда он возвращается, когда завершает свою работу процедура обработки событий? А никуда. Просто ждет ваших дальнейших действий, вызывающих события, например, нажатий на кнопку.