Въведение.
Има моменти, когато конкретен клас модул трябва да бъде инстанциран повече от веднъж, за да се използва подобен набор от стойности за конкретно приложение.
Например нашият модул ClsArea Class, който сме разработили за изчисляване на площта на килима на стаите, е кандидат за подобни приложения. Да приемем, че бихме искали да разберем колко подови плочки трябва да поставим в една стая, тогава би трябвало да можем да въвеждаме и стойностите за дължина и ширина на плочката, освен стойностите на размерите на пода. Тъй като и Floor, и Tile имат сходни стойности на свойствата като вход, можем да използваме два екземпляра на ClsArea Class Module, един екземпляр за областта FLOOR и втория екземпляр за областта TILE. Подова площ / Площ на плочките дава общия брой плочки за конкретна стая.
Два екземпляра на един и същи модул за клас.
Можем да направим това, като създадем две различни копия на модула за клас ClsArea в стандартната модулна програма, ако има само една стая.
Public Sub FloorTiles()Dim FLOOR As ClsAreaDim TILES As ClsAreaDim flrArea като Double, tilearea като DoubleDim lngTiles As LongSet FLOOR =New ClsAreaSet TILES =New ClsAreaSet TILES =New ClsAreaSet TILES =New ClsAreaSet TILES As ClsAreaDim flrArea като Double, tilearea като DoubleDim lngTiles As LongSet FLOOR =New ClsAreaSet TILES =New ClsAreaSet TILES =New ClsAreaSet TILES =New ClsAreaDim flrArea като Double, tilearea като DoubleDim lngTiles As LongSet FLOOR =New ClsAreaSet TILES =New ClsAreaSet TILES =New ClsAreaSet TILES =New ClsAreaDim flrArea като Double FLOOR.Area()TILES.strDesc ="Off-White"TILES.dblLength =2.5TILES.dblWidth =1.25tilearea =TILES.Area()lngTiles =flrArea / tileareaDebug.Print Tiles &Required FLOOR ". " Числа - Цвят:" &TILES.strDescSet FLOOR =NothingSet TILES =NothingEnd Sub
Обработка на масив от обекти.
Но какво ще стане, ако трябва да приложим горния метод за масив от няколко стаи с различни размери или цветове на плочките? Отговорът на това е да създадете нов модул за клас с две копия на една и съща ClsArea Клас, един екземпляр за Етаж а другият за Плочки Имоти. И двата екземпляра са обвити в нов модул за клас.
Нека направим това.
- Отворете вашата база данни и покажете прозореца за редактиране на код (ALT+F11).
- Изберете Модул за клас от Вмъкване Меню.
- Променете Името Стойност на свойството до ClsTiles .
- Копирайте и поставете следния VBA код в ClsTiles Class Module и запазете кода:
Опция Сравнете DatabaseOption ExplicitPrivate pFLOOR Като ClsAreaPrivate pTILES Като ClsAreaPrivate Sub Class_Initialize() Задайте ClsAreaPrivate Sub Class_Initialize() Задайте ClsArea New Set pFLOORD =Нов pFLOORD SubPrivate Sub Class_Terminate() Задайте pFLOOR =Nothing Set pTILES =NothingEnd SubPublic Property Вземете Floor() As ClsArea Задайте Floor =pFLOOREnd Property Public Property Set Floor(ByRef NewValue As ClsArea) Задайте pFLUE As ClsArea Set (ByRef NewValue As ClsArea) Задайте pFLOE As New ProperTyP. PTILESEnd PropertyPublic Property Set Tiles(ByRef NewValue As ClsArea) Set pTILES =NewValueEnd PropertyPublic Function NoOfTiles() As Long NoOfTiles =pFLOOR.Area() / pTILES.Area()End Function
И двата екземпляра, pFLOOR и pTILES са декларирани като частни свойства на обекта от клас ClsTiles.
Class_Initialize() Подпрограмата инстанцира и двата обекта в паметта, когато ClsTiles Модулът клас се инстанцира в потребителската програма.
Class_Terminate() подпрограмата премахва и двата екземпляра (pFLOOR и pTILES) от паметта, когато екземплярът ClsTiles Class Module е настроен на нищо в потребителската програма.
Вземете и Задаване Процедурите за свойства позволяват извличане и присвояване на стойности съответно от и към екземпляра pFLOOR в обекта на класа ClsTiles.
Следващата процедура Get and Set Property позволява същите операции в екземпляра pTILES на класа ClsArea.
Добавихме нова функция NoOfTiles() в новия модул за класове, за да изчислите броя на плочките въз основа на размерите на подовата площ и плочките.
Нека напишем програма и да научим как да използваме множество екземпляри от един и същ обект на клас в нов модул на клас:ClsTiles.
- Копирайте и поставете следния VBA код в стандартен модул:
Public Sub TilesCalc()Dim FTiles As ClsTilesDim TotalTiles As LongSet FTiles =New ClsTilesFTiles.Floor.strDesc ="Warehouse"FTiles.Flo.Flo. dblLength =100FTiles.Floor.dblWidth =50FTiles.Tiles.dblLength =2.5FTiles.Tiles.dblWidth =1.75TotalTiles =FTiles.NoOfTiles()Debug.Print "or Site Area", "Flo. Area", "Flo. of Tiles"Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTilesEnd Sub
- Дръжте прозореца за отстраняване на грешки отворен (CTRL+G), за да отпечатате тестовите данни.
- Щракнете някъде в средата на VBA кода и натиснете F5 Ключ за стартиране на кода. Резултатът се отпечатва в прозореца за отстраняване на грешки.
Ако искате да изчислите изискванията за плочки за няколко стаи или стаи на няколко етажа на многоетажна сграда, тогава трябва да стартирате горната програма няколко пъти и да запишете стойностите, което на практика е много трудно.
Намиране на изискванията за плочки в няколко стаи.
Сега нека напишем друга програма, за да намерим изискванията за плочки за няколко стаи, с масив от ClsTiles Обекти чрез въвеждане на стойностите на свойствата директно от клавиатурата.
- Копирайте и поставете следния VBA код в стандартен модул.
Public Sub TilesCalc2()Dim tmpFT As ClsTilesDim FTiles() As ClsTilesDim j As Long, L As Long, H As LongFor j =1 На 3 Задайте tmpFT =New ClsTiles 'Размер на етажа с tmpFT.Floor .strDesc =InputBox(Str(j) &") Floor Desc", , 0) .dblLength =InputBox(Str(j) &") Дължина на пода", , 0) .dblWidth =InputBox(Str(j) &") Ширина на пода", , 0) Край с "Размер на плочките с tmpFT.Tiles .strDesc =InputBox(Str(j) &") Плочки Desc", , 0) . dblLength =InputBox(Str(j) &") Tile Length", , 0) .dblWidth =InputBox(Str(j) &") Tile Width", , 0) Край с ReDim Запазване на FTiles(1 до j) като ClsTiles Set За j =L до H С FTiles(j) Отстраняване на грешки. Печат .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoO fTiles End WithNext 'Премахване на всички обекти от паметтаFor j =L To H Set FTiles(j) =NothingNext End Sub
- Дръжте прозореца за отстраняване на грешки отворен, за да отпечатате изхода там.
- Изпълнете кода както преди и въведете стойности за размерите на пода и плочките за три стаи.
Както можете да видите от горния код, и двете стойности на размерите на стаята и плочките влизат в един и същ екземпляр на клас обектен масив, една до друга.
Горната програма е демонстрация, която работи само за три набора от стойности в рамките на For. . . Следващият цикъл. Той може да бъде модифициран с условен цикъл, който се изпълнява за необходимия брой пъти, докато код за условно прекъсване прекрати програмата.
Програмата може да бъде променена, за да запази всеки набор от стойности на данни и резултати от изчисленията в таблица за бъдещи справки.
Клас на обвивката е контейнер Клас за екземпляри на други класове, структури от данни или колекция от екземпляри от други обекти. Тук сме го използвали за съхраняване на две копия на един и същи клас Object.
Списък с всички връзки по тази тема.
- Модул за MS-Access Class и VBA
- Обектни масиви от клас VBA на MS-Access
- Основен клас на MS-Access и производни обекти
- Базов клас на VBA и производни обекти-2
- Варианти на основен клас и производен обект
- Ms-Access Recordset and Class Module
- Достъп до модул за класове и класове за обвивка
- Преобразуване на функционалност на класа на обвивката
- Основи на Ms-Access и колекция обекти
- Модул за клас Ms-Access и обект на колекция
- Записи в таблицата в обект и форма на колекция
- Основи на обекта на речника
- Основи на обекта на речника-2
- Сортиране на ключове и елементи в речника
- Показване на записи от речник към формуляр
- Добавяне на обекти на клас като елементи от речника
- Добавяне на обекти на клас като елементи от речника
- Актуализиране на елемент от речника за обект на клас във формуляра