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.
- Apri il tuo database e visualizza la finestra di modifica del codice (ALT+F11).
- Seleziona il Modulo del corso da Inserisci Menù.
- Cambia il Nome Valore della proprietà su ClsTiles .
- 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.
- 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
- Tieni aperta la finestra di debug (CTRL+G) per stampare i dati del test.
- 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.
- 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
- Tieni aperta la finestra di debug per stampare l'output lì.
- 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.
- Modulo di classe MS-Access e VBA
- Matrici di oggetti di classe VBA MS-Access
- Classe base MS-Access e oggetti derivati
- Classe base VBA e oggetti derivati-2
- Classe base e varianti di oggetti derivati
- Recordset Ms-Access e modulo di classe
- Accedi al modulo di classe e alle classi wrapper
- Trasformazione della funzionalità della classe wrapper
- Nozioni di base su Ms-Access e Collection Object
- Modulo di classe Ms-Access e oggetto Collection
- Record di tabella nell'oggetto e nella forma della raccolta
- Nozioni di base sugli oggetti del dizionario
- Nozioni di base sugli oggetti del dizionario-2
- Ordinamento delle chiavi e degli elementi degli oggetti del dizionario
- Visualizza record dal dizionario al modulo
- Aggiungi oggetti classe come elementi del dizionario
- Aggiungi oggetti classe come elementi del dizionario
- Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo