Introduktion.
Det finns tillfällen då en viss klassmodul måste instansieras mer än en gång för att använda en liknande uppsättning värden för en viss applikation.
Till exempel vår ClsArea Class Module, som vi har designat för att beräkna mattans yta i rum är en kandidat för liknande applikationer. Anta att vi skulle vilja ta reda på hur många golvplattor vi behöver lägga i ett rum, så borde vi kunna mata in längd- och breddvärdena för kakel också, förutom dimensionsvärdena för golv. Eftersom både Golv och Tile har liknande egenskapsvärden som indata kan vi använda två instanser av ClsArea Class Module, en instans för FLOOR-området och den andra instansen för TILE-området. Golvyta / Kakelyta ger det totala antalet plattor för ett visst rum.
Två instanser av samma klassmodul.
Vi kan göra detta genom att skapa två olika instanser av ClsArea Class Module i standardmodulprogrammet om det bara finns ett 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
Hantera en rad objekt.
Men vad händer om vi behöver tillämpa ovanstående metod för en rad olika rum med olika storlekar eller färger på plattor? Svaret på det är att skapa en ny klassmodul med två instanser av samma ClsArea Klass, en instans för Våning, och den andra för Kakel Egenskaper. Båda instanserna är inslagna i en ny klassmodul.
Låt oss göra det.
- Öppna din databas och visa kodredigeringsfönstret (ALT+F11).
- Välj Klassmodulen från Infoga Meny.
- Ändra namnet Egenskapens värde till ClsTiles .
- Kopiera och klistra in följande VBA-kod i ClsTiles Class Module och spara 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
Båda instanserna, pFLOOR och pTILES deklareras som privata egenskaper för ClsTiles Class Object.
Class_Initialize() Subrutinen instansierar båda objekten i minnet när ClsTiles Class Module instansieras i användarprogrammet.
Class_Terminate() subrutinen tar bort båda instanserna (pFLOOR och pTILES) från minnet när ClsTiles Class Module-instansen är inställd på Ingenting i användarprogrammet.
Hämta och Ställ in Egenskapsprocedurer tillåter hämtning och tilldelning av värden, från respektive till pFLOOR-instansen, i ClsTiles Class Object.
Nästa Get and Set Property Procedur tillåter samma operationer i pTILES-instansen av ClsArea Class.
Vi har lagt till en ny funktion NoOfTiles() i den nya klassmodulen för att beräkna antalet brickor, baserat på golvyta och kakeldimension.
Låt oss skriva ett program och lära oss användningen av flera instanser av samma klassobjekt i en ny klassmodul:ClsTiles.
- Kopiera och klistra in följande VBA-kod i en 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
- Håll felsökningsfönstret öppet (CTRL+G) för att skriva ut testdata.
- Klicka någonstans i mitten av VBA-koden och tryck på F5 Nyckel för att köra koden. Resultatet skrivs ut i felsökningsfönstret.
Om du vill beräkna kakelkraven för flera rum eller rum på flera våningar i ett höghus bör du köra ovanstående program ett antal gånger och anteckna värdena, vilket är praktiskt taget mycket svårt.
Hitta kakelkrav för flera rum.
Låt oss nu skriva ett annat program för att hitta tile-kraven för flera rum, med en array av ClsTiles Objekt genom att mata in egenskapsvärdena direkt från tangentbordet.
- Kopiera och klistra in följande VBA-kod i en 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
- Håll felsökningsfönstret öppet för att skriva ut resultatet där.
- Kör koden som tidigare och ange värden för golv- och kakelmått för tre rum.
Som du kan se från ovanstående kod att både värdena för rums- och kakeldimensioner går in i samma Class Object Array-instans, sida vid sida.
Ovanstående program är en demo som endast körs för tre uppsättningar värden inom For. . . Nästa slinga. Den kan modifieras med en villkorlig loop som körs ett erforderligt antal gånger tills en villkorlig brytkod avslutar programmet.
Programmet kan modifieras för att spara varje uppsättning datavärden och beräkningsresultat i en tabell för framtida referens.
En Wrapper-klass är en behållare Klass för instanser av andra klasser, datastrukturer eller instanssamling av andra objekt. Här har vi använt det för att hålla två instanser av samma klass Objekt.
Lista över alla länkar om detta ämne.
- 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
- Lägg till klassobjekt som ordboksobjekt
- Uppdatera Class Object Dictionary-objekt på formulär