sql >> Databasteknik >  >> RDS >> Access

Access Class Module och Wrapper Classes

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.

  1. Öppna din databas och visa kodredigeringsfönstret (ALT+F11).
  2. Välj Klassmodulen från Infoga Meny.
  3. Ändra namnet Egenskapens värde till ClsTiles .
  4. 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.

  5. 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
     
  6. Håll felsökningsfönstret öppet (CTRL+G) för att skriva ut testdata.
  7. 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.

  8. 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
    
    
  9. Håll felsökningsfönstret öppet för att skriva ut resultatet där.
  10. 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.

  1. MS-Access Class Module och VBA
  2. MS-Access VBA Class Object Arrays
  3. MS-Access basklass och härledda objekt
  4. VBA-basklass och härledda objekt-2
  5. Basklass- och härledda objektvarianter
  6. Ms-Access Recordset och Class Module
  7. Åtkomst till klassmoduler och omslagsklasser
  8. Omvandling av omslagsklassfunktionalitet
  9. Ms-Access och Collection Object Basics
  10. Ms-Access Class Module och Collection Object
  11. Tabellposter i samlingsobjekt och form
  12. Grundläggande om ordbokobjekt
  13. Dictionary Object Basics-2
  14. Sortera ordboksobjektnycklar och objekt
  15. Visa poster från ordbok till formulär
  16. Lägg till klassobjekt som ordboksobjekt
  17. Lägg till klassobjekt som ordboksobjekt
  18. Uppdatera Class Object Dictionary-objekt på formulär

  1. Förstå Lob-segment (SYS_LOB) i Oracle?

  2. Kan inte binda argument vid index 2 eftersom indexet ligger utanför intervallet

  3. Streama stora resultatuppsättningar med MySQL

  4. Guide för CTE i SQL Server