Глава 14.

Пользовательские объекты

Создание модулей класса

В VBA наряду с огромным числом встроенных объектов предусмотрена возможность создания пользовательских объектов. Использование таких объектов позволяет сократить текст программы и сделать его более понятным. Пользовательские объекты являются элементами пользовательских классов (или образно говоря, классы являются формами, из которых "пекутся" конкретные объекты). Пользовательские классы конструируются в модулях классов, которые создаются в редакторе Visual Basic выбором команды Вставка, Модуль класса (Insert, Class Module). При создании классов надо предусмотреть его инициализацию, описание свойств и методов, которыми будет наделен объект.

Опишем процесс создания класса в виде следующей последовательности шагов:

  1. Выберите команду Вставка, Модуль класса (Insert, Class Module). Откроется окно нового модуля класса.
  2. Нажмите клавишу <F4> и присвойте в появившемся окне свойству Name имя класса. Имя модуля класса является именем класса объектов.
  3. В разделе описания модуля объявите переменные уровня модуля, которые используются как "значения свойств".
  4. Инициализируйте класс при помощи процедуры Private Sub Class_Initialize. В этой процедуре надо указать значения, принимаемые по умолчанию переменными уровня модуля, описывающими "значения свойств".
  5. При помощи процедур Property Let объявите имена свойств, значениями которых являются числовые данные, а при помощи процедур Property set объявите имена свойств, значениями которых являются объекты. Если какое-то свойство — только для чтения, то для него не надо составить процедуру Property Let.
  6. При помощи процедур Property Get установите возможность считывания значения свойств.
  7. Создайте методы класса. Методы создаются при помощи обычных процедур и функций. Если метод возвращает число, то для его конструирования используется функция, а в остальных случаях — процедура.
  8. Допустимо также создание процедуры Private Sub Class_Terminate для удаления объекта из памяти по завершению работы с ним.

Процедуры Property Let, Property Set и Property Get

Процедура Property Let служит для объявления имен свойств, значениями которых являются числовые данные.

Процедура Property set служит для объявления имен свойств, значениями которых являются объекты.

Процедура Property Get обеспечивает возможность считывания значения свойств.

Как видно из приведенного ниже синтаксиса, процедуры Property Let, Property Set и Property Get имеют такую же структуру, что и обычные процедуры. Просто, они предназначены для специфических задач, описанных выше.

[Public | Private] [Static] Property Let имя [(списокАргументов)]

[инструкции]

[Exit Property]

[инструкции] End Property

Public | Private] [Static] Property Set имя.[(списокАргументов)]

[инструкции]

[Exit Property]

[инструкции] End Property

[Public | Private] [Static] Property Get имя [(списокАргументов)] [As тип]

[инструкции] [имя = выражение] [Exit Property]

[инструкции] [имя = выражение] End Property

Пример создания класса

Рассмотрим пример создания класса Вектор, моделирующего двумерный вектор. У объектов класса вектор будут определены три свойства: координата абсциссы, координата ординаты и длина вектора (это свойство является свойством только для чтения). Кроме того, для объектов класса вектор будут определены два метода, первый из которых возвращает вектор, являющийся результатом покомпонентного произведения вектора на число, а второй — результат скалярного произведения двух векторов.

Итак, в модуле класса, у которого установлено свойство Name, равное Вектор, наберите следующий код:

'

' X - координата абсциссы

' У - координата ординаты

'

Dim X, Y As Double

'

Public Property Get Абсцисса() As Double

'

' Возвращает значение свойства Абсцисса

'

Абсцисса = X End Property

Public Property Get Ордината () As Double

'

' Возвращает значение свойства Ордината

'

Ордината = Y

End Property

'

Public Property Let Абцисса(ByVal НоваяАбсцисса As Double)

'

' Устанавливает значение свойства Абсцисса

'

If Not IsNumeric(НоваяАбсцисса) Then

MsgBox "Абсцисса не является числом", vblnformation, "VBA"

Exit Property

End If

X = НоваяАбсцисса

'

End Property

'

Public Property Let Ордината(ByVal НоваяОрдината As Double)

'

' Устанавливает значение свойства Ордината

If Not IsNumeric(НоваяОрдината) Then

MsgBox "Ордината не является числом", vblnformation, "VBA"

Exit Property

End If

Y = НоваяОрдината End Property

'

Public Property Get Длина() As Double

'

' Возвращает длину вектора. Это свойство только для чтения

'

Длина = Sqr(X ^ 2 + Y ^ 2)

End Property

'

Public Sub ПрибавитьВектор(ByVal ДругойВектор As Вектор)

'

' Покоординатное сложение двух векторов

X = X + ДругойВектор.Абсцисса Y = Y + ДругойВектор.Ордината

End Sub

'

Public Sub УмножитьНаЧисло(ByVal Число As Double)

'

' Покоординатное умножение вектора на число

'

If Not IsNumeric(Число) Then

MsgBox "Число, на которое умножается вектор," & Chr(13) & "на самом деле не число", vblnformation, "VBA"

Exit Sub

End If

'

X = Число * X Y = Число * У

'

End Sub

Public Function СкалярноеПроизведение(ByVal ДругойВектор As Вектор)

'

' Скалярное произведение векторов

СкалярноеПроизведение = X * ДругойВектор.Абсцисса

+ Y * ДругойВектор.Ордината

End Function

Private Sub Class_Initialize()

'

' Инициализация класса

' Вектор (1, 0)

'

X = 1 Y = 0

End Sub

Проверить работу созданного класса можно, например при помощи следующей процедуры, код которой набирается на стандартном листе модуля.

Sub ДемонстрацияОбъектов()

Dim a, s As Double

' Объявление двух векторов

'

Dim МойВектор, ЕщеВектор As Вектор

' Создание вектора

'

Set МойВектор = New Вектор

' Установка координат вектора

'

With МойВектор

.Абсцисса = 1 .Ордината = 1

End With

'

' Определение длины вектора

'

а = МойВектор.Длина

MsgBox CStr(a)

'

' Умножение вектора на 2

МойВектор.УмножитьНаЧисло Число:=2

'

' Определение координат преобразованного вектора

'

MsgBox CStr(МойВектор.Абсцисса)

MsgBox CStr(МойВектор.Ордината)

'

' Создание еще одного вектора

'

Set ЕщеВектор = New Вектор

With ЕщеВектор

.Абсцисса = 2

.Ордината = 3 End With

'

' Сложение векторов

'

МойВектор.ПрибавитьВектор ДругойВектор:=ЕщеВектор

'

' Определение координат преобразованного вектора

'

MsgBox CStr(МойВектор.Абсцисса)

MsgBox CStr(МойВектор.Ордината)

'

' Определение скалярного произведения

'

s = МойВектор.СкалярноеПроизведение(ДругойВектор:=ЕщеВектор)

MsgBox CStr(s)

End Sub