Einführung.
Wenn Sie die früheren Beiträge zum Microsoft Access-Klassenmodul nicht gesehen haben, gehen Sie sie bitte durch, bevor Sie fortfahren. Die Links sind unten angegeben.
- MS-Access-Klassenmodul und VBA.
- MS-Access VBA-Klassenobjekt-Array.
Die ClsArea Klasse als Basisklasse in einem anderen Klassenobjekt ausgeführt werden kann, kann die von der Basisklasse durchgeführte Berechnung als Teil der Berechnungen des neuen Objekts verwendet werden. Beispielsweise kann es Teil eines Objekts sein, das das Volumen von etwas berechnet,
Die dbl in dblLength und dblWidth Eigenschaftsprozedurnamen für Get/Let Prozeduren sind einfach ein Hinweis darauf, dass das Klassenobjekt die Längen- und Breitenwerte in Zahlen mit doppelter Genauigkeit erwartet. Wenn wir die Property Procedure Names in Quantity und UnitPrice ändern, ergibt sich der erste Wert multipliziert mit dem zweiten Wert in ähnlicher Weise für den Gesamtpreis eines Artikels.
Es bedeutet einfach, dass Sie die ClsArea-Klasse als Basisklasse verwenden können, wo immer Sie das Ergebnis des ersten Werts multipliziert mit dem zweiten Wert benötigen, z. B. Gesamtpreis * Steuersatz, um den Steuerbetrag zu berechnen, oder Gesamtpreis * Rabattsatz, um den Rabattbetrag zu ermitteln und so weiter.
Obwohl wir ein einfaches Klassenmodul entwickelt haben, kann es Teil vieler anderer abgeleiteter Klassen sein. Die Möglichkeiten sind offen für Ihre Vorstellungskraft und Kreativität.
Unsere ClsArea-Klasse berechnet die Fläche von Materialien, Räumen oder ähnlichen Elementen nur mit Längen- und Breiteneigenschaften. Es berechnet nicht die Fläche des Dreiecks oder des Kreises. Es kann jedoch Teil eines neuen Klassenobjekts sein, das das Volumen von Räumen und Lagern berechnet, um Lagerkapazität zu finden. Dafür benötigen wir einen weiteren Wert Höhe des Raums, des Lagers usw.
Die Volumenklasse:ClsVolume.
Lassen Sie uns ein neues Klassenmodul ClsVolume, erstellen Verwenden der ClsArea als Basisklasse. Fügen Sie ein Klassenmodul ein und ändern Sie seinen Namen Eigenschaft zu ClsVolume . Geben Sie den folgenden Code ein oder kopieren Sie ihn und fügen Sie ihn in das Klassenmodul ein.
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
Der Code des ClsVolume-Klassenobjekts ist noch nicht vollständig. Lassen Sie uns den Code Zeile für Zeile untersuchen. In der dritten Zeile als Privateigentum deklariert p_Area des ClsArea-Klassenobjekts.
Die nächste Zeile deklariert eine Private Property mit dem Namen p_Height vom Datentyp Double.
Die Unterroutinen Class_Initialize() und Class_Terminate().
Die nächsten beiden Unterroutinen (Initialize() und Beenden() ) sind hier sehr wichtig.
Die Initialize() führt das ClsArea-Objekt aus und instanziiert es im Speicher, wenn wir die ClsVolume-Klasse verwenden und instanziieren Objekt in unserem Standardmodulprogramm.
Wenn wir die Anweisung Set ClsVolume =Nothing ausführen im Standardmodulprogramm, um das ClsVolume-Objekt aus dem Speicher zu löschen, das Terminate() Die Sub-Routine wird ausgeführt und gibt den vom ClsArea-Objekt belegten Speicherplatz frei.
Die Eigenschaft Get dblHeight Die Prozedur gibt den Wert von p_Height zurück Eigentum an das aufrufende Programm.
Die Eigenschaft Lassen Sie dblHeight Die Prozedur validiert den an NewValue übergebenen Wert -Parameter und weist ihn der privaten Eigenschaft p_Height zu .
Die öffentliche Funktion Volume() berechnet das Volumen, indem sie p_Area.Area() aufruft Funktion und der zurückgegebene Flächenwert wird mit p_Height multipliziert, um das Volumen zu berechnen, mit dem Ausdruck:Volume =p_Area.Area * p_Height. Aber bevor wir diese Anweisung ausführen, führen wir eine Validierungsprüfung durch, um sicherzustellen, dass die Funktion p_Area.Area() einen Wert größer als Null zurückgibt, was darauf hinweist, dass die Eigenschaften p_Area.dblLength, p_Area.dblWidth gültige Werte enthalten und der Wert der Eigenschaft p_Height größer als ist Null.
Hinweis: Da die p_Area Objekt der Klasse ClsArea ist als Privat definiert Eigenschaft der ClsVolume-Klasse müssen wir ihre Eigenschaften (strDesc, dblLength, dblWidth und Bereich() Funktion) für die Außenwelt sichtbar für Get/Let Operationen und um den Bereichswert zurückzugeben. Das bedeutet, dass wir Get/Let-Property-Prozeduren für die Eigenschaften strDesc, dblLength, dblWidth und Area() des ClsArea-Klassenobjekts auch im ClsVolume-Klassenmodul definieren müssen.
Die Let/Get-Eigenschaftsprozeduren.
Fügen Sie die folgende Eigenschaft Get/Let hinzu Prozeduren und Area() Funktion zum Modulcode der ClsVolume-Klasse:
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
Überprüfen Sie die strDesc()-Property-Prozeduren Codezeilen abrufen/überlassen. Die Verwendung des Prozedurnamens strDesc ist einfach eine Frage der Wahl, wenn Sie einen anderen Namen verwenden möchten, können Sie dies gerne tun. Aber der ursprüngliche Eigenschaftsname, den wir in der ClsArea-Klasse verwendet haben, ist strDesc. Die Verwendung dieses ursprünglichen Namens hier erinnert uns an die Beziehung zum ursprünglichen ClsArea-Klassenobjekt.
In der nächsten Eigenschaftsprozedur Get dblLength() der Ausdruck rechts von = Zeichen p_Area.dblLength liest den im ClsArea-Klassenobjekt gespeicherten dblLength-Wert und kehrt zum aufrufenden Programm zurück.
Die Let-Eigenschaftsprozedur weist den Parameterwert in der NewValue-Variablen der p_Area.dblLength-Eigenschaft des ClsArea-Klassenobjekts zu. Hier führen wir keine Validierungsprüfung des empfangenen Werts in der NewValue-Parametervariablen durch. Die Validierungsprüfung wird innerhalb der ClsArea-Klasse selbst durchgeführt, wenn wir p_Area.dblLength den Wert zuweisen Eigentum.
In ähnlicher Weise werden die Get/Let-Property-Prozeduren auch für die p_Area.dblWidth-Property hinzugefügt,
Als nächstes die p_Area.Area() Die Funktion wird durch das ClsVolume-Klassenobjekt für das aufrufende Programm sichtbar gemacht.
Der von ClsVolume abgeleitete Klassenmodulcode.
Der vollständige Code des ClsVolume-Klassenmoduls ist unten angegeben.
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
Ich weiß, was Sie jetzt denken:„Das ist doppelte Arbeit, es ist schön, wenn wir diese Schritte der Wiederholung von ClsArea-Property-Prozeduren in der ClsVolume-Klasse irgendwie überspringen können“. Oder sagen wir, wir hätten die Eigenschaft dblWidth in der ClsArea selbst hinzufügen und die Methoden Area() und Volume() von dort selbst ausführen können, richtig?
Der springende Punkt hier ist, wie ein Basisklassenobjekt Teil des Entwurfs eines anderen Klassenobjekts werden kann.
Erinnern Sie sich an die ganze Idee, ein wiederverwendbares Klassenmodulobjekt zu entwerfen ist, dass die Hauptprogramme, die das Klassenobjekt verwenden, einfach sein werden und die in das Klassenobjekt eingebauten Feinheiten verborgen bleiben.
Ja, wir können es auf mehr als eine Weise tun, auch mit einem kompakten Code. Wir werden sie später untersuchen, aber lassen Sie uns vorerst mit unserem ursprünglichen Plan fortfahren.
Das Hauptprogramm, das die ClsVolume-Klasse verwendet.
Lassen Sie uns unsere neue ClsVolume-Klasse im Hauptprogramm im Standardmodul testen. Der Beispielcode ist unten angegeben.
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
Sie können sehen, wie einfach das Hauptprogramm ohne die Druckzeilen ist?
Kopieren Sie den Code und fügen Sie ihn in ein Standardmodul ein. Drücken Sie die Tastenkombination Strg+G, um das Debug-Fenster anzuzeigen, wenn es sich nicht bereits im geöffneten Zustand befindet. Klicken Sie irgendwo in die Mitte des Codes und drücken Sie F5 Schlüssel zum Ausführen des Codes. Die Beispielausgabe im Debug-Fenster ist unten dargestellt.
Description Length Width Height Area Volume Warehouse 25 30 10 750 7500
Beschreibung Länge Breite Höhe Fläche Volumen
Lager 25 30 10 750 7500
Leistungstests für Validierungsprüfungen.
Wir werden Tests durchführen, um zu sehen, ob die Validierungsprüfung der Eingabewerte der ClsArea-Klasse der Basisklasse funktioniert, wenn Werte über die ClsVolume-Klasse an sie übergeben werden. Wir haben auch einige Validierungsprüfungen in den Funktionen Area() und Volume() durchgeführt.
Probieren wir sie nacheinander aus:
Zuerst übergeben wir einen negativen Wert an die Eigenschaft ClsArea.dblLength durch die ClsVolume-Klasse. Es sollte die Fehlermeldung auslösen und die Funktion Inputbox() innerhalb der Do While…-Schleife öffnen, um den richtigen Wert einzugeben.
1. Ersetzen Sie den Wert 25 in der Zeile Vol.dblLength =25 , mit –5 und drücken Sie F5 Schlüssel zum Ausführen des Codes.
Die Validierungsprüfung löst den Fehler aus und fragt nach einem Wert größer als Null. Geben Sie einen Wert größer als 0 ein. Stellen Sie danach den Wert 25 in der Zeile wieder her und ersetzen Sie –5.
2. Deaktivieren Sie die Zeile Vol.dblHeight =10, indem Sie ein Kommentarsymbol (‘) wie gezeigt am Anfang der Zeile einfügen:‘Vol.dblHeight =10 . Drücken Sie nach der Änderung die Taste F5, um den Code auszuführen.
Da der Eigenschaft kein Eingabewert übergeben wird, generiert die Vol.Volume()-Funktion einen Fehler, der besagt, dass alle drei Eigenschaften:dblLength, dblWidth und dblHeight Werte enthalten sollten, um die Volume-Funktion auszuführen.
Ebenso können Sie auch die Leistung der Funktion Vol.Area() überprüfen.
Wir können eine Datendruckfunktion erstellen und das ClsVolume-Objekt als Parameter an die Funktion übergeben und die Werte im Debug-Fenster drucken.
Der geänderte Code der Hauptprogramme.
Der geänderte Code für beide Programme ist unten angegeben:
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
Nächste Woche bauen wir das Volume Class Object mit weniger Code.
Die Links aller Seiten zu diesem Thema.
- MS-Access-Klassenmodul und VBA
- MS-Access-VBA-Klassenobjekt-Arrays
- MS-Access-Basisklasse und abgeleitete Objekte
- VBA-Basisklasse und abgeleitete Objekte-2
- Basisklasse und abgeleitete Objektvarianten
- Ms-Access Recordset und Klassenmodul
- Zugriff auf Klassenmodul und Wrapper-Klassen
- Umwandlung der Wrapper-Klassenfunktionalität
- Grundlagen von MS-Access und Erfassungsobjekten
- MS-Access-Klassenmodul und Sammlungsobjekt
- Tabellensätze in Sammlungsobjekt und Formular
- Wörterbuchobjekt-Grundlagen
- Wörterbuchobjekt-Grundlagen-2
- Sortieren von Dictionary-Objektschlüsseln und -Elementen
- Datensätze aus Wörterbuch in Formular anzeigen
- Klassenobjekte als Wörterbucheinträge hinzufügen
- Klassenobjekt-Wörterbuchelement auf Formular aktualisieren