Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Моделирование наследования. Фактическое наследование. WithEvents

Класс, объекты которого реагируют на события.

Классы.

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

Свойство для программиста.

Многие объекты моделей Word, Excel и другие имеют среди своих свойств одно, значение которого можно задавать, изменять в программе совершенно спокойно, так как это свойство не имеет никакого видимого или невидимого умалчиваемого эффекта, это – свойство для программиста TAG.

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

Пользовательский тип, создаваемый при помощи type, – это набор свойств. Этого может оказаться недостаточно: не хватает методов и событий. Часто необходимо применить пользовательские классы.

Вы можете описывать свои классы, вставляя модули классов (один модуль – один класс).

Очевидно, описание класса – это описание той сущности, которую мы будем подразумевать, когда назовем имя класса. Для того чтобы создать свой класс, вставьте в проект "модуль класса". В общей области (General) модуля класса описываются свойства (описываются как переменные). Свойства – это переменные базовых типов или объектные переменные. Описатель Public применяется в случае описания внешнего свойства, Private – в случае свойства, доступного только в модуле класса.

Описание класса – это инструкция для системы. Экземпляр класса появляется при вызове конструктора New, то есть если у вас описан класс с именем sharic, то создать экземпляр класса можно, задав конструкцию New sharic. Но к таким образом созданному экземпляру невозможно обратиться. Поэтому следует в некоторую переменную присвоить указатель на созданный экземпляр класса. Это делается следующим образом: Set uk = New sharic.

Объекты этого вида (типа, класса) создаются по слову New, указанному при описании объектной переменной или при присваивании ей значения. Заметьте, что в случае верного описания класса, его имя появляется в списке типов – подсказок VBA.

Примеры описаний (пусть ранее в проект включен модуль класса с именем my):

Dim nn As my Set nn = New my Dim nn As New my  

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

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

Для обращения к свойствам класса в модуле класса рекомендуется пользоваться браузером доступных объектов (Ctrl+J). При этом как-то указать текущий экземпляр нет необходимости.

Если же вы укажите служебное слово me, то увидите только Public свойства и методы.

Рассмотрим вопрос о том, как описать собственный класс объектов, реагирующих на события. Для элементов управления (точнее для ActiveX объектов) в операционной системе зарегистрированы события, на которые они реагируют. С другой стороны, к элементам формы невозможно приписать свои свойства и методы, даже динамические, т.к. эти элементы не показываются в виде отдельных пунктов проекта, и, следовательно, для них в среде программирования на VBA не предусмотрено окно кода. Свойства можно приписать только ко всей форме.

Решение проблемы состоит в создании пользовательского класса, одним из свойств которого является объект – элемент формы. Для того чтобы этот элемент класса реагировал на события, соответствующее свойство описывается со служебным словом WITHEVENTS. Этот описатель применяется только в классе, встроенном или пользовательском. В модуле Вы не можете описать таким образом переменную.

В программе может быть много переменных с описателем WithEvents, но недопустимо так описывать массив. Недопустимо сразу описывать и создавать объекты с WithEvents с помощью New (из-за каких-то особенностей реализации).

Рассмотрим такой пример. Пусть нам необходимо поместить на форму заранее неизвестное количество кнопок. Надписи на кнопках различны.

Опишем пользовательский класс, т.е. вставим модуль класса, дадим ему имя Knopka. После того как вы опишите свойство bttn, с помощью которого реализована связь с кнопкой, с описателем WithEvents, можно в окне объектов (вверху над программным кодом, слева) выбрать объект bttn, а затем в правом верхнем окне выбрать событие, обработчик которого вы хотите написать.

Dim WithEvents bttn As Control

Dim nm as String

Программный код в модуле класса содержит обработчик события Initialize – инициализация (создание экземпляра). В нем на форму добавляется кнопка, но об этом мы поговорим в следующем пункте. Имя кнопки формируется случайным образом.

Dim WithEvents bttn As CommandButton

Dim nm as String

 

Private Sub Class_Initialize()

Set bttn = UserForm1.Controls.Add(“Forms.CommandButton.1”)

nm = “Кнопка” & (Rnd*100+1)

End Sub

 

Private Sub bttn_Click()

MsgBox “Нажали на кнопку с надписью ” & nm

End Sub

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

Dim kn(10) as Knopka, i as Integer

For i=1 to 10

Set kn(i)= New Knopka

Next

Моделирование заключается во включении в свойства класса объектной переменной другого класса.

Покажем разницу в распределении ОП в случае наследования и в случае моделирования. Пусть есть описания классов для заводской поликлиники:

Класс человек = имя, фамилия, отчество, дата рождения.

Класс работник = дата поступления, специальность, место работы.

Класс больной = диагноз, дата начала болезни, лечение.

Слева в таблице показаны фрагменты программы в предположении, что наследование есть, справа – наследования нет.

 

Описание связей классов
Работник ЭТО человек Больной ЭТО работник Класс работник = дата поступления, специальность, место работы, к_человек Класс больной = диагноз, дата начала болезни, лечение, к_работник  
Описание объектных переменных, создание экземпляра производного класса.
Описание Б New типа больной   Dim Б as New больной Б.к_работник = New работник Б.к_работник.к_человек = New человек
Обращение к элементам классов
Б.специальность Б.имя Б. к_работник.специальность Б. к_работник.к_человек.имя

 

Наличие фактического наследования в VBA можно показать на примере элементов управления на форме. Все элементы коллекции Controls имеют координаты, размеры, и т.п. Поэтому если Вы опишите объектную переменную типа Control, то редактор будет подсказывать Вам эти свойства. Если же Вы опишите переменную типа Image, то увидите подсказку особых свойств элемента управления, например, Picture. В то же время к этому элементу можно обратиться двумя способами, видя при каждом разный набор свойств.

Поместите на форму один элемент управления Image. Программа, вызываемая, например, по щелчку на форму, изменяет высоту и цвет фона последнего добавленного элемента, то есть Image.

Dim s As Control, si As Image

Set s = Controls(Controls.Count - 1)

s.Height = s.Height + 10

Set si = s

' а можно и Set si=Controls(Controls.Count - 1)

si.BackColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)

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

Dim s As Control

Set s = Controls(Controls.Count - 1)

s.Height = s.Height + 10

s.BackColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)

s.Picture = LoadPicture(ActiveDocument.Path & "\S.jpg")

Если же последний элемент управления не является Image, то оба варианта кода приведут к ошибке. В первом случае сообщение об ошибке будет выдано при выполнении оператора присваивания Set si=s – несоответствие типов. А во втором случае при попытке обратиться к свойству BackColor будет сказано, что такого свойства нет (если его действительно нет у последнего элемента управления).

<== предыдущая лекция | следующая лекция ==>
 | 
Поделиться с друзьями:


Дата добавления: 2013-12-12; Просмотров: 303; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.