Introduzione.
Se non hai visto i post precedenti sul modulo di classe di Microsoft Access, esaminali prima di continuare, i collegamenti sono riportati di seguito.
- Modulo di classe MS-Access e VBA.
- Matrice di oggetti di classe VBA MS-Access.
La ClsArea La classe può funzionare come una classe base in un altro oggetto classe, il calcolo eseguito dalla classe base può essere utilizzato come parte dei calcoli del nuovo oggetto. Ad esempio, può essere parte di un Oggetto che calcola il Volume di qualcosa,
Il dbl in dblLength e dblWidth Nomi delle procedure delle proprietà per Ricevi/Consenti Le procedure sono semplicemente un'indicazione che l'oggetto classe prevede i valori di lunghezza e larghezza in numeri a doppia precisione. Allo stesso modo, se cambiamo i nomi delle procedure della proprietà in Quantità e PrezzoUnitario, il primo valore moltiplicato per il secondo valore ci dà il prezzo totale di alcuni articoli.
Significa semplicemente che puoi utilizzare la Classe ClsArea come classe base, ovunque sia necessario il risultato del primo valore moltiplicato per il secondo valore, come Prezzo totale * Aliquota fiscale per calcolare l'importo dell'imposta o Prezzo totale * Tasso di sconto per trovare l'importo dello sconto e così via.
Anche se abbiamo sviluppato un semplice modulo di classe, può far parte di molte altre classi derivate. Le possibilità sono aperte alla tua immaginazione e creatività.
La nostra classe ClsArea calcola l'area di materiali, stanze o articoli simili solo con le proprietà di lunghezza e larghezza. Non calcola l'area del triangolo o del cerchio. Ma può far parte di un nuovo oggetto di classe che calcola il volume di stanze, magazzini per trovare la capacità di archiviazione. Per questo, abbiamo bisogno di un altro valore Altezza della stanza, Magazzino, ecc.
La classe di volume:ClsVolume.
Creiamo un nuovo modulo di classe ClsVolume, utilizzando ClsArea come Classe Base. Inserisci un modulo di classe e cambia il suo Nome Proprietà a ClsVolume . Digita o copia e incolla il seguente codice nel modulo di classe.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (p_Height > 0) Then Volume = p_Area.Area * p_Height Else MsgBox "Enter Valid Values for Length,Width and Height.", , "ClsVolume" End If End Function
Il codice dell'oggetto della classe ClsVolume non è ancora completo. Esaminiamo il codice riga per riga. Nella terza riga dichiarata come Proprietà Privata p_Area dell'oggetto classe ClsArea.
La riga successiva dichiara una proprietà privata con il nome p_Height di tipo dati Double.
Le sotto-routine Class_Initialize() e Class_Terminate().
Le due sotto-routine successive (Inizializza() e Termina() ) sono molto importanti qui.
Il Inizializza() esegue e crea un'istanza dell'Oggetto ClsArea in memoria quando utilizziamo e istanziamo la Classe ClsVolume Oggetto nel nostro programma Modulo Standard.
Quando eseguiamo l'istruzione Set ClsVolume =Nothing nel programma Standard Module, per cancellare dalla memoria l'oggetto ClsVolume, il Terminate() La sub-routine esegue e rilascia lo spazio di memoria occupato dall'oggetto ClsArea.
La proprietà Ottieni dblHeight La procedura restituisce il valore da p_Height Proprietà al Programma chiamante.
La proprietà Let dblHeight La procedura convalida il valore passato a NewValue parametro e lo assegna nella proprietà privata p_Height .
La funzione pubblica Volume() calcola il volume chiamando p_Area.Area() La funzione e il valore dell'area restituito vengono moltiplicati per p_Height per calcolare il volume, con l'espressione:Volume =p_Area.Area * p_Height. Ma, prima di eseguire questa istruzione, stiamo eseguendo un controllo di convalida per assicurarci che la funzione p_Area.Area() restituisca un valore maggiore di zero, indicando che le proprietà p_Area.dblLength, p_Area.dblWidth contengono valori validi e il valore della proprietà p_Height è maggiore di zero.
Nota: Dal momento che, la p_Area Oggetto della Classe ClsArea è definito come Privato Proprietà della classe ClsVolume dobbiamo creare le sue proprietà (strDesc, dblLength, dblWidth e Area() funzione) visibile al mondo esterno per Ricevi/Consenti Operazioni e per restituire il valore dell'area. Ciò significa che dobbiamo definire le procedure di proprietà Get/Let per la funzione strDesc, dblLength, dblWidth e Area() dell'oggetto classe ClsArea anche nel modulo classe ClsVolume.
Le procedure di locazione/ottenimento di proprietà.
Aggiungi la seguente proprietà Get/Let Procedure e Area() funzione al codice del modulo di classe ClsVolume:
Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Controllare le procedure della proprietà strDesc() Get/Let righe di codice. L'utilizzo del nome della procedura strDesc è semplicemente una questione di scelta, se vuoi usare un nome diverso sei il benvenuto. Ma il nome della proprietà originale che abbiamo usato nella classe ClsArea è strDesc. L'uso di quel nome originale qui ci ricorda la relazione con l'oggetto classe ClsArea originale.
Nella successiva procedura della proprietà Get dblLength(), l'espressione a destra di = segno p_Area.dblLength legge il valore dblLength memorizzato nell'oggetto classe ClsArea e ritorna al programma chiamante.
La procedura della proprietà Let assegna il valore del parametro nella variabile NewValue alla proprietà p_Area.dblLength dell'oggetto classe ClsArea. Qui, non stiamo eseguendo alcun controllo di convalida sul valore ricevuto nella variabile del parametro NewValue. Il controllo di convalida verrà eseguito all'interno della classe ClsArea stessa quando assegniamo il valore a p_Area.dblLength proprietà.
Allo stesso modo, le procedure della proprietà Get/Let vengono aggiunte anche per la proprietà p_Area.dblWidth,
Successivamente, p_Area.Area() La funzione è resa visibile tramite l'oggetto classe ClsVolume al programma chiamante.
Il codice del modulo di classe derivato da ClsVolume.
Il codice completo del modulo di classe ClsVolume è riportato di seguito.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() ‘Open ClsArea Object in Memory with the name p_Area Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() ‘Removes the Object p_Area from Memory Set p_Area = Nothing ‘ End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (Me.dblHeight > 0) Then Volume = p_Area.Area * Me.dblHeight Else MsgBox "Enter Valid Values for Length,Width and Height.",vbExclamation , "ClsVolume" End If End Function ‘ClsArea Class Property Procedures and Method are exposed here Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Lo so, cosa stai pensando ormai:come "questo è un doppio lavoro, è bello se possiamo, in qualche modo, saltare questi passaggi di ripetere nuovamente le procedure della proprietà ClsArea nella classe ClsVolume". O diciamo, avremmo potuto aggiungere la proprietà dblWidth nella ClsArea stessa ed eseguire i metodi Area() e Volume() da lì, giusto?
Il punto qui è che come un oggetto di classe base può diventare parte della progettazione di un altro oggetto di classe.
Ricorda, l'idea di progettare un Oggetto modulo di classe riutilizzabile è che i programmi principali, che utilizzano l'oggetto Class, saranno semplici e le complessità integrate nell'oggetto Class rimarranno nascoste.
Sì, possiamo farlo in più di un modo, anche con un codice compatto. Li esploreremo in seguito, ma per ora continuiamo con il nostro piano originale.
Il programma principale che utilizza la classe ClsVolume.
Testiamo la nostra nuova classe ClsVolume nel programma principale nel modulo standard. Il codice di esempio è riportato di seguito.
Public Sub TestVolume() Dim vol As ClsVolume Set vol = New ClsVolume vol.strDesc = "Warehouse" vol.dblLength = 25 vol.dblWidth = 30 vol.dblHeight = 10 Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With vol Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume() End With End Sub
Puoi vedere quanto è semplice il programma principale, senza le righe di stampa?
Copia e incolla il codice in un modulo standard. Premere i tasti Ctrl+G per visualizzare la finestra di debug se non è già nello stato aperto. Fai clic da qualche parte nel mezzo del codice e premi F5 Chiave per eseguire il codice. L'output di esempio nella finestra di debug è mostrato di seguito.
Description Length Width Height Area Volume Warehouse 25 30 10 750 7500
Descrizione Lunghezza Larghezza Altezza Area Volume
Magazzino 25 30 10 750 7500
Test di verifica delle prestazioni dei controlli di convalida.
Eseguiremo dei test per vedere che il controllo di convalida del valore di input della classe ClsArea della classe base funziona quando i valori vengono passati ad essa tramite la classe ClsVolume. Abbiamo eseguito alcuni controlli di validazione anche nelle funzioni Area() e Volume().
Proviamoli uno per uno:
Innanzitutto, passeremo un valore negativo alla proprietà ClsArea.dblLength tramite la classe ClsVolume. Dovrebbe attivare il messaggio di errore e aprire la funzione Inputbox() all'interno del ciclo Do While... per inserire il valore corretto.
1. Sostituisci il valore 25, nella riga Vol.dblLength =25 , con –5 e premi F5 Chiave per eseguire il codice.
Il controllo di convalida attiverà l'errore e richiederà un valore maggiore di Zero. Immettere un valore maggiore di 0. Successivamente ripristinare il valore 25 nella riga, sostituendo –5.
2. Disattiva la riga Vol.dblHeight =10 inserendo un simbolo di commento (') all'inizio della riga come mostrato:'Vol.dblHeight =10 . Dopo la modifica premere il tasto F5 per eseguire il codice.
Poiché non c'è alcun valore di input passato alla proprietà, la funzione Vol.Volume() genererà un errore dicendo che tutte e tre le proprietà:dblLength, dblWidth e dblHeight, dovrebbero avere valori in esse per eseguire la funzione Volume.
Allo stesso modo, puoi controllare anche le prestazioni della funzione Vol.Area().
Possiamo creare una funzione di stampa dei dati e passare l'oggetto ClsVolume come parametro alla funzione e stampare i valori nella finestra di debug.
Il codice modificato dei programmi principali.
Il codice modificato per entrambi i programmi è riportato di seguito:
Public Sub TestVolume() Dim Vol As ClsVolume Set Vol = New ClsVolume Vol.strDesc = "Warehouse" Vol.dblLength = 25 Vol.dblWidth = 30 Vol.dblHeight = 10 Call CVolPrint(Vol) Set Vol = Nothing End Sub
Public Sub CVolPrint(volm As ClsVolume) Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With volm Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area, .Volume End With End Sub
La prossima settimana costruiremo l'oggetto classe di volume con meno codice.
I link di tutte le pagine 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
- Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo