Introduktion.
Hvis du ikke har set de tidligere indlæg på Microsoft Access Class Module, bedes du gennemgå dem, før du fortsætter, linkene er givet nedenfor.
- MS-Access Class Module og VBA.
- MS-Access VBA Class Object Array.
ClsArea Klasse kan fungere som en basisklasse i et andet klasseobjekt, beregningen udført af basisklassen kan bruges som en del af det nye objekts beregninger. For eksempel kan det være en del af et objekt, der beregner volumen af noget,
dbl i dblLength og dblWidth Ejendomsprocedurenavne for Get/Let Procedurer er blot en indikation af, at klasseobjektet forventer længde- og breddeværdierne i dobbelte præcisionstal. På samme måde, hvis vi ændrer ejendomsprocedurenavnene til Kvantitet og UnitPrice, giver den første værdi ganget med den anden værdi os den samlede pris for en vare.
Det betyder ganske enkelt, at du kan bruge ClsArea-klassen som en basisklasse, hvor som helst du har brug for resultatet af den første værdi ganget med den anden værdi, f.eks. Samlet pris * Skattesats for at beregne afgiftsbeløbet eller Samlet pris * Rabatsats for at finde rabatbeløb og så videre.
Selvom vi har udviklet et simpelt klassemodul, kan det være en del af mange andre afledte klasser. Mulighederne er åbne for din fantasi og kreativitet.
Vores ClsArea-klasse beregner kun arealet af materialer, rum eller lignende varer med egenskaber for længde og bredde. Det beregner ikke arealet af trekanten eller cirklen. Men det kan være en del af et nyt klasseobjekt, der beregner volumen af rum, varehuse for at finde lagerkapacitet. Til det har vi brug for endnu en værdi, højde på værelse, lager osv.
Volumenklassen:ClsVolume.
Lad os oprette et nyt klassemodul ClsVolume, ved at bruge ClsArea som basisklasse. Indsæt et klassemodul og skift dets navn Ejendom til ClsVolume . Indtast eller kopier og indsæt følgende kode i klassemodulet.
Option Sammenlign DatabaseOption ExplicitPrivate p_Area As ClsAreaPrivate p_Height As DoublePrivate Sub Class_Initialize() Set p_Area =New ClsAreaEnd SubPrivate Sub Class_Terminate() Set p_Area =NothingEnd SubPublic Property As dblHeal Property As dblHeal As Double) Do While Val(Nz(dblNewValue, 0)) <=0 dblNewValue =InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height =dblNewValueEnd PropertyPublic Function Volume() As DoubleIf ( p_Area.Area()> 0) And (p_Height> 0) Then Volume =p_Area.Area * p_HeightElse MsgBox "Indtast gyldige værdier for Length, Width and Height.", , "ClsVolume"End IfEnd Function
ClsVolume-klasseobjektets kode er endnu ikke komplet. Lad os undersøge koden linje for linje. I den tredje linje erklæret som privat ejendom p_Area af ClsArea klasseobjekt.
Den næste linje erklærer en privat ejendom med navnet p_Height af datatype Dobbelt.
Underrutinerne Class_Initialize() og Class_Terminate().
De næste to underrutiner (Initialiser() og Terminate() ) er meget vigtige her.
Initialize() kører og instansierer ClsArea-objektet i hukommelsen, når vi bruger og instansierer ClsVolume Class Objekt i vores standardmodulprogram.
Når vi udfører erklæringen Sæt ClsVolume =Ingenting i standardmodulprogrammet, for at rydde ClsVolume-objektet fra hukommelsen, skal Terminate() Sub-Rutine kører og frigiver hukommelsespladsen optaget af ClsArea-objektet.
Ejendommen Få dblHeight Procedure returnerer værdien fra p_Height Ejendom til det kaldende program.
Ejendommen Lad dblHeight Proceduren validerer den værdi, der sendes til NewValue parameter og tildeler den til den private ejendom p_Height .
Public Function Volume() beregner volumen ved at kalde p_Area.Area() Funktion og den returnerede arealværdi ganges med p_Højde for at beregne Volumen, med udtrykket:Volume =p_Area.Area * p_Height. Men før vi udfører denne sætning, udfører vi et valideringstjek for at sikre, at funktionen p_Area.Area() returnerer en værdi større end nul, hvilket indikerer, at p_Area.dblLength, p_Area.dblWidth Properties har gyldige værdier i dem, og p_Height egenskabsværdien er større end nul.
Bemærk: Siden er p_Area Objekt i klasse ClsArea er defineret som Privat Ejendom af ClsVolume Class, vi skal lave dens egenskaber (strDesc, dblLength, dblWidth og Area() funktion) synlig for omverdenen for Get/Lad Operationer og at returnere Arealværdi. Det betyder, at vi også skal definere Get/Let-egenskabsprocedurer for strDesc, dblLength, dblWidth Properties og Area()-funktionen af ClsArea Class Object i ClsVolume Class Module.
Udleje/Få ejendomsprocedurer.
Tilføj følgende egenskab Get/Let Procedurer og Area() funktion til ClsVolume Class Module Code:
Public Property Get strDesc() As String strDesc =p_Area.strDescEnd PropertyPublic Property Let strDesc(ByVal NewValue As String) p_Area.strDesc =NewValueEnd PropertyPublic Property Get dblLength() As Double dbLength.dBLength. NewValue As Double) p_Area.dblLength =NewValueEnd PropertyPublic Property Get dblWidth() As Double dblWidth =p_Area.dblWidthEnd PropertyPublic Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth =NewValue p. )Afslut funktion
Tjek strDesc()-egenskabsprocedurerne Get/Let linjer med kode. Brugen af procedurenavnet strDesc er blot et spørgsmål om valg, hvis du vil bruge et andet navn er du velkommen. Men det originale egenskabsnavn, vi har brugt i ClsArea-klassen, er strDesc. At bruge det originale navn her minder os om forholdet til det originale ClsArea-klasseobjekt.
I den næste Get dblLength()-egenskabsprocedure, udtrykket til højre for = tegn p_Area.dblLength læser dblLength-værdien gemt i ClsArea-klasseobjektet og vender tilbage til det kaldende program.
Let Property-proceduren tildeler parameterværdien i NewValue-variablen til egenskaben p_Area.dblLength for ClsArea-klasseobjektet. Her kører vi ikke nogen valideringskontrol af den modtagne værdi i parametervariablen NewValue. Valideringskontrollen udføres inden for selve ClsArea-klassen, når vi tildeler værdien til p_Area.dblLength ejendom.
På samme måde tilføjes Get/Let-egenskabsprocedurerne for egenskaben p_Area.dblWidth,
Dernæst p_Area.Area() Funktionen gøres synlig gennem ClsVolume Class Object til det kaldende program.
ClsVolume Derived Class Module Code.
Den udfyldte kode for ClsVolume Class Module er angivet nedenfor.
Option Sammenlign DatabaseOption ExplicitPrivate p_Area As ClsAreaPrivate p_Height As DoublePrivate Sub Class_Initialize()'Åbn ClsArea Object in Memory med navnet p_Area Set p_Area =New ClsArea End SubPrivate Sub Class_Terminate the() p_Remothing the() p_Remothing End SubPublic Property Get dblHeight() As Double dblHeight =p_HeightEnd PropertyPublic Property Lad dblHeight(ByVal dblNewValue As Double)Do While Val(Nz(dblNewValue, 0)) <=0 dblNewValue =InputBox("Negative/0 "Values Invalid:", dblHeight()", 0) Loop p_Height =dblNewValueEnd PropertyPublic Function Volume() As DoubleIf (p_Area.Area()> 0) Og (Me.dblHeight> 0) Så Volume =p_Area.Area * Me.dblHeightElse MsgBox "Enter Valid for Længde, Bredde og Højde.",vbUdråb , "ClsVolume"End IfEnd Function'ClsArea Class Ejendomsprocedurer og -metode er afsløret herPublic Property Get strDesc() As String strDesc =p_Area.strDescEnd Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc =NewValueEnd PropertyPublic Property Get dblLength() As Double dblLength =p_Area.dblLengthEnd PropertyPublic Property Let dblLength(ByVal NewValue Get As Double) p_AreaDobbelt AsbldBlW Property p_Area.dblWidthEnd PropertyPublic Property Lad dblWidth(ByVal NewValue As Double) p_Area.dblWidth =NewValueEnd PropertyPublic Function Area() As Double Area =p_Area.Area()End Function
Jeg ved, hvad du tænker nu:som "det er dobbelt arbejde, det er rart, hvis vi på en eller anden måde kan springe disse trin over med at gentage ClsArea Property Procedures igen i ClsVolume-klassen". Eller sige, vi kunne have tilføjet egenskaben dblWidth i selve ClsArea og køre Area() og Volume() metoderne derfra selv, ikke?
Hele pointen her er, hvordan et basisklasseobjekt kan blive en del af design af et andet klasseobjekt.
Husk hele ideen med at designe et genanvendeligt klassemodulobjekt er, at hovedprogrammerne, der bruger klasseobjektet, vil være enkle, og de forviklinger, der er indbygget i klasseobjektet, forbliver skjulte.
Ja, vi kan gøre det på mere end én måde, også med en kompakt kode. Vi vil udforske dem senere, men indtil videre, lad os fortsætte med vores oprindelige plan.
Hovedprogrammet, der bruger ClsVolume-klassen.
Lad os teste vores nye ClsVolume Class i hovedprogrammet i Standard Module. Eksempelkoden er givet nedenfor.
Public Sub TestVolume()Dim vol As ClsVolumeSet vol =New ClsVolumevol.strDesc ="Warehouse"vol.dblLength =25vol.dblWidth =30vol.dblHeight =10Debug.Print "Description", "Width", "Length", Højde", "Area", "Volume"With vol Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume()End WithEnd Sub
Du kan se, hvor enkelt hovedprogrammet er uden udskrivningslinjerne?
Kopiér og indsæt koden i et standardmodul. Tryk på Ctrl+G-tasterne for at få vist fejlfindingsvinduet, hvis det ikke allerede er i åben tilstand. Klik et sted i midten af koden, og tryk på F5 Nøgle til at køre koden. Eksempeloutputtet på fejlfindingsvinduet er vist nedenfor.
Beskrivelse Længde Bredde Højde Område VolumeWarehouse 25 30 10 750 7500
Beskrivelse Længde Bredde Højde Areal Volumen
Lager 25 30 10 750 7500
Valideringstjek ydeevnetest.
Vi vil køre test for at se, at basisklassen ClsArea-klassens inputværdivalideringstjek fungerer, når værdier sendes til den gennem ClsVolume-klassen. Vi har også udført nogle valideringstjek i funktionerne Area() og Volume().
Lad os prøve dem én efter én:
Først sender vi en negativ værdi til egenskaben ClsArea.dblLength gennem ClsVolume-klassen. Det skulle udløse fejlmeddelelsen og åbne funktionen Inputbox() i Do While...-løkken for at indtaste den korrekte værdi.
1. Erstat værdien 25 i linjen Vol.dblLength =25 , med –5 og tryk på F5 Nøgle til at køre koden.
Valideringstjekket vil udløse fejlen og bede om en værdi større end nul. Indtast en værdi, der er større end 0. Gendan derefter værdien 25 i linjen og erstatter –5.
2. Deaktiver linjen Vol.dblHeight =10 ved at indsætte et kommentarsymbol (‘) i begyndelsen af linjen som vist:‘Vol.dblHeight =10 . Efter ændringen skal du trykke på F5-tasten for at køre koden.
Da der ikke er nogen inputværdi sendt til egenskaben, vil Vol.Volume()-funktionen generere en fejl, der siger, at alle de tre egenskaber:dblLength, dblWidth og dblHeight, skal have værdier i dem for at køre Volume-funktionen.
På samme måde kan du også kontrollere Vol.Area()-funktionens ydeevne.
Vi kan oprette en dataudskrivningsfunktion og sende ClsVolume-objektet som en parameter til funktionen og udskrive værdierne i Debug-vinduet.
Den ændrede kode for hovedprogrammer.
Den ændrede kode for begge programmer er angivet nedenfor:
Public Sub TestVolume()Dim Vol As ClsVolumeSet Vol =New ClsVolumeVol.strDesc ="Warehouse"Vol.dblLength =25Vol.dblWidth =30Vol.dblHeight =10Call CVolPrint Volumen(Vol>EndSdet)Public Sub CVolPrint(volm As ClsVolume) Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With volm Debug.Print .strDesc, .dblLength, .dblWidth , .dblHeight, .Area, .VolumeEnd WithEnd SubI næste uge bygger vi volumenklasseobjektet med mindre kode.
Links på alle sider om dette emne.
- MS-Access Class Module og VBA
- MS-Access VBA Class Object Arrays
- MS-Access Basisklasse og afledte objekter
- VBA-basisklasse og afledte objekter-2
- Basisklasse og afledte objektvarianter
- Ms-Access Recordset og klassemodul
- Adgang til klassemodul- og indpakningsklasser
- Wrapper Class Funktionalitet Transformation
- Ms-Access og Collection Object Basics
- Ms-Access klassemodul og samlingsobjekt
- Tabelposter i samlingsobjekt og -form
- Grundlæggende om ordbogsobjekt
- Dictionary Object Basics-2
- Sortering af ordbogsobjektnøgler og -elementer
- Vis poster fra ordbog til formular
- Tilføj klasseobjekter som ordbogselementer
- Opdater Class Object Dictionary Element på formular