Inleiding.
Als je de eerdere berichten over Microsoft Access Class Module niet hebt gezien, neem ze dan door voordat je verder gaat, de links staan hieronder.
- MS-Access Class-module en VBA.
- MS-Access VBA Class Object Array.
De ClsArea Klasse kan optreden als een basisklasse in een ander klasseobject, de berekening die door de basisklasse wordt uitgevoerd, kan worden gebruikt als onderdeel van de berekeningen van het nieuwe object. Het kan bijvoorbeeld deel uitmaken van een object dat het volume van iets berekent,
De dbl in dblLength en dblWidth Namen van eigenschapsprocedures voor Get/Let Procedures zijn gewoon een indicatie dat het klasseobject de lengte- en breedtewaarden in dubbele precisiegetallen verwacht. Evenzo, als we de namen van de eigendomsprocedures wijzigen in Hoeveelheid en Prijs per eenheid, geeft de eerste waarde vermenigvuldigd met de tweede waarde ons de totale prijs van een item.
Het betekent simpelweg dat u de ClsArea-klasse als basisklasse kunt gebruiken, waar u ook het resultaat van de eerste waarde nodig hebt, vermenigvuldigd met de tweede waarde, zoals Totale prijs * Belastingtarief om het belastingbedrag te berekenen of Totale prijs * Kortingspercentage om het kortingsbedrag te vinden enzovoort.
Ook al hebben we een eenvoudige klassenmodule ontwikkeld, deze kan deel uitmaken van vele andere afgeleide klassen. De mogelijkheden staan open voor uw fantasie en creativiteit.
Onze ClsArea-klasse berekent alleen de oppervlakte van materialen, kamers of vergelijkbare items met de eigenschappen Lengte en Breedte. Het berekent niet de oppervlakte van de driehoek of cirkel. Maar het kan deel uitmaken van een nieuw klasseobject dat het volume van kamers en magazijnen berekent om opslagcapaciteit te vinden. Daarvoor hebben we nog een waarde nodig Hoogte van kamer, magazijn, enz.
De volumeklasse:ClsVolume.
Laten we een nieuwe klasmodule maken ClsVolume, met behulp van de ClsArea als basisklasse. Voeg een klasmodule in en wijzig de Naam Eigenschap naar ClsVolume . Typ of kopieer en plak de volgende code in de klasmodule.
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
De code van het ClsVolume Class Object is nog niet compleet. Laten we de code regel voor regel bekijken. In de derde regel aangegeven als privé-eigendom p_Area van ClsArea Class Object.
De volgende regel verklaart een privé-eigendom met de naam p_Height van het gegevenstype Double.
De Class_Initialize() en Class_Terminate() subroutines.
De volgende twee subroutines (Initialize() en Beëindigen() ) zijn hier erg belangrijk.
De Initialize() draait en instantieert het ClsArea Object in het geheugen wanneer we de ClsVolume Class . gebruiken en instantiëren Object in ons Standard Module-programma.
Wanneer we de instructie uitvoeren Set ClsVolume =Nothing in het Standard Module-programma, om het ClsVolume-object uit het geheugen te wissen, de Terminate() Sub-Routine wordt uitgevoerd en maakt de geheugenruimte vrij die wordt ingenomen door het ClsArea-object.
De eigenschap Krijg dblHeight Procedure retourneert de waarde van p_Height Eigendom van het aanroepende programma.
De eigenschap Laat dblHeight Procedure valideert de waarde die is doorgegeven aan de NewValue parameter en wijst deze toe aan de privé-eigenschap p_Height .
De Public Function Volume() berekent het Volume door de p_Area.Area() aan te roepen Functie en de geretourneerde oppervlaktewaarde worden vermenigvuldigd met p_Height om Volume te berekenen, met de uitdrukking:Volume =p_Area.Area * p_Height. Maar voordat we deze instructie uitvoeren, voeren we een validatiecontrole uit om ervoor te zorgen dat de functie p_Area.Area() een waarde groter dan nul retourneert, wat aangeeft dat p_Area.dblLength, p_Area.dblWidth-eigenschappen geldige waarden bevatten en dat de eigenschap p_Height groter is dan nul.
Opmerking: Sinds de p_Area Object van klasse ClsArea is gedefinieerd als Privé Eigenschap van ClsVolume Class, we moeten de eigenschappen ervan maken (strDesc, dblLength, dblWidth en Area() functie) zichtbaar voor de buitenwereld voor Get/Let Bewerkingen en om Gebiedswaarde terug te geven. Dat betekent dat we Get/Let-eigenschapsprocedures moeten definiëren voor strDesc, dblLength, dblWidth Properties en Area()-functies van ClsArea Class Object in ClsVolume Class Module.
De Let/Get Property-procedures.
Voeg de volgende eigenschap toe Krijgen/laten Procedures en Area() functie naar de ClsVolume Class Module Code:
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
Controleer de strDesc() Property procedures Get/Let regels code. Het gebruik van Procedurenaam strDesc is gewoon een kwestie van kiezen, als je een andere naam wilt gebruiken ben je welkom. Maar de oorspronkelijke eigenschapsnaam die we in de ClsArea-klasse hebben gebruikt, is strDesc. Het gebruik van die originele naam hier herinnert ons aan de relatie met het originele ClsArea Class Object.
In de volgende Get dblLength() Property Procedure, de expressie rechts van de = teken p_Area.dblLength leest de dblLength-waarde die is opgeslagen in het ClsArea Class Object en keert terug naar het aanroepende programma.
De Let Property Procedure wijst de parameterwaarde in de NewValue-variabele toe aan de p_Area.dblLength Property van ClsArea Class Object. Hier voeren we geen validatiecontrole uit op de ontvangen waarde in de parametervariabele NewValue. De validatiecontrole wordt uitgevoerd binnen de ClsArea-klasse zelf wanneer we de waarde toewijzen aan p_Area.dblLength eigendom.
Op dezelfde manier worden de Get/Let Property Procedures ook toegevoegd voor de p_Area.dblWidth Property,
Vervolgens de p_Area.Area() Functie wordt zichtbaar gemaakt via het ClsVolume Class Object voor het aanroepende programma.
De van ClsVolume afgeleide klassemodulecode.
De ingevulde code van de ClsVolume Class Module wordt hieronder gegeven.
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
Ik weet wat je nu denkt:zoals "dit is dubbel werk, het is leuk als we deze stappen van het herhalen van ClsArea Property-procedures in de ClsVolume-klasse op de een of andere manier kunnen overslaan". Of laten we zeggen, we hadden de eigenschap dblWidth in de ClsArea zelf kunnen toevoegen en de methoden Area() en Volume() daar zelf kunnen uitvoeren, toch?
Het hele punt hier is dat een basisklasseobject onderdeel kan worden van het ontwerpen van een ander klasseobject.
Onthoud het hele idee van het ontwerpen van een Herbruikbaar Class Module Object is dat de hoofdprogramma's, die het Class Object gebruiken, eenvoudig zullen zijn en dat de ingewikkeldheden die in het Class Object zijn ingebouwd verborgen blijven.
Ja, we kunnen het op meer dan één manier doen, ook met een compacte code. We zullen ze later onderzoeken, maar laten we voorlopig doorgaan met ons oorspronkelijke plan.
Het hoofdprogramma dat de ClsVolume-klasse gebruikt.
Laten we onze nieuwe ClsVolume-klasse testen in het hoofdprogramma in de standaardmodule. De voorbeeldcode wordt hieronder gegeven.
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
Kun je zien hoe eenvoudig het hoofdprogramma is, zonder de druklijnen?
Kopieer en plak de code in een standaardmodule. Druk op de Ctrl+G-toetsen om het foutopsporingsvenster weer te geven als het nog niet in de open staat is. Klik ergens in het midden van de code en druk op F5 Sleutel om de code uit te voeren. De voorbeelduitvoer in het foutopsporingsvenster wordt hieronder weergegeven.
Description Length Width Height Area Volume Warehouse 25 30 10 750 7500
Omschrijving Lengte Breedte Hoogte Oppervlakte Volume
Magazijn 25 30 10 750 7500
Validatie controleert prestatietests.
We zullen tests uitvoeren om te zien of de validatiecontrole van de invoerwaarde van de basisklasse ClsArea-klasse werkt wanneer er waarden aan worden doorgegeven via de ClsVolume-klasse. We hebben ook enkele validatiecontroles uitgevoerd in de functies Area() en Volume().
Laten we ze een voor een proberen:
Eerst geven we een negatieve waarde door aan de eigenschap ClsArea.dblLength via de ClsVolume-klasse. Het zou de foutmelding moeten activeren en de functie Inputbox() binnen de Do While...Loop moeten openen om de juiste waarde in te voeren.
1. Vervang de waarde 25, in de regel Vol.dblLength =25 , met –5 en druk op F5 Sleutel om de code uit te voeren.
De validatiecontrole activeert de fout en vraagt om een waarde groter dan nul. Voer een waarde in die groter is dan 0. Herstel daarna de waarde 25 in de regel en vervang –5.
2. Schakel de regel Vol.dblHeight =10 uit door een commentaarsymbool (‘) aan het begin van de regel in te voegen, zoals weergegeven:‘Vol.dblHeight =10 . Druk na de wijziging op de F5-toets om de code uit te voeren.
Aangezien er geen invoerwaarde is doorgegeven aan de eigenschap, genereert de functie Vol.Volume() een fout waarin staat dat alle drie de eigenschappen:dblLength, dblWidth en dblHeight waarden moeten bevatten om de functie Volume uit te voeren.
Op dezelfde manier kunt u ook de prestaties van de Vol.Area()-functie controleren.
We kunnen een functie voor het afdrukken van gegevens maken en het ClsVolume-object als parameter doorgeven aan de functie en de waarden afdrukken in het foutopsporingsvenster.
De gewijzigde code van hoofdprogramma's.
De gewijzigde code voor beide programma's vindt u hieronder:
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
Volgende week bouwen we het Volume Class Object met minder code.
De links van alle pagina's over dit onderwerp.
- MS-Access Class-module en VBA
- MS-Access VBA Class Object Arrays
- MS-Access-basisklasse en afgeleide objecten
- VBA-basisklasse en afgeleide objecten-2
- Basisklasse en afgeleide objectvarianten
- Ms-Access Recordset en Class Module
- Toegang tot klassenmodule en wrapperklassen
- Transformatie van functionaliteit van wrapperklasse
- Basisprincipes voor MS-Access en verzamelingsobjecten
- Ms-Access Class-module en verzamelobject
- Tabelrecords in verzamelobject en formulier
- Basisprincipes van woordenboekobjecten
- Basisprincipes van woordenboekobjecten-2
- Woordenboek-objectsleutels en items sorteren
- Records van woordenboek naar formulier weergeven
- Klasobjecten toevoegen als woordenboekitems
- Klasobject woordenboekitem op formulier bijwerken