Въведение.
Миналата седмица имахме кратко представяне на прост Custom Class Object само с две свойства, за дължина и Ширина Стойности. Метод за изчисляване на Площ на всичко, със стойности за дължина и ширина. Надяваме се, че сте разбрали основите на модула за персонализиран клас Ms-Access. Ако не, ето връзката:Ms-Access Class Module и VBA. Моля, посетете страницата, преди да продължите.
Class Module Objects спестява много код във вашите програми. Когато намерите нещо, което правите многократно в Code, помислете за обект на модул на клас. Повтарящият се код може да се превърне и в полезна функция, но за обектите на класа трябва да използвате различен подход.
За проста задача може да отнеме повече код, за да прецизирате функциите на Class Module Object, но вашите основни модулни програми ще бъдат прости и целият сложен код, разработен и усъвършенстван, ще остане скрит от другите.
Но засега имаме прост модул на класа в ръка и ще опитаме как да създадем масив от обекти, за да изчислим площта на много елементи.
Подрутина ClassArray().
Примерният VBA код в стандартния модул създава масив от пет обекта от клас ClsArea и отпечатва техните стойности на свойства и резултат от метода в прозореца за отстраняване на грешки. Копирайте и поставете (или по-добре, ако ги въведете, за да знаете по-добре всеки ред какво правят) следния код в стандартен модул:
Public Sub ClassArray() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String Dim L As Long, U As Long title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next ‘PRINTING SECTION 'Print the Array contents into the Debug Window L = LBound(CA) U = UBound(CA) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With CA(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next ’stop 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Щракнете някъде в средата на кода и натиснете F5, за да изпълните кода. Въведете стойностите за описание, дължина и ширина от клавиатурата за 5 различни елемента, един след друг.
Примерно изпълнение на програмата е дадено по-долу:
Description Length Width Area Door Mat 5 8 40 Carpet 12 23 276 Bed Room 21 23 483 Store Room 15 25 375 Terrace 40 50 2000
Преглед на код ред по ред.
Нека разгледаме кода ред по ред. В областта за декларация сме декларирали обектна променлива tmpA от тип ClsArea. Във втория ред е деклариран празен масив CA() от тип ClsArea. Необходимият брой елементи ще бъде преоразмерен по-късно в програмата.
В следващите два реда сме декларирали променливи title от тип String и j, L, и U променливи от тип Long Integer.
След това променливата заглавие се инициализира с низа „ClassArray“ и ще се използва като заглавие във функцията InputBox(). За….Напред цикълът се задава с контролна променлива j да стартирате цикъла пет пъти. След следващите два реда за коментари, Задаване изявлениеинстанцира (разпределя памет) Обект на клас ClsArea в паметта с името tmpA .
Следващите три реда код служат за въвеждане на стойности за strDesc , dblLength, и dblWidth Свойства на tmpA Class Object.
След следващия ред коментар, ClsArea Class Object (CA) се преоразмерява за 1 до j пъти (1 до 1 път) чрез запазване на съществуващите елементи на обекта, ако има такива (това е първият обект в масива). Това ще продължи да се увеличава чрез ReDim оператор до 1 до 2, 1 до 3, 1 до 4 и 1 до 5 чрез запазване на по-ранните стойности на обекта в рамките на For . . . Следващият цикъл. Резервът ключова дума гарантира, че съществуващите обекти на масива няма да бъдат загубени.
Забележка: Инструкцията Re-Dimension увеличава/намалява броя на посочените елементи на обекта, но изтрива съществуващите обекти, заредени в масива по-рано, без Запазване ключова дума.
Наборът оператор в следващия ред копира обекта tmpA с неговите данни в CA(j) Обект ClsArea новосъздаденият j елемент на масива.
Следващ ред Задайте tmpA =Нищо премахва временния обект от паметта.
Цикълът For…Next повтаря това действие още четири пъти, за да въведе други елементи в току-що инстанцирания временен обект tmpA, един след друг, и копира обекта в масива от CA обекти.
Следващите два реда, след реда за коментари, намират индексния диапазон на Object Array (открива най-ниското и най-високото число на индекса.
Следващият Отстраняване на грешки. Печат оператор отпечатва заглавен ред в 14 колонни зони в прозореца за отстраняване на грешки. Вза . . . Следващата цикъл с L и U bound array index number ranges изпълнява вътрешните оператори за достъп до всеки обект от масив CA, с номер на индекс в контролна променлива j.
Текущата препратка към обекта се задава в рамките на С. . . Край с структура, вместо да повтаря името на обекта CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth и CA(j).Площ за да отпечатате стойностите на свойствата на обекта и резултатите от областта на метода() в прозореца за отстраняване на грешки.
Премахнете символа за коментар от „Стоп оператор за създаване на пауза в програмата на оператора Stop. Стартирайте отново кода и въведете подробности за 5 елемента, за да можете да експериментирате с обекта на масива. Можете избирателно да адресирате всяко свойство на обекта с номер на индекс на масива, за да редактирате или отпечатате всяка стойност в прозореца за отстраняване на грешки, както е показано по-долу.
Изявлението Задайте CA(j) =нищо в рамките на For. . . Следващият цикъл изчиства обектите на масива един по един от паметта.
Предаване на масив от обекти от клас като функционален параметър.
Можем да предадем масива от обекти от клас като параметър на програма, както направихме с потребителски дефиниран тип данни.
Нека създадем проста подпрограма за печат, като изрежем кода на секцията за печат на основната програма и го поставим в новата програма.
Копирайте кода на подпрограмата ClassArray(), поставете го в същия стандартен модул и променете името като ClassArray2(), както е показано по-долу.
Public Sub ClassArray2() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String Dim L As Long, U As Long title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next ‘PRINTING SECTION 'Print the Array contents into the Debug Window L = LBound(CA) U = UBound(CA) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With CA(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next ’stop 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Кодът ClassArray2 без секция за печат.
Създайте нова подпрограма, както е показано по-долу:
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long End Sub
Маркирайте секцията за печат до оператора „Стоп в програмата ClassArray2(), изрежете маркираната област на кода и я поставете под Dim изрази в ClassPrint() Програма. Променените версии на двата кода са дадени по-долу:
Public Sub ClassArray2() Dim tmpA As ClsArea Dim CA() As ClsArea Dim j As Long, title As String title = "ClassArray" For j = 1 To 5 ‘the Loop is set for 5 items 'instantiate temporary ClsArea Object 'to enter input Set tmpA = New ClsArea tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "") tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0) tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0) 'Redimension Array ReDim Preserve CA(1 To j) As ClsArea Set CA(j) = tmpA 'Copy Object to Array Set tmpA = Nothing 'Remove temporary object from memory. Next Call ClassPrint(CA) ‘Pass the Object Array to print routine 'Clear array objects from memory For j = L To U Set CA(j) = Nothing Next End Sub
Програмата ClassPrint().
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long 'Printing Section 'Print the Array Contents into the Debug Window. L = LBound(clsPrint) U = UBound(clsPrint) Debug.Print "Description", "Length", "Width", "Area" For j = L To U With clsPrint(j) Debug.Print .strDesc, .dblLength, .dblWidth, .Area End With Next End Sub
Проверете за промени в кода и в двете програми и направете корекции, където е приложимо. Щракнете в средата на кода ClassArray2() и натиснете F5, за да стартирате програмата.
Инструкцията Call в първата програма предава масива на CA Class Object като параметър ByRef на подпрограмата ClassPrint(). Програмата отпечатва свойствата на обекта и извиква функцията Area(), за да изчисли и върне стойността за печат.
Следващата седмица ще научим как да използваме нашия модул ClsArea Class като базов клас, за да създадем нов VBA клас обект за изчисляване на Обем на нещо.
- Модул за MS-Access Class и VBA
- Обектни масиви от клас VBA на MS-Access
- Основен клас на MS-Access и производни обекти
- Базов клас на VBA и производни обекти-2
- Варианти на основен клас и производен обект
- Ms-Access Recordset and Class Module
- Достъп до модул за класове и класове за обвивка
- Преобразуване на функционалност на класа на обвивката
- Основи на Ms-Access и колекция обекти
- Модул за клас Ms-Access и обект на колекция
- Записи в таблицата в обект и форма на колекция
- Основи на обекта на речника
- Основи на обекта на речника-2
- Сортиране на ключове и елементи в речника
- Показване на записи от речник към формуляр
- Добавяне на обекти на клас като елементи от речника
- Актуализиране на елемент от речника за обект на клас във формуляра