Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB-книга.DOC
Скачиваний:
2
Добавлен:
09.11.2019
Размер:
938.5 Кб
Скачать

3.6.1. Процедуры

Синтаксически процедура определяется [Private | Public] [Static] Sub имя процедуры [(список аргумен-

[операторы объявления] [операторы} [Exit Sub] [операторы} End Sub

где Private, Public, Static, Sub, Exit Sub, End Sub - ключевые слова. Sub определяет обязательный первый оператор процедуры. End Sub - обязательный последний оператор процедуры;

имя процедуры образуется в соответствии с общими правилами образования имен, но не может иметь описателей типа (имя процедуры не принимает значения);

список аргументов имеет следующий синтаксис:

[Optional] [ By Val | ByRef] [ParainArray] имя [( )] [As тип] где Optional, ByVal, ByRef, ParaniArray и As ключевые слова;

имя — имя переменной, массива (в случае массива используется имя ( ) без указания границ значения индексов, что позволяет использовать одну процедуру для разного числа элементов массива в каждом конкретном случае), элемента управления или формы (в последних двух случаях тип принимает значения Control и Form).

Тип может быть 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

Результат выводится на форму.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]