Въведение.
Миналата седмица опитахме пример за предаване на обект от базов клас през Set Процедура за свойство, за да стане част от Обекта в паметта. Преданият обект става разширение или дъщерен обект на главния обект в паметта. В нашата по-ранна програма предаването на дъщерния обект към целевия обект беше направено във фазата на инстанциране на нашата тестова програма. Присвоихме стойности на предадените свойства на обекта в по-късната част на програмата. Следващият пример е малко по-различен.
За тези, които биха искали да преминат през по-ранните статии за модула за клас MS-Access, връзките са дадени по-долу:
- Модул за MS-Access Class и VBA
- Обектни масиви от клас VBA на MS-Access
- Основен клас на MS-Access и производни обекти
- Основен клас на VBA и производен обект-2
Този път ще отворим и двата обекта (ClsArea – базовият клас, ClsVolume2 – целевият клас) поотделно в нашата тестова програма. Задайте стойности в свойствата на базовия клас ClsArea, преди да ги предадете на целевия обект на клас ClsVolume2. Не забравяйте, че класът Volume2 има само едно собствено свойство, p_Height Свойство и неговият метод Volume() се нуждае от дължината и Ширина Стойности на базовия клас ClsArea за изчисляване на обема.
- Копирайте и поставете следния примерен тестов код в стандартен модул.
Процедурата SetNewVol2_2.
Public Sub SetNewVol2_2() 'Method 2/2 Dim CA As ClsArea Dim Vol As ClsVolume2 Set CA = New ClsArea Set Vol = New ClsVolume2 CA.strDesc = "Bed Room" CA.dblLength = 90 CA.dblWidth = 10 Stop 'Here ClsArea class Object CA is passed to the ‘Property procedure Set CArea of ClsVolume2 object Vol Set Vol.CArea = CA 'Pass ClsArea obj to ClsVolume2 Vol.dblHeight = 10 'assign height to ClsVolume2 Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume" With Vol.CArea Debug.Print .strDesc, .dblLength, .dblWidth, .Area(), Vol.dblHeight, Vol.Volume() End With Stop Set CA = Nothing Set Vol = Nothing End Sub
Преглед на VBA код.
В първиятдим изявление, CA се дефинира като ClsArea Object и Vol като обект ClsVolume2. Следващите два оператора инстанцират и двата обекта в паметта.
Следващите три израза присвояват стойности на свойствата на ClsArea Class Object.
Стоп операторът дава пауза в изпълнението на кода, за да можем да проверим стойностите на свойствата на обекта в прозореца Locals.
Задайте Vol.CArea =CA оператор присвоява ClsArea Class Object CA, като дъщерен обект в Vol (ClsVolume2) Обект.
В следващата стъпка dblHeight Свойството на ClsVolume2 Class Object е присвоено със стойност 10.
Следващите оператори преди оператора Stop отпечатват стойностите от паметта в прозореца за отстраняване на грешки.
Следващите двенастройки Изявленията премахват обектите от паметта, преди да прекрати програмата.
Показване на прозореца Locals.
- Изберете Прозорец Locals Опция от менюто Преглед.
- Щракнете някъде в средата на кода и натиснете F5 за да стартирате кода, докато програмата спре на Стоп изявление. Като алтернатива можете да натиснете F8 да изпълнявате кода стъпка по стъпка, за да проверявате прозореца Locals за промени на всяка стъпка.
- Кликнете върху [+] Символ за разгъване и показване както на свойствата на обектите, така и на стойностите.
- Проверете CArea и p_Area Препратка към обекта в Стойност колона на том Обекти. Стойността там се показва като Нищо защото все още не сме предали CA обект на Vol обекта.
- Ако сте приключили с разглеждането на съдържанието на прозореца Locals, след това стартирайте кода до следващото Спиране изявление. Сега, CAREa Вземете процедура за собственост и p_Area Обектите се присвояват с ClsArea Class Object.
Ще опитаме друг вариант вариант на двата класа ClsArea и ClsVolume2.
Нов модул за клас ClsVolume3.
1. Поставете нов клас модул и променете името му Property Value на ClsVolume3 .
2. Копирайте и поставете следния VBA код в ClsVolume3 Class Module:
Option Compare Database Option Explicit 'Method three Private p_Height As Double Public p_Area As ClsArea Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) p_Height = dblNewValue End Property Public Function Volume() As Double Volume = p_Area.dblLength * p_Area.dblWidth * Me.dblHeight End Function Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub
Проверете кода от началото:p_Height обявен за частна собственост. p_Area Свойство на клас ClsVolume3 е деклариран като Публичен Обект ClsArea. Това означава p_Area ще се появи като свойство на класа ClsVolume3 със свои собствени показваеми свойства за директен Get/Let операции в потребителската програма в стандартния модул. Въпреки че обектът на клас ClsArea е деклариран като публична собственост на клас ClsVolume3, неговите свойства са капсулирани в самия клас ClsArea.
Проверете Class_Initialize() и Class_Terminate() Подпрограми. Обектът ClsArea се инстанцира в Class_Initialize() Code и премахва обекта от паметта в Class_Terminate() Code, когато потребителската програма приключи.
Програмата за тестване.
Примерният тестов VBA код е даден по-долу.
Копирайте и поставете кода в стандартния модул.
Public Sub SNewVol3() 'Here ClsArea class is declared as a Public Property of ClsVolume3 Dim volm As ClsVolume3 Set volm = New ClsVolume3 volm.p_Area.strDesc = "Bed Room" volm.p_Area.dblLength = 15 'assign length volm.p_Area.dblWidth = 10 'assign width in clsArea volm.dblHeight = 10 'assign height to ClsVolume2 Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume" With volm.p_Area Debug.Print .strDesc, .dblLength, .dblWidth, .Area, volm.dblHeight, volm.Volume End With Set volm = Nothing End Sub
Покажете прозореца Locals (Преглед - -> Прозорец Locals), ако още не е отворен.
Кликнете някъде в средата на кода и натиснете F8 за да изпълните VBA кода един ред наведнъж и да наблюдавате локалния прозорец, за да проследите какво се случва на всяка стъпка.
Всички горепосочени варианти на класа ClsVolume са написани с по-малко код, с изключение на първия пример за клас ClsVolume.
Работа с обекта Recordset.
Следващата седмица ще работим с вграден обект DAO.Recordset и изградете модул за клас до:
- Изчислете и актуализирайте поле,
- Сортирайте данните,
- Отпечатайте сортираните данни в прозореца за отстраняване на грешки,
- и Създайте клонинг на таблицата със сортирани данни.
Това е много действия следващата седмица.
Списък с всички връзки по тази тема.
- Модул за MS-Access Class и VBA
- Обектни масиви от клас VBA на MS-Access
- Основен клас на MS-Access и производни обекти
- Базов клас на VBA и производни обекти-2
- Варианти на основен клас и производен обект
- Ms-Access Recordset and Class Module
- Достъп до модул за класове и класове за обвивка
- Преобразуване на функционалност на класа на обвивката
- Основи на Ms-Access и колекция обекти
- Модул за клас Ms-Access и обект на колекция
- Записи в таблицата в обект и форма на колекция
- Основи на обекта на речника
- Основи на обекта на речника-2
- Сортиране на ключове и елементи в речника
- Показване на записи от речник към формуляр
- Добавяне на обекти на клас като елементи от речника
- Актуализиране на елемент от речника за обект на клас във формуляра