Introduktion.
Der er tidspunkter, hvor et bestemt klassemodul skal instansieres mere end én gang for at bruge et lignende sæt værdier til en bestemt applikation.
For eksempel vores ClsArea Class Module, vi har designet til at beregne tæppearealet i Rooms er en kandidat til lignende applikationer. Antag, at vi gerne vil finde ud af, hvor mange gulvfliser vi skal lægge i et rum, så burde vi være i stand til at indtaste længde- og breddeværdierne for fliser også, udover dimensionsværdierne for gulv. Da både Floor og Tile har lignende egenskabsværdier som input, kan vi bruge to forekomster af ClsArea Class Module, en forekomst for FLOOR-området og den anden forekomst for TILE-området. Floor-Area / Tile-Area angiver det samlede antal fliser for et bestemt rum.
To forekomster af det samme klassemodul.
Vi kan gøre dette ved at oprette to forskellige forekomster af ClsArea-klassemodulet i standardmodulprogrammet, hvis der kun er ét rum.
Public Sub FloorTiles() Dim FLOOR As ClsArea Dim TILES As ClsArea Dim flrArea As Double, tilearea As Double Dim lngTiles As Long Set FLOOR = New ClsArea Set TILES = New ClsArea FLOOR.strDesc = "Bed Room1" FLOOR.dblLength = 25 FLOOR.dblWidth = 15 flrArea = FLOOR.Area() TILES.strDesc = "Off-White" TILES.dblLength = 2.5 TILES.dblWidth = 1.25 tilearea = TILES.Area() lngTiles = flrArea / tilearea Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc Set FLOOR = Nothing Set TILES = Nothing End Sub
Håndtering af en række objekter.
Men hvad nu hvis vi skal anvende ovenstående metode til en række af flere rum med forskellige størrelser eller farver af fliser? Svaret på det er at oprette et nyt klassemodul med to forekomster af det samme ClsArea Klasse, én forekomst for Etage, og den anden til Fliser Ejendomme. Begge forekomster er pakket ind i et nyt klassemodul.
Lad os gøre det.
- Åbn din database, og vis koderedigeringsvinduet (ALT+F11).
- Vælg Klassemodulet fra Indsæt Menu.
- Skift navnet Ejendomsværdi til ClsTiles .
- Kopiér og indsæt følgende VBA-kode i ClsTiles-klassemodulet og gem koden:
Option Compare Database Option Explicit Private pFLOOR As ClsArea Private pTILES As ClsArea Private Sub Class_Initialize() Set pFLOOR = New ClsArea Set pTILES = New ClsArea End Sub Private Sub Class_Terminate() Set pFLOOR = Nothing Set pTILES = Nothing End Sub Public Property Get Floor() As ClsArea Set Floor = pFLOOR End Property Public Property Set Floor(ByRef NewValue As ClsArea) Set pFLOOR = NewValue End Property Public Property Get Tiles() As ClsArea Set Tiles = pTILES End Property Public Property Set Tiles(ByRef NewValue As ClsArea) Set pTILES = NewValue End Property Public Function NoOfTiles() As Long NoOfTiles = pFLOOR.Area() / pTILES.Area() End Function
Begge forekomster, pFLOOR og pTILES er erklæret som private egenskaber for ClsTiles klasseobjekt.
Class_Initialize() Subrutine instansierer begge objekter i hukommelsen, når ClsTiles Klassemodulet instansieres i brugerprogrammet.
Class_Terminate() underrutinen fjerner begge forekomster (pFLOOR og pTILES) fra hukommelsen, når ClsTiles Class Module-forekomsten er indstillet til Intet i brugerprogrammet.
Hent og Indstil Egenskabsprocedurer tillader hentning og tildeling af værdier, henholdsvis fra og til pFLOOR-forekomsten, i ClsTiles-klasseobjektet.
Den næste Get and Set Property Procedure tillader de samme operationer i pTILES-forekomsten af ClsArea-klassen.
Vi har tilføjet en ny funktion NoOfTiles() i det nye klassemodul for at beregne antallet af fliser baseret på gulvareal og flisedimension.
Lad os skrive et program og lære brugen af flere forekomster af det samme klasseobjekt i et nyt klassemodul:ClsTiles.
- Kopiér og indsæt følgende VBA-kode i et standardmodul:
Public Sub TilesCalc() Dim FTiles As ClsTiles Dim TotalTiles As Long Set FTiles = New ClsTiles FTiles.Floor.strDesc = "Warehouse" FTiles.Floor.dblLength = 100 FTiles.Floor.dblWidth = 50 FTiles.Tiles.dblLength = 2.5 FTiles.Tiles.dblWidth = 1.75 TotalTiles = FTiles.NoOfTiles() Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles" Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles End Sub
- Hold fejlretningsvinduet åbent (CTRL+G) for at udskrive testdataene.
- Klik et sted i midten af VBA-koden, og tryk på F5 Nøgle til at køre koden. Resultatet udskrives på fejlfindingsvinduet.
Hvis du vil beregne flisekravene for flere rum eller rum i flere etager i et højhus, bør du køre ovenstående program et antal gange og notere værdierne, hvilket praktisk talt er meget svært.
Sådan finder du krav om fliser i flere rum.
Lad os nu skrive et andet program for at finde flisekravene for flere rum, med en række ClsTiles Objekter ved at indtaste egenskabsværdierne direkte fra tastaturet.
- Kopiér og indsæt følgende VBA-kode i et standardmodul.
Public Sub TilesCalc2() Dim tmpFT As ClsTiles Dim FTiles() As ClsTiles Dim j As Long, L As Long, H As Long For j = 1 To 3 Set tmpFT = New ClsTiles 'Floor dimension With tmpFT.Floor .strDesc = InputBox(Str(j) & ") Floor Desc", , 0) .dblLength = InputBox(Str(j) & ") Floor Length", , 0) .dblWidth = InputBox(Str(j) & ") Floor Width", , 0) End With 'Tile Dimension With tmpFT.Tiles .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0) .dblLength = InputBox(Str(j) & ") Tile Length", , 0) .dblWidth = InputBox(Str(j) & ") Tile Width", , 0) End With ReDim Preserve FTiles(1 To j) As ClsTiles Set FTiles(j) = tmpFT Set tmpFT = Nothing Next 'Take Printout L = LBound(FTiles) H = UBound(FTiles) Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles" For j = L To H With FTiles(j) Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles End With Next 'Remove all objects from memory For j = L To H Set FTiles(j) = Nothing Next End Sub
- Hold fejlfindingsvinduet åbent for at udskrive output der.
- Kør koden som før, og indtast værdier for gulv- og flisedimensioner for tre rum.
Som du kan se fra ovenstående kode, går både værdier af rum- og flisedimensioner ind i den samme Class Object Array-instans, side om side.
Ovenstående program er en demo, der kun kører for tre sæt værdier i For. . . Næste sløjfe. Den kan modificeres med en betinget løkke, der kører et krævet antal gange, indtil en betinget pausekode afslutter programmet.
Programmet kan modificeres for at gemme hvert sæt dataværdier og beregningsresultater i en tabel til fremtidig reference.
En Wrapper-klasse er en Container Klasse for forekomster af andre klasser, datastrukturer eller forekomstsamling af andre objekter. Her har vi brugt det til at holde to forekomster af den samme klasse Object.
Liste over alle links om dette emne.
- MS-Access Class Module og VBA
- MS-Access VBA Class Object Arrays
- MS-Access Basisklasse og afledte objekter
- VBA-basisklasse og afledte objekter-2
- Basisklasse og afledte objektvarianter
- Ms-Access Recordset og klassemodul
- Adgang til klassemodul- og indpakningsklasser
- Wrapper Class Funktionalitet Transformation
- Grundlæggende om Ms-Access og Collection Object
- Ms-Access klassemodul og samlingsobjekt
- Tabelposter i samlingsobjekt og -form
- Grundlæggende om ordbogsobjekt
- Dictionary Object Basics-2
- Sortering af ordbogsobjektnøgler og -elementer
- Vis poster fra ordbog til formular
- Tilføj klasseobjekter som ordbogselementer
- Tilføj klasseobjekter som ordbogselementer
- Opdater Class Object Dictionary Element på formular