Процедуры и функции
Подпрограммы являются одними из основных элементов языка. Они представляют собой процедуры и функции.
• Процедура начинается с оператора Sub и заканчивается End Sub, между которыми и помещается код. Процедуры могут вызываться или самим Visual Basic, например, реализованные в виде обработчиков событий, или другими процедурами и функциями. Имя процедуры обработки события состоит из имени объекта, знака подчёркивания и имени события:
Private Sub Command1_Click() 'Событие будет вызвано при нажатии на элемент управления "Кнопка"
...
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'Вызывается при перемещении указателя мыши в окне формы
...
End Sub
На самом деле Visual Basic реализует цикл обработки оконных сообщений Windows. В примере с формой, цикл отфильтрует сообщение WM_MOUSEMOVE и автоматически вызовет процедуру Form_MouseMove с параметрами: какие кнопки мыши были нажаты, координаты указателя. Данный механизм скрывает от разработчика некоторые аспекты программирования в среде Windows, позволяя ему сразу приступить к написанию пользовательского кода. В большинстве случаев, класс решаемых задач не потребует от программиста знаний о сообщениях и оконных функциях. Но Visual Basic не ограничивает программиста самому реализовать обработку оконных сообщений. Это позволяет очень гибко подходить к построению приложений, но и потребует достаточного опыта для написания подобного кода, который может вызвать нестабильную работу программы вплоть до аварийного завершения.
• Функции в VB начинаются с ключевого слова Function и заканчиваются End Function. Возвращаемое значение функции присваивается переменной, совпадающее с названием функции. Для того, чтобы досрочно прервать выполнение процедуры или функции, существуют специальные операторы Exit Sub и Exit Function. Visual Basic 6.0 содержит встроенные функции для работы с файловой системой, датой и временем, математические функции, функции взаимодействия с системой, функции для работы со строками, функции приведения типов и функции осуществляющие финансовые расчёты. Также существуют недокументированные функции, которые позволяют работать, например, с указателями.
Пример функции для решения квадратного уравнения:
Private Sub Main()
Dim RetX1 As Double, RetX2 As Double
Dim strStatus As String
strStatus = SolveQuadraticEquation(4, 6, 2, RetX1, RetX2) 'Решение уравнения 4*X^2 + 6*X - 2 = 0
'Выводим ответ
MsgBox "Решение: " & strStatus & vbCrLf & _
"X1 = " & RetX1 & vbCrLf & _
"X2 = " & RetX2, vbInformation
End Sub
'Функция решения квадратного уравнения
Public Function SolveQuadraticEquation(ByVal A As Double, _
ByVal B As Double, _
ByVal C As Double, _
ByRef X1 As Double, _
ByRef X2 As Double) As String
Dim D As Double
D = (B * B) - (4 * A * C) 'Получаем значение дискриминанта
If D >= 0 Then
X1 = (-B - Sqr(D)) / (2 * A) 'Вычисляем корни уравнения
X2 = (-B + Sqr(D)) / (2 * A)
SolveQuadraticEquation = "Решение получено" 'Функция возвращает сообщение о решении
Else
SolveQuadraticEquation = "Дискриминант < 0. Корней нет"
End If
End Function
В этом примере можно заметить модификатор ByVal перед аргументами A, B и C. Это способствует тому, что параметры в функцию будут переданы по значению. Модификатор ByRef, напротив, передаёт значение по ссылке. Для такого типа модификатора, функция может модифицировать значения переменных, переданных в качестве параметров. Visual Basic по-умолчанию всегда передаёт значения по ссылке, если ни один из модификаторов не был указан.
