- •Основы офисного программирования и язык vba
- •Офисное программирование
- •Состав Office 2000
- •Инсталляция Office 2000
- •Содержимое диска "Resource Kit"
- •Документ Issues
- •Документ ork9
- •Папка Tools
- •Содержимое диска "Language Pack"
- •Об этой книге и ...
- •Моя благодарность
- •Vba и объекты. Обзор
- •Библиотека объектов Office 2000 - каркас приложений
- •Встраивание вместо наследования
- •Построение каркаса документа
- •Библиотека объектов Office 2000 и Object Browser
- •Объекты Application
- •Свойства-участники
- •Вторая группа терминальных свойств
- •Методы объектов Application
- •События объектов Application
- •Совместная работа приложений. Создание объектов Application. Раннее и позднее связывание
- •Коллекции в Office 2000
- •Коллекции объектов Office 2000
- •Коллекции Excel: Workbooks, Sheets
- •Коллекция Workbooks
- •Коллекция Sheets
- •Коллекции Word: Documents, Paragraphs и другие
- •Коллекция Documents
- •Коллекция Paragraphs
- •Коллекция Sections
- •Коллекции Characters, Words, Sentences
- •Коллекции и конструкция For Each … Next
- •Объекты Range
- •Что определяет объект Range?
- •Метод Range
- •Объекты Selection
- •Метод Select и свойство Selection
- •Активные объекты и метод Activate
- •Проектирование документов
- •Документ и его программный проект
- •Модули - обработчики событий
- •Стандартные модули
- •Модули классов
- •Модуль макросов
- •Структура модуля. Окно проекта и Окно кода
- •Окно проекта
- •Свойства проекта
- •Имя проекта
- •Защита проекта
- •Окно кода
- •Еще раз о "переиспользовании" модулей
- •Проект и область видимости
- •Система документов и ее проект
- •Организация системы документов
- •Как организуются ссылки между проектами
- •Обмен информацией между документами
- •Система документов One - Two - Three
- •Типы данных
- •Простые типы данных.
- •Объявление переменных и констант простых типов
- •Синтаксис объявления простых переменных
- •Объявления по умолчанию
- •Константы
- •Массивы
- •Динамические массивы
- •Записи и тип, определенный программистом
- •Что можно делать с записями?
- •Раздел объявлений
- •Раздел опций
- •Разделы констант, типов и переменных
- •Раздел Declare
- •Правила именования
- •Типы и классы Еще раз о понятии "класс"
- •Что нового в классах "Office 2000"
- •Создание класса "Личность"
- •Объекты и переменные
- •Объекты, класс которых определен пользователем.
- •Объекты "родного" приложения
- •ActiveX-объекты
- •Модуль класса Свойства
- •Сокрытие свойств
- •Конструкторы и деструкторы. Стандартные события
- •Стандартные события Initialize и Terminate
- •Два конструктора класса Rational
- •Процедуры - свойства
- •Как создаются процедуры- свойства
- •Синтаксис Let, Get и Set
- •Классы, как упаковка
- •Семейство классов и процедуры - свойства
- •Friend методы
- •События
- •Классы, объекты With Events и обработчики событий
- •Модуль класса с объектом WithEvents
- •Объект WithEvents
- •События собственных классов
- •Как создать класс с событиями
- •Как зажигаются события
- •Где и как следует создавать обработчики событий для экземпляров класса
- •Связывание объектов
- •Реальные объекты и инициирование событий
- •Семейство классов и реализация интерфейсов
- •Наследование
- •Виртуальные методы и полиморфизм
- •Абстрактные классы
- •Наследование и полиморфизм в Office 2000
- •Наследование интерфейсов
- •Полиморфизм семейства классов
- •Проект "Люди и Машины"
Два конструктора класса Rational
Вернемся теперь к нашему классу и определим для него конструктор по умолчанию и "настоящий" свой конструктор:
'Конструкторы класса Rational
Private Sub Class_Initialize()
'Конструктор по умолчанию
'инициализирует рациональное число дробью 1/1
m = 1
n = 1
End Sub
Public Sub CreateRational(ByVal a As Integer, ByVal b As Integer)
'Собственный конструктор
'Выполняет довольно сложные действия,
'прежде чем свойства получат значения
Dim d As Integer 'Наибольший общий делитель a и b
If b = 0 Then
MsgBox " Ошибка при создании рационального числа!" _
& Chr(13) & "Знаменатель не должен равняться 0."
Else
' приведение знака
If b < 0 Then
b = -b: a = -a
End If
' приведение к несократимой дроби
d = nod(a, b) ' d - НОД(a,b)
m = a \ d
n = b \ d
End If
End Sub
' Скрытая функция вычисления НОД(m,n)
Private Function nod(ByVal m As Integer, ByVal n As Integer) As Integer
Dim p As Integer
m = Abs(m): n = Abs(n)
If n > m Then
p = m: m = n: n = p
End If
Do
p = m Mod n: m = n: n = p
Loop Until n = 0
nod = m
End Function
Пример 4.2. (html, txt)
Обратите внимание, конструктор по умолчанию, являясь обработчиком события Initialize, строился, как обычный обработчик события, используя стандартную заготовку. Он, естественно, является закрытым, поскольку вызывается только системой и не доступен для обычного вызова. Наш собственный обработчик открыт. Он выполняет довольно сложную работу и не сводится к простому присвоению свойств объекта. Это довольно типичная ситуация. По ходу дела пришлось написать вспомогательную функцию вычисления наибольшего общего делителя. Поскольку она носит служебный характер, то она закрыта и не доступна для вызова при работе с объектами класса Rational.
Процедуры - свойства
Для того чтобы можно было получить доступ к закрытым свойствам, предусмотрены специальные процедуры - свойства:
-
Property Let позволяет установить новое значение терминального свойства, выполняя операцию Write (присваивание).
-
Property Set выполняет те же действия, что и предыдущая процедура, но применима к свойствам - участникам. Вы понимаете, что в VBA присваивание значений обычным переменным и объектам выполняется двумя различными операторами - Let и Set.
-
Property Get является дополнительной к предыдущим процедурам, выполняя операцию чтения Read. Она применима к терминальным свойствам и свойствам - участникам.
Рассмотрим пять ранее описанных стратегий применения свойств. В первой стратегии Read - Write каждому закрытому свойству будет соответствовать пара взаимно дополняющих процедур - свойств Let (Set) - Get. Эту стратегию мы реализовали для свойств класса "Личность". Стратегия Write-once предполагает, что значение свойства должно быть записано только при первом обращении, а далее не должно изменяться. Для реализации этой стратегии процедуры - свойства Let и Set должны включать в себя код, осуществляющий специальную проверку, проводилось ли ранее присвоение значения свойству. Для объектов это проверка типа "value Is Nothing", для переменных типа Variant - "value = Empty" и так далее. Мы не станем приводить подробный пример, подобную проверку мы осуществляли при работе со свойством Отчество в процедуре WhoIs класса " Личность. В следующих двух стратегиях используется только одна из процедур пары, либо Get, либо Let(Set). Пятая стратегия предполагает, что доступ к свойствам закрыт, и процедуры - свойства Get, Let(Set) в классе вообще не объявляются.
Обратим внимание на одну важную особенность, когда свойство имеет тип Variant, его значениями могут быть как обычные данные (числа, строки), так и объекты. В этой ситуации необходимо реализовать все три процедуры, применяя Let или Set в зависимости от того, с чем мы имеем дело - объектом или переменной.