Создание пользовательских свойств

Свойства создаются с помощью процедур Property. Существуют три типа указанных процедур:

ü Property Let,

ü Property Get,

ü Property Set.

Процедуры Property Let управляют вводом данных в объект, что определяет эти свойства как получающие данные. Эти процедуры появляются в правой части формул. Процедуры Property Get управляют выводом данных из объекта и появляются в правой части формул. Процедуры Property Let и Property Get могут иметь одно и то же имя. В этом случае выбор используемой процедуры определяется направлением передачи данных.

Процедуры Property Set подобны процедурам Property Let, но передают не значения, а объекты. Использование процедуре Property Get с результатом, объявленным как Object, позволяет передавать объекты из пользовательского объекта.

Процедуры Property Let

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

Объявление процедуры Property Let в основном идентично объявлению подпрограммы, с тем отличием, что вам следует использовать зарезервированные слова Property Let вместо Sub.

Процедура Property Let имеет следующий синтаксис:

Property Let имя­_свойства (аргументы)

‘ Некоторые операторы.

Exit Property

‘ Другие операторы.

End Property

Имя процедуры имя_свойства является именем свойства; для указания контейнера данного свойства используется имя модуля, содержащего эту процедуру. В списке аргументов должен быть хотя бы один аргумент, позволяющий получить значение данного свойства. Если у вас несколько аргументов, то самый правый из них предназначен для получения значения данного свойства. Любые другие аргументы передаются заключенными в круглые скобки и подключенными к имени свойства. В зависимости от ваших потребностей синтаксис данной процедуры может быть расширен (более подробную информацию можно посмотреть в интерактивной подсказке).

Например, следующая процедура, находящаяся в модуле BankAccount, объявляет свойство Deposit:

Property Let Deposit (ByVal Received As Currency)

Index = Index + 1

theDeposit (Index) = Received

End Property

Чтобы использовать это свойство в другой процедуре, применяют оператор подобный следующему:

BankAccount.Deposit =250

В результате выполнения данного оператора число 250 будет передано процедуре Deposit, которая сохранит его в переменной Received. Обратите внимание на то, что эти свойства не требуют использования литеральных значений (вроде 250), - вместо этого можно использовать любую переменную или формулу, позволяющую рассчитать значение данного свойства. Обратите внимание также на то, что данный аргумент объявлен как ByVal, следовательно, данные, переданные процедуре, были скопированы, что защитило переменную в вызывающей процедуре от изменений. Процедура Deposit наращивает глобальную переменную Index и сохраняет переданный депозит в глобальном массиве theDeposit.

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

Property Let Deposits (anIndex As Long, ByVal Received As Currency)

the Deposit (anIndex) = Received

End Property

Чтобы использовать данное свойство в операторе можно написать нечто подобное:

BankAccount.Deposits (10) = 250

Этот оператор передает переменной anIndex значение 10, а переменной Received – значение 250. Затем эти две переменные используются для изменения значения десятого элемента массива в theDeposit().

Процедуры Property Get

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

Property Get имя_свойства (аргументы) As тип

‘ Некоторые операторы.

Exit Property

‘ Другие операторы.

End Property

Аргументы и тип имеет те же значения, что и для функции. Так же, как и функции, оператор в теле данной процедуры должен присвоить передаваемое значение переменной, имя которой является именем процедуры. Именно это значение процедура и вернет вызывающей программе. Обратите внимание на то, что аргументы передаются процедуре, а результат возвращается в имени процедуры в качестве значения процедуры в качестве значения свойства.

Так процедура

Property Get Balance () As Currency

Balance = theBalance

End Property

возвращает значение остатка на счете из объекта CheckBook.

Для доступа к этой процедуре из другой процедуры можно использовать оператор

CashAvail = CheckBook.Bakance

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

Процедуры Property Let и Property Get могут иметь одно и тоже имя, что позволит указать процедур, обменивающуюся данными в обоих направлениях. Поскольку значения свойства Balance обычно является вычисляемой величиной, то это свойство имеет лишь одну процедуру Property Get, определяющую это свойство как доступное только для чтения. Свойство Deposits может как читаться, так и измениться, а следовательно имеет кроме описанной выше процедуры Property Let и соответствующую процедуру Property Get:

Property Get Deposits (anIndex As Long) As Currency

Deposits = theDeposit (anIndex)

End Property

Для использования данного свойства может применяться оператор:

aDeposit = BankAccount.Deposits (10)

Этот оператор, позволяет значение десятого депозита и присвоить его переменной aDeposit.

Процедуры Property Let и Property Get можно использовать в одной формуле. В этом случае Visual Basic определяет порядок вызова процедур, задавая, таким образом, направление передачи данных. Например, оператор

BankAccount.Deposits (27) = BankAccount.Deposits (27) + 125

позволяет добавить к двадцать седьмому депозиту 125. Этот оператор в начале вызывает процедуру Property Get для получения предыдущего значения данного депозита, затем добавляет к этому значению 125, после чего передает новое значение процедуре Property Let, которая сохраняет это новое значение в объекте BankAccount.

Процедуры Property Set

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

Процедура Property Set имеет следующий синтаксис:

Property Set имя_свойства (аргуметы)

‘ Некоторые операторы.

Exit Property

‘ Другие операторы.

End Property

Список аргументов аналогичен списку в процедуре Property Let. Самый правый аргумент предназна для получения объекта от вызывающей процедуры и должен быть типа Variant или объявлен As Object. Все остальные аргументы переедаются самой процедуре.

Например, объект CheckBook может отображать список операций в таблице. Чтобы выполнить указанные действия объект в начале должен получить количество операций, которые перечислены в списке, а затем – объектную ссылку на область ячеек таблицы. Для того чтобы подготовиться к печати этого списка можно написать процедуру подобную процедуре

Property Set PrintRange (startIndex As Long, numTrans As Long, - aPrintRange As Object)

theStartIndex = startIndex

theNumTrans = numTrans

Set thePrintRange = aPrintRange

End Property

Обратите внимание на использование Set, сохраняющего объект aPrintRange в переменной объектного типа в thePrintRange.

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

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

CheckBook.PrintRange (12, 10) = Sheets (“Sheet1”)/Range (“B5”)

В этом операторе переменной startIndex передается значение 12, переменной numTrans – 10, а ссылка на область В5 таблицы Sheet1 передается как объект aPrintRange. Эти три значения сохраняются в глобальных переменных процедуры Property Set.

Для возврата объекта вызвавшей программе используется процедура Property Get, в которой возвращаемое значение задано типа Object.

Коммуникации

Наши рекомендации