Access
 sql >> Database >  >> RDS >> Access

Modulo di classe di accesso e classi wrapper

Introduzione.

A volte è necessario creare un'istanza di un particolare modulo di classe più di una volta, per utilizzare un insieme di valori simile per una particolare applicazione.

Ad esempio, il nostro modulo di classe ClsArea, che abbiamo progettato per calcolare l'area del tappeto di Rooms, è un candidato per applicazioni simili. Supponiamo di voler scoprire quante piastrelle per pavimento abbiamo bisogno di posare in una stanza, quindi dovremmo essere in grado di inserire anche i valori di Lunghezza e Larghezza di Tile, oltre ai valori di dimensione di Floor. Poiché sia ​​Floor che Tile hanno valori di proprietà simili come input, possiamo utilizzare due istanze di ClsArea Class Module, un'istanza per l'area FLOOR e la seconda istanza per l'area TILE. Floor-Area / Tile-Area fornisce il numero totale di piastrelle per una stanza particolare.

Due istanze dello stesso modulo di classe.

Possiamo farlo creando due diverse istanze del modulo di classe ClsArea nel programma del modulo standard se c'è solo una stanza.

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

Gestire una serie di oggetti.

Ma cosa succede se dobbiamo applicare il metodo sopra per una serie di più stanze con dimensioni o colori di piastrelle diversi? La risposta è creare un nuovo modulo di classe con due istanze della stessa ClsArea Classe, un'istanza per Floor e l'altro per Tessere Proprietà. Entrambe le istanze sono racchiuse in un nuovo modulo di classe.

Facciamolo.

  1. Apri il tuo database e visualizza la finestra di modifica del codice (ALT+F11).
  2. Seleziona il Modulo del corso da Inserisci Menù.
  3. Cambia il Nome Valore della proprietà su ClsTiles .
  4. Copia e incolla il seguente codice VBA nel modulo di classe ClsTiles e salva il codice:
    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
    

    Entrambe le istanze, pFLOOR e pTILES sono dichiarate come proprietà private dell'oggetto classe ClsTiles.

    La Inizializzazione_Classe() Subroutine istanzia entrambi gli oggetti in memoria quando ClsTiles Il modulo di classe viene istanziato nel programma utente.

    Il Class_Terminate() la subroutine rimuove entrambe le istanze (pFLOOR e pTILES) dalla memoria quando l'istanza del modulo di classe ClsTiles è impostata su Nothing nel programma utente.

    Il Ottieni e Imposta Le procedure di proprietà consentono il recupero e l'assegnazione di valori, rispettivamente da e verso l'istanza pFLOOR, nell'oggetto classe ClsTiles.

    La successiva procedura Get e Set Property consente le stesse operazioni nell'istanza pTILES della classe ClsArea.

    Abbiamo aggiunto una nuova funzione NoOfTiles() nel nuovo Modulo Classe, per calcolare il numero di piastrelle, in base alla superficie e alla dimensione piastrella.

    Scriviamo un Programma e impariamo l'uso di più istanze dello stesso Oggetto Classe, in un nuovo Modulo Classe:ClsTiles.

  5. Copia e incolla il seguente codice VBA in un modulo standard:
    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. Tieni aperta la finestra di debug (CTRL+G) per stampare i dati del test.
  7. Fai clic da qualche parte nel mezzo del codice VBA e premi F5 Chiave per eseguire il codice. Il risultato viene stampato nella finestra di debug.

    Se vuoi calcolare il fabbisogno di piastrelle di più stanze o stanze di più piani di un grattacielo, dovresti eseguire il programma sopra più volte e annotare i valori, il che è praticamente molto difficile.

    Trovare i requisiti per le tessere di più stanze.

    Ora, scriviamo un altro programma per trovare i requisiti Tile di diverse stanze, con una matrice di ClsTiles Oggetti inserendo i valori della Proprietà direttamente dalla tastiera.

  8. Copia e incolla il seguente codice VBA in un modulo standard.
    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. Tieni aperta la finestra di debug per stampare l'output lì.
  10. Esegui il codice come prima e inserisci i valori per le dimensioni del pavimento e delle piastrelle per tre stanze.

Come puoi vedere dal codice sopra, entrambi i valori delle dimensioni Room e Tile vanno nella stessa istanza di Class Object Array, fianco a fianco.

Il programma sopra è una demo che funziona solo per tre set di valori all'interno di For. . . Ciclo successivo. Può essere modificato con un ciclo condizionale che viene eseguito per un numero di volte richiesto fino a quando un codice di interruzione condizionale termina il programma.

Il programma può essere modificato per salvare ogni insieme di valori di dati e risultati di calcolo in una tabella per riferimento futuro.

Una classe wrapper è un Contenitore Classe per istanze di altre classi, strutture dati o raccolta di istanze di altri oggetti. Qui l'abbiamo usato per contenere due istanze della stessa classe Object.

Elenco di tutti i collegamenti su questo argomento.

  1. Modulo di classe MS-Access e VBA
  2. Matrici di oggetti di classe VBA MS-Access
  3. Classe base MS-Access e oggetti derivati
  4. Classe base VBA e oggetti derivati-2
  5. Classe base e varianti di oggetti derivati
  6. Recordset Ms-Access e modulo di classe
  7. Accedi al modulo di classe e alle classi wrapper
  8. Trasformazione della funzionalità della classe wrapper
  9. Nozioni di base su Ms-Access e Collection Object
  10. Modulo di classe Ms-Access e oggetto Collection
  11. Record di tabella nell'oggetto e nella forma della raccolta
  12. Nozioni di base sugli oggetti del dizionario
  13. Nozioni di base sugli oggetti del dizionario-2
  14. Ordinamento delle chiavi e degli elementi degli oggetti del dizionario
  15. Visualizza record dal dizionario al modulo
  16. Aggiungi oggetti classe come elementi del dizionario
  17. Aggiungi oggetti classe come elementi del dizionario
  18. Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo