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

Classe base di MS-Access e oggetti derivati

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.

  1. Modulo di classe MS-Access e VBA.
  2. 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.

  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. Aggiorna l'elemento del dizionario degli oggetti della classe nel modulo