sql >> Database >  >> RDS >> Access

Toegang tot klassenmodule en wrapperklassen

Inleiding.

Soms moet een bepaalde klassenmodule meer dan één keer worden geïnstantieerd om een ​​vergelijkbare set waarden voor een bepaalde toepassing te gebruiken.

Onze ClsArea Class Module, die we hebben ontworpen voor het berekenen van het tapijtoppervlak van kamers, is bijvoorbeeld een kandidaat voor vergelijkbare toepassingen. Stel dat we willen weten hoeveel vloertegels we in een kamer moeten leggen, dan zouden we naast de dimensiewaarden van Vloer ook de lengte- en breedtewaarden van Tegel moeten kunnen invoeren. Aangezien zowel Floor als Tile vergelijkbare eigenschapswaarden hebben als invoer, kunnen we twee instanties van ClsArea Class Module gebruiken, één instantie voor het FLOOR-gebied en het tweede exemplaar voor het TILE-gebied. Vloeroppervlak / Tegeloppervlak geeft het totale aantal tegels voor een bepaalde kamer.

Twee instanties van dezelfde klasmodule.

We kunnen dit doen door twee verschillende instanties van de ClsArea Class Module in het Standard Module Program te maken als er maar één Room is.

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

Omgaan met een reeks objecten.

Maar wat als we de bovenstaande methode moeten toepassen op een reeks van verschillende kamers met verschillende maten of kleuren tegels? Het antwoord daarop is om een ​​nieuwe klasmodule te maken met twee instanties van hetzelfde ClsArea Klasse, één instantie voor Floor, en de andere voor Tegels Eigenschappen. Beide instanties zijn verpakt in een nieuwe Class Module.

Laten we dat doen.

  1. Open uw database en open het codebewerkingsvenster (ALT+F11).
  2. Selecteer de Klasmodule van Invoegen Menu.
  3. Wijzig de Naam Eigenschapswaarde naar ClsTiles .
  4. Kopieer en plak de volgende VBA-code in de ClsTiles Class-module en sla de code op:
    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
    

    Beide instanties, pFLOOR en pTILES worden gedeclareerd als Private Properties van ClsTiles Class Object.

    De Class_Initialize() Subroutine start beide objecten in het geheugen wanneer de ClsTiles Class Module wordt geïnstantieerd in het gebruikersprogramma.

    De Class_Terminate() subroutine verwijdert beide instanties (pFLOOR en pTILES) uit het geheugen wanneer de instantie van de ClsTiles Class Module is ingesteld op Niets in het gebruikersprogramma.

    De Krijg en Instellen Met eigenschappenprocedures kunnen waarden worden opgehaald en toegewezen, respectievelijk van en naar de pFLOOR-instantie in het ClsTiles-klasse-object.

    De volgende procedure voor het ophalen en instellen van eigenschappen staat dezelfde bewerkingen toe in de pTILES-instantie van de ClsArea-klasse.

    We hebben een nieuwe functie toegevoegd NoOfTiles() in de nieuwe klassenmodule, om het aantal tegels te berekenen, gebaseerd op het vloeroppervlak en de tegeldimensie.

    Laten we een programma schrijven en het gebruik van meerdere instanties van hetzelfde klasseobject leren, in een nieuwe klassemodule:ClsTiles.

  5. Kopieer en plak de volgende VBA-code in een standaardmodule:
    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. Houd het foutopsporingsvenster open (CTRL+G) om de testgegevens af te drukken.
  7. Klik ergens in het midden van de VBA-code en druk op F5 Sleutel om de code uit te voeren. Het resultaat wordt afgedrukt op het Debug-venster.

    Als u de tegelbehoefte van meerdere kamers of kamers van meerdere verdiepingen van een hoogbouw wilt berekenen, moet u het bovenstaande programma dat een aantal keren uitvoeren en de waarden noteren, wat praktisch erg moeilijk is.

    Tegelvereiste voor meerdere kamers zoeken.

    Laten we nu een ander programma schrijven om de tegelvereisten van verschillende kamers te vinden, met een array van ClsTiles Objecten door de eigenschapswaarden rechtstreeks vanaf het toetsenbord in te voeren.

  8. Kopieer en plak de volgende VBA-code in een standaardmodule.
    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. Houd het foutopsporingsvenster open om de uitvoer daar af te drukken.
  10. Voer de code uit zoals eerder en voer waarden in voor vloer- en tegeldimensies voor drie kamers.

Zoals u in de bovenstaande code kunt zien, gaan beide waarden van de dimensies Room en Tile naast elkaar in dezelfde Class Object Array-instantie.

Het bovenstaande programma is een demo die alleen draait voor drie sets waarden binnen de For. . . Volgende lus. Het kan worden gewijzigd met een voorwaardelijke lus die een vereist aantal keren wordt uitgevoerd totdat een voorwaardelijke onderbrekingscode het programma beëindigt.

Het programma kan worden aangepast om elke set gegevenswaarden en berekeningsresultaten op te slaan in een tabel voor toekomstig gebruik.

Een Inpakklas is een Container Klasse voor instanties van andere klassen, gegevensstructuren of instantiesverzameling van andere objecten. Hier hebben we het gebruikt om twee instanties van hetzelfde klasse Object te bewaren.

Lijst met alle links over dit onderwerp.

  1. MS-Access Class-module en VBA
  2. MS-Access VBA Class Object Arrays
  3. MS-Access-basisklasse en afgeleide objecten
  4. VBA-basisklasse en afgeleide objecten-2
  5. Basisklasse en afgeleide objectvarianten
  6. Ms-Access Recordset en Class Module
  7. Toegang tot klassenmodule en wrapperklassen
  8. Transformatie van functionaliteit van wrapperklasse
  9. Basisprincipes voor MS-Access en verzamelingsobjecten
  10. Ms-Access Class-module en verzamelobject
  11. Tabelrecords in verzamelobject en formulier
  12. Basisprincipes van woordenboekobjecten
  13. Basisprincipes van woordenboekobjecten-2
  14. Woordenboek-objectsleutels en items sorteren
  15. Records van woordenboek naar formulier weergeven
  16. Klasobjecten toevoegen als woordenboekitems
  17. Klasobjecten toevoegen als woordenboekitems
  18. Klasobject woordenboekitem op formulier bijwerken

  1. hoe het type waarde in postgres te controleren

  2. Automatisch verhogen na verwijderen in MySQL

  3. Oracle Pl/SQL:Loop door XMLTYPE-knooppunten

  4. Hoe kan ik het trage querylogboek van MySQL inschakelen zonder MySQL opnieuw te starten?