Introduktion.
Förra veckan hade vi en kort introduktion av ett enkelt Custom Class Object med bara två egenskaper, för Längd och Bredd Värderingar. En metod för att beräkna Area av vad som helst, med längd- och breddvärden. Hoppas du förstod grunderna i en Ms-Access Custom Class Module. Om inte, här är länken:Ms-Access Class Module och VBA. Besök sidan innan du fortsätter.
Class Module Objects sparar mycket kod i dina program. När du hittat något som du gör upprepade gånger i kod, tänk på ett klassmodulobjekt. Den repetitiva koden kan också omvandlas till en hjälpfunktion, men för klassobjekt måste du ta ett annat tillvägagångssätt.
För en enkel uppgift kan det krävas mer kod för att förfina funktionerna i klassmodulobjektet, men dina huvudmodulprogram kommer att vara enkla och all komplicerad kod som utvecklas och förfinas kommer att förbli dold för andra.
Men för tillfället har vi en enkel klassmodul i handen, vi kommer att försöka skapa en array av objekt för att beräkna arean för många objekt.
ClassArray()-underrutinen.
Exempel VBA-koden i standardmodulen skapar en array med fem objekt av ClsArea Class och skriver ut deras egenskapsvärden och metodresultat i felsökningsfönstret. Kopiera och klistra in (eller bättre om du skriver in dem, för att veta varje rad bättre vad de gör) följande kod i en standardmodul:
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
Klicka någonstans i mitten av koden och tryck på F5 för att köra koden. Mata in värdena för beskrivning, längd och bredd från tangentbordet för 5 olika objekt, efter varandra.
Exempel på programmet ges nedan:
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
Granska kod rad för rad.
Låt oss undersöka koden rad för rad. I deklarationsområdet har vi deklarerat en objektvariabel tmpA av ClsArea Type. På den andra raden deklarerades en tom Array CA() av ClsArea Type. Erforderligt antal element kommer att dimensioneras om senare i programmet.
På de följande två raderna har vi deklarerat variabler titel av strängtyp och j, L, och U variabler av typen Långt heltal.
Därefter initieras titelvariabeln med strängen 'ClassArray' och kommer att användas som en titel i InputBox()-funktionen. För….Nästa loop ställs in med en kontrollvariabel j att köra slingan fem gånger. Efter de kommande två kommentarsraderna visas Set uttalande instansierar (allokerar minne) ClsArea Class Objekt i minnet med namnet tmpA .
De nästa tre raderna kod tjänar till att mata in värden för strDesc , dblLength, och dblWidth Egenskaper för tmpA Class Object.
Efter nästa kommentarrad omdimensioneras ClsArea Class Object (CA) för 1 till j gånger (1 till 1 gång) genom att bevara befintliga objektelement, om några (detta är det första objektet i arrayen). Detta kommer att fortsätta öka genom ReDim sats, till 1 till 2, 1 till 3, 1 till 4 och 1 till 5 genom att bevara de tidigare objektvärdena, inom For . . . Nästa slinga. Bevara nyckelordet säkerställer att de befintliga arrayobjekten inte går förlorade.
Obs! Re-Dimension-satsen ökar/minskar antalet angivna objektelement men raderar de befintliga objekten som laddats in i arrayen tidigare, utan Bevara nyckelord.
Set satsen på nästa rad kopierar tmpA-objektet med dess data till CA(j) ClsArea Object nyskapat j arrayelement.
Nästa rad Ange tmpA =Ingenting tar bort det tillfälliga objektet från minnet.
For...Next-loopen upprepar den här åtgärden fyra gånger till för att mata in andra objekt i det nyligen instansierade temporära objektet tmpA, en efter en, och kopierar objektet till CA Object Array.
De nästa två raderna, efter kommentarsraden, hittar Object Array-indexintervallet (hittar de lägsta och högsta indexnumren.
Nästa Debug.Print uttalande skriver ut en rubrikrad i 14 kolumnzoner i felsökningsfönstret. För . . . Nästa slinga med L och U bundna arrayindexnummerintervall kör de inre satserna för att komma åt varje objekt från Array CA, med indexnummer i kontrollvariabel j.
Den aktuella objektreferensen ställs in i Med. . . Avsluta med struktur, snarare än att upprepa objektnamnet CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth och CA(j).Area för att skriva ut objektets egenskapsvärden och metodområde()-resultat i felsökningsfönstret.
Ta bort kommentarsymbolen från Stopp för att skapa en paus i programmet på Stop-satsen. Kör koden igen och ange 5 objektdetaljer så att du kan experimentera med Array-objektet. Du kan selektivt adressera vilken som helst av objektegenskapen, med Array Index-numret, för att redigera eller skriva ut valfritt värde i felsökningsfönstret som visas nedan.
Satsen Ange CA(j) =Ingenting inom For. . . Next Loop rensar arrayobjekten, ett efter ett, från minnet.
Lämna klassobjektmatris som funktionsparameter.
Vi kan skicka Class Object Array som en parameter till ett program, som vi gjorde med User-Defined Data Type.
Låt oss skapa en enkel utskriftssubrutin genom att klippa ut koden för utskriftssektionen för huvudprogrammet och placera den i det nya programmet.
Kopiera ClassArray()-subrutinkoden, klistra in den i samma standardmodul och ändra namnet som ClassArray2(), som visas nedan.
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-koden utan utskrift.
Skapa en ny underrutin enligt nedan:
Public Sub ClassPrint(ByRef clsPrint() As ClsArea) Dim L As Long, U As Long Dim j As Long End Sub
Markera utskriftsavsnittet upp till "Stop-satsen i ClassArray2()-programmet, klipp ut det markerade området i koden och klistra in det under Dim uttalanden i ClassPrint() Program. Den modifierade versionen av båda koderna ges nedan:
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
Programmet 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
Kontrollera om det finns kodändringar i båda programmen och gör korrigeringar där det är tillämpligt. Klicka i mitten av ClassArray2()-koden och tryck på F5 för att köra programmet.
Call-satsen i det första programmet skickar CA Class Object Array som ByRef-parameter till ClassPrint()-subrutinen. Programmet skriver ut objektegenskaperna och anropar funktionen Area() för att beräkna och returnera värdet för utskrift.
Nästa vecka kommer vi att lära oss hur du använder vår ClsArea Class-modul som en basklass för att skapa ett nytt VBA-klassobjekt för att beräkna Volymen av någonting.
- MS-Access Class Module och VBA
- MS-Access VBA Class Object Arrays
- MS-Access basklass och härledda objekt
- VBA-basklass och härledda objekt-2
- Basklass- och härledda objektvarianter
- Ms-Access Recordset och Class Module
- Åtkomst till klassmoduler och omslagsklasser
- Omvandling av omslagsklassfunktionalitet
- Ms-Access och Collection Object Basics
- Ms-Access Class Module och Collection Object
- Tabellposter i samlingsobjekt och form
- Grundläggande om ordbokobjekt
- Dictionary Object Basics-2
- Sortera ordboksobjektnycklar och objekt
- Visa poster från ordbok till formulär
- Lägg till klassobjekt som ordboksobjekt
- Uppdatera Class Object Dictionary-objekt på formulär