Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только переменной длины). Variant, пользовательский тип или Control и Form. As тип необходимо применять для каждого аргумента.
Список аргументов определяет связь по данным между вызывающей (процедура, из которой происходит вызов) и вызываемой (процедура, которая вызывается) процедурами. Локальные данные, определенные внутри процедуры (кроме тех, что определены в списке general для форм), не могут использоваться в других процедурах (например, переменные с одинаковыми именами, но объявленные в разных процедурах, хранятся в разных ячейках памяти и изменение переменной в одной из процедур не ведет к изменению одноименной переменной в другой процедуре). Процедуры, относящиеся к форме, но не являющиеся процедурами обработки событий, помещаются в раздел general формы.
Процедура не может быть определена внутри какой-либо процедуры или функции.
Пример процедуры вычисления площади прямоугольника по заданным значениям сторон:
Sub SubDemo (RLen, Rwid) ' 'заголовок процедуры
‘SubDemo с двумя аргументами-
‘R1en-длина и Rwid-ширина
Dim Area 'объявление локальной переменной Area = RLen * Rwid ' расчет площади MsgBox “Площадь равна” & Area “печать результата End-Sub
Пример процедуры на основе рассмотренного выше фрагмента программы формирования вектора из сумм элементов столбцов матрицы:
Sub SubMatrVektor (A() As Single, B() As Single, .
MaxI As Integer, MaxJ As Integer)’ Dim J, I As Integer For J = 1 To MaxJ 'верхняя граница индекса J
'определяется передаваемым 'аргументом процедуры Л(J) = 0 'присвоение начального значения
'элемента вектора For I = 1 То MaxI 'верхняя граница индекса
'I определяется
Передаваемым аргументом процедуры А(J) = А(J) + B(I,J) 'вычисление суммы в цикле Next I Next J End Sub
Изменяя значения аргументов данную процедуру можно использовать для работы с матрицами произвольного размера.
Рассмотрим, что означают другие используемые ключевые слова в определении процедуры.
Exit Sub вызывает прекращение выполнения процедуры и пыход из нее в вызывающую программу.
Static определяет, что локальные данные (переменные, массивы), определенные внутри процедуры (переменная Area в примере), сохраняются в промежутках между вызовами данной процедуры. Определение Static не распространяется на данные, которые объявлены вне данной процедуры, но используются в ней (т.е. эти данные будут изменяться независимо от определения Static). Нельзя использовать при рекурсивном вызове процедуры.
Private определяет, что процедура может быть вызвана (доступна) только ц том модуле, в котором она объявлена (никакие другие процедуры в других модулях не могут вызвать данную процедуру). Определение Private не имеет смысла, если процедура определена для какой-либо формы (в этом случае процедура недоступна из вне данной формы).
Public определяет, что процедура может быть вызвана из любого модуля приложения.
Поскольку имя процедуры определяется (глобально распознается) в рамках всех процедур всех модулей одной программы, имя процедуры не должно совпадать с другими глобально распознаваемыми именами программы. Такими глобально распознаваемыми именами являются имена других процедур Visual Basic или процедур динамически подключаемых библиотек (dynamic-link library [DLL|) и данных, объявленных как Global (см. выше).
Чтобы избежать конфликта в объявлении одних и тех же имен, можно использовать определение Private, т.е. сделать процедуру доступной только в рамках модуля. В этом случае имя процедуры не может совпадать с такими именами, объявленными на уровне модуля, как имена переменных, массивов, констант и имена других процедур данного модуля.
Optional определяет, что аргумент не является обязательным. При его использовании все последующие аргументы в списке аргументов также являются необязательными и для них также необходимо использовать данное ключевое слово. Аргументы, объявленные Optional, должны иметь тип Variant. He может использоваться для аргумента, для которого задан параметр ParamArray.
ByVal определяет, что аргумент передается в процедуру по значению (см. ниже).
ByRef определяет, что аргумент перелается в процедуру по ссылке (см. ниже).
ParamArray относится к последнему аргументу в списке аргументов и определяет, что конечный (заключительный) аргумент является необязательным массивом. Не может использоваться совместно с параметрами ByVal, ByRef, Optional.
Пример.
Sub ReturnTwice(ReturnValue, Optional A) If IsMissing(A) Then 'функция IsMissing ()
“проверяет передачу аргумента А в процедуру ReturnValue =Null 'если аргумент не передается,
'вычисляемое значение присваивается О Else ReturnValue = A * 2 'если аргумент передается,
'вычисляется значение от аргумента End If End Sub
Синтаксис оператора обращения к процедуре следующий:
имя процедуры[список значении} или
Call имя процедуры[{список значении)}
где Call — ключевое слово;
список значений — список значений аргументов (соответствует списку аргументов в операторе Sub no количеству, порядку следования и типу, кроме случая когда используется параметр Optional).
Кроме того должно выполняться следующее соответствие между списками аргументов и значениями:
Аргумент Значение
Переменная | Константа, переменная,
I элемент массива, выражение.
Массив Массив
форма Форма
Элемент управления ; Элемент управления
I
Следующие примеры показывают правильное согласование между списками аргументов и значении:
Пример 1.
Sub Sum (A As Integer, B As Integer, С As Integer)
'список аргументов состоит из переменных С = А + В • End Sub Sub Form Click ()
Static X(3) As Integer X(1) = 1 X(2) =2
Call Sum(X(l), X(1) + X(2), X(3)) 'список
' -значений включает элементы массива и выражение
Print Х(1), Х(2), Х(3) End Sub
Пример 2.
Sub Sum (A As Integer, В As Integer, С As Integer)
'список аргументов состоит из переменных С—А + В End Sub Sub Forrri_Click ()
Dim X, Z As Integer
X = 5
Call Sum(X, 4, Z) 'список значений включает
' переменные и константу Print X, Z End Sub
Пример 3.
Sub Sum (A ( ) As Integer)
'список аргументов включает массив
А(3) = А(1) + А(2) End Sub
Sub Form_Click () Static X(3) As Integer
X(1) - 1
X(2) =2
Sum X ( ,)'список значений включает массив
Print Х(1), Х(2), Х(3) End Sub
Следует обратить внимание, что в последнем примере обращение к процедуре не содержит ключевого слова Call и отсутствуют скобки, обрамляющие список значений.
Для рассмотренного примера списка аргументов с использованием параметра Optional, обращения могут иметь следующий вид:
Call ReturnTwice(ReturnValue, )
'значение ReturnValue равно О
Call ReturnTwice(ReturnValue, 2)
‘ значение ReturnValue равно 4 Пример программы.
Поместим рассмотренную выше процедуру формирования вектора из сумм элементов столбцов матрицы в раздел general формы:
Option Explicit
Sub SubMatrVektor (A() As Single, B() As Single, MaxI As Integer, Max.J As Integer) Dim J, I As Integer For J == 1 To MaxJ A(J) -- 0 For I = 1 To MaxI
A(J) = A(J) + B(I, J) Next I Next J End Sub
Private Sub Form_Ciick()
Static X(1 To 2, 1 To 3) As Single, Y(1 To 3) As Single
X(1, 1) = 1
X(1, 2) = 2
Х(1, 3) = 3
X(2, i) = 4
Х(2, 2} = 5
Х(2, 3) = 6
SubMatrVektor Y(), X(), 2, 3
Print Y(li, Y(2), Y(3) End Sub
Результат выводится на форму, показанную на оис. 3.18.
Рис. 3.1S
3.6.2. Функции
Синтаксически функция определяется
[Public | Private] [Static] Function имя функции [(список аргументов)} [As тип]
[операторы объявления]
[операторы}
[имя функции = выражение]
[Exit Function] [операторы] [имя функции = выражение] End Function
где Public, Static, Private, Function , Exit Function , End Function —
ключевые слова. Function определяет обязательный первый оператор функции. End Function — обязательный последний оператор функции:
имя функции образуется в соответствии с общими правилами образования имен и может иметь описатель типа (As тип в конце первой строки относится к имени функции). Имя функции принимает значение и хотя бы один оператор
имя функции = выражение
может присутствовать внутри функции и выполняться при выходе из нее. Если никакое значение не присвоено имени функции, то имя функции принимает значение по умолчанию: числовая функция принимает значение 0, функция, объявленная как String, принимает значение пустой строки нулевой длины (“”), функция, объявленная как Variant принимает значение Empty (значение, которое принимает имя функции, называют возвращаемым значением функции — возвращаемое значение).
Список аргументов имеет следующий синтаксис:
[Optional] [ByVal|ByRef][ParamArray] имя[( )][As тип] [.[Optional] [By Val | ByRef][ParamArray] имя[( )] [As тип] ] ... где Optional, ByVal, ByRef, ParamArray и As ключевые слова;
имя — имя переменной, массива (в случае массива используетсяимя ( ) без указания границ значения индексов, что позволяет использовать одну функцию для разного числа элементов массива в каждом конкретном случае), элемента управления или формы (в последних дйух случаях тип принимает значения Control и Form).
Тип может быть Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только переменной длины). Variant, пользовательский тип или Control и Form. As тип необходимо применять для каждого аргумента.
Список аргументов определяет связь по данным между вызывающей (функция, из которой происходит вызов) и вызываемой (функция, которая вызывается) процедурами или функциями. Локальные данные, определенные внутри функции (кроме тех, что определены в списке general для форм), не могут использоваться в других процедурах и.'функциях (например, переменные с одинаковыми именами, но объявленные в разных функциях, хранятся в разных ячейках памяти и изменение переменной в одной из функций не ведет к изменению одноименной переменной и другой функции).