Access
 sql >> Datenbank >  >> RDS >> Access

Greifen Sie auf das Klassenmodul und die Wrapper-Klassen zu

Einführung.

Es gibt Zeiten, in denen ein bestimmtes Klassenmodul mehr als einmal instanziiert werden muss, um einen ähnlichen Satz von Werten für eine bestimmte Anwendung zu verwenden.

Beispielsweise ist unser ClsArea-Klassenmodul, das wir für die Berechnung der Teppichfläche von Räumen entwickelt haben, ein Kandidat für ähnliche Anwendungen. Angenommen, wir möchten herausfinden, wie viele Bodenfliesen wir in einem Raum verlegen müssen, dann sollten wir neben den Maßwerten von Floor auch die Längen- und Breitenwerte von Tile eingeben können. Da sowohl Floor als auch Tile ähnliche Eigenschaftswerte als Eingabe haben, können wir zwei Instanzen des ClsArea-Klassenmoduls verwenden, eine Instanz für den FLOOR-Bereich und die zweite Instanz für den TILE-Bereich. Bodenfläche / Fliesenfläche gibt die Gesamtzahl der Fliesen für einen bestimmten Raum an.

Zwei Instanzen desselben Klassenmoduls.

Wir können dies tun, indem wir zwei verschiedene Instanzen des ClsArea-Klassenmoduls im Standardmodulprogramm erstellen, wenn es nur einen Raum gibt.

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

Handhabung eines Arrays von Objekten.

Aber was ist, wenn wir die obige Methode für eine Reihe von mehreren Räumen mit unterschiedlichen Fliesengrößen oder -farben anwenden müssen? Die Antwort darauf ist, ein neues Klassenmodul mit zwei Instanzen derselben ClsArea zu erstellen Klasse, eine Instanz für Floor, und die andere für Kacheln Eigenschaften. Beide Instanzen werden in ein neues Klassenmodul eingeschlossen.

Lassen Sie uns das tun.

  1. Öffnen Sie Ihre Datenbank und zeigen Sie das Codebearbeitungsfenster an (ALT+F11).
  2. Wählen Sie das Klassenmodul aus von Einfügen Menü.
  3. Ändern Sie den Namen Eigenschaftswert zu ClsTiles .
  4. Kopieren Sie den folgenden VBA-Code, fügen Sie ihn in das ClsTiles-Klassenmodul ein und speichern Sie den Code:
    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 Instanzen, pFLOOR und pTILES, werden als private Eigenschaften des ClsTiles-Klassenobjekts deklariert.

    Die Class_Initialize() Die Subroutine instanziiert beide Objekte im Speicher, wenn die ClsTiles Das Klassenmodul wird im Benutzerprogramm instanziiert.

    Die Class_Terminate() Unterroutine entfernt beide Instanzen (pFLOOR und pTILES) aus dem Speicher, wenn die Instanz des ClsTiles-Klassenmoduls im Benutzerprogramm auf Nothing gesetzt ist.

    Das Get und Einstellen Eigenschaftsprozeduren ermöglichen das Abrufen und Zuweisen von Werten von bzw. zu der pFLOOR-Instanz im ClsTiles-Klassenobjekt.

    Die nächste Get- und Set-Property-Prozedur ermöglicht die gleichen Operationen in der pTILES-Instanz der ClsArea-Klasse.

    Wir haben eine neue Funktion NoOfTiles() hinzugefügt im neuen Klassenmodul, um die Anzahl der Fliesen basierend auf der Bodenfläche und der Fliesenabmessung zu berechnen.

    Lassen Sie uns ein Programm schreiben und die Verwendung mehrerer Instanzen desselben Klassenobjekts in einem neuen Klassenmodul lernen:ClsTiles.

  5. Kopieren Sie den folgenden VBA-Code und fügen Sie ihn in ein Standardmodul ein:
    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. Lassen Sie das Debug-Fenster geöffnet (STRG+G), um die Testdaten zu drucken.
  7. Klicken Sie irgendwo in die Mitte des VBA-Codes und drücken Sie F5 Schlüssel zum Ausführen des Codes. Das Ergebnis wird im Debug-Fenster ausgegeben.

    Wenn Sie den Fliesenbedarf mehrerer Räume oder Räume mehrerer Stockwerke eines Hochhauses berechnen wollen, dann sollten Sie obiges Programm mehrmals ausführen und die Werte notieren, was praktisch sehr schwierig ist.

    Fliesenanforderungen für mehrere Räume finden.

    Lassen Sie uns nun ein weiteres Programm schreiben, um die Tile-Anforderungen mehrerer Räume mit einem Array von ClsTiles zu ermitteln Objekte durch Eingabe der Eigenschaftswerte direkt über die Tastatur.

  8. Kopieren Sie den folgenden VBA-Code und fügen Sie ihn in ein Standardmodul ein.
    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. Lassen Sie das Debug-Fenster geöffnet, um die Ausgabe dort zu drucken.
  10. Führen Sie den Code wie zuvor aus und geben Sie Werte für Boden- und Fliesenabmessungen für drei Räume ein.

Wie Sie aus dem obigen Code ersehen können, gehen beide Werte der Room- und Tile-Dimensionen nebeneinander in dieselbe Class Object Array-Instanz.

Das obige Programm ist eine Demo, die nur für drei Wertesätze innerhalb von For ausgeführt wird. . . Nächste Schleife. Es kann mit einer bedingten Schleife modifiziert werden, die so oft ausgeführt wird, bis ein bedingter Unterbrechungscode das Programm beendet.

Das Programm kann modifiziert werden, um jeden Satz von Datenwerten und Berechnungsergebnissen in einer Tabelle zur späteren Bezugnahme zu speichern.

Eine Wrapper-Klasse ist ein Container Klasse für Instanzen anderer Klassen, Datenstrukturen oder Instanzsammlungen anderer Objekte. Hier haben wir es verwendet, um zwei Instanzen derselben Klasse Object.

zu speichern

Liste aller Links zu diesem Thema.

  1. MS-Access-Klassenmodul und VBA
  2. MS-Access-VBA-Klassenobjekt-Arrays
  3. MS-Access-Basisklasse und abgeleitete Objekte
  4. VBA-Basisklasse und abgeleitete Objekte-2
  5. Basisklasse und abgeleitete Objektvarianten
  6. Ms-Access Recordset und Klassenmodul
  7. Zugriff auf Klassenmodul und Wrapper-Klassen
  8. Umwandlung der Wrapper-Klassenfunktionalität
  9. Grundlagen von MS-Access und Erfassungsobjekten
  10. MS-Access-Klassenmodul und Sammlungsobjekt
  11. Tabellensätze in Sammlungsobjekt und Formular
  12. Wörterbuchobjekt-Grundlagen
  13. Wörterbuchobjekt-Grundlagen-2
  14. Sortieren von Dictionary-Objektschlüsseln und -Elementen
  15. Datensätze aus Wörterbuch in Formular anzeigen
  16. Klassenobjekte als Wörterbucheinträge hinzufügen
  17. Klassenobjekte als Wörterbucheinträge hinzufügen
  18. Klassenobjekt-Wörterbuchelement auf Formular aktualisieren