Introduktion.
I sidste uge har vi oprettet et afledt klasse ClsVolume-objekt ved at bruge Class ClsArea som basisklasse. Vi har oprettet egenskabsprocedurer i den afledte klasse for at eksponere basisklassens egenskaber og funktion for objektbrugerprogrammerne. Denne metode kræver også gentagelse af alle egenskabsprocedurerne for basisklassen i den afledte klasse. Her undersøger vi, hvordan man opretter den samme afledte ClsVolume-klasse uden at gentage egenskabsprocedurerne for Base ClsArea-klassen.
Vi har lært brugen af Get og Lad Ejendomsprocedurer i klasser. Der er endnu en egenskabsprocedure brugt i klasser:Sættet Ejendomsprocedure. Indstil egenskabsproceduren tildeler direkte et objekt til et klasseobjekt af samme type.
Inden du fortsætter videre, kan du besøge de tidligere sider om dette emne, hvis du ikke allerede har gjort det, er linkene nedenfor:
- MS-Access Class Module og VBA
- MS-Access VBA Class Object Arrays
- MS-Access Basisklasse og afledte objekter
ClsVolume Class, makeoveren.
Vi vil skabe en anden variant af det samme ClsVolume Class Module, som vi lavede i sidste uge, ved at bruge ClsArea som basisklasse, med en anden tilgang og med mindre kode.
Opret et nyt klassemodul, og skift dets navnegenskabsværdi til ClsVolume2 .
Kopiér og indsæt følgende kode i klassemodulet ClsVolume2 og gem modulet:
Option Compare Database Option Explicit 'Method two-1 Private p_Height As Double Private p_Area As ClsArea Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) p_Height = dblNewValue End Property Public Function Volume() As Double Volume = p_Area.dblLength * p_Area.dblWidth * p_Height End Function
'Ny Hent og Indstil Egenskabsprocedure for ClsArea ObjectsPublic Property Get CArea() As ClsArea Set CArea =p_AreaEnd PropertyPublic Property Set CArea(ByRef AreaValue As ClsArea) Set p_Area =AreaValueEnd Property
Vælg Kompilér Projektnavn fra Debug Menu til at kompilere VBA-koden i databasen for at sikre, at al VBA-projektkode er fejlfri. Hvis du er stødt på en fejl i dine andre VBA-programmer, bedes du spore fejlen, rette den og kompilere dit projekt igen. Ellers vil VBA IntelliSense, der viser en liste over egenskaber og funktioner for objekter, ikke fungere. Det forhindrer os ikke i at tildele/hente værdier til/fra Objektegenskaber. Men mens du lærer, er det vigtigt at se, at et objekts egenskaber dukker op og viser listen som en assistent i kodning.
Hent/Indstil i stedet for Hent/Lad ejendomsprocedure.
Vi har udeladt alle egenskabsprocedurer for ClsArea, oprettet i den sidste version af ClsVolume Class, og erstattet dem med en Get/Set Ejendomsprocedurer i stedet for Get/Let . Tjek deklarationsområdet, hvor vi har erklæret p_Area er erklæret som ClsArea Class Object.
Når et objekt erklæres på denne måde, skal vi normalt oprette en instans af dette objekt i Class_Initialize()-proceduren i ovenstående kode. Vi gjorde det ikke her, fordi vi planlægger at gøre det i brugerprogrammet og udfylde dets egenskaber med passende værdier og derefter videregive det til ClsVolume2-klassen før den endelige beregningsfase for at bruge deres værdier.
Bemærk Set CArea() procedure. Dets ByRef-parameter AreaValue er erklæret som ClsArea Object. Det vil acceptere ClsArea-klasseobjektet, når det sendes til Egenskabssæt CArea(ByRef AreaValue as ClsArea) , i objektvariablen AreaValue, og tildeler til p_Area Ejendom for ClsVolume2 Objekt.
Get CArea() Egenskabsproceduren returnerer objektet til det kaldende program.
I vores tidligere programmer har vi skrevet egenskabsprocedurer for individuelle elementer (længde, bredde, højde) af et objekt for at tildele/returnere værdier Til/Fra dem. Her er forskellen, at vi overfører et helt objekt som en parameter til den indstillede procedure. For at hente dette objekts egenskabsværdi (f.eks. lblHeight) skal vi adressere det som CArea.dblLength . Get/Set Ejendomsprocedurenavn Carea bliver hovedobjektets underordnede objekt, når det erklæres i hovedprogrammet, og deres egenskabsprocedurer kan tilgås direkte via objektadressen Vol.CArea.dblLength.
Et testprogram i standardmodulet.
Vi vil skrive et lille program i standardmodulet for at teste vores nye afledte klasseobjekt ClsVolume2.
Indsæt et nyt standardmodul i dit projekt. Kopiér og indsæt følgende kode i modulet og gem koden:
Public Sub SetNewVol2_1() 'Method 1/2 Dim Vol As New ClsVolume2 'ClsArea Object instantiated and passed to the 'Property Procedure Set CArea in ClsVolume2. Set Vol.CArea = New ClsArea 'declare and instantiate the object in one statement Stop Vol.CArea.strDesc = "Bed Room" Vol.CArea.dblLength = 90 Vol.CArea.dblWidth = 10 Vol.dblHeight = 10 'assign height to ClsVolume2 Stop Debug.Print "Description", "Length", "Width", "Area", "Height", "Volume" Debug.Print Vol.CArea.strDesc, Vol.CArea.dblLength, Vol.CArea.dblWidth, Vol.CArea.Area, Vol.dblHeight, Vol.Volume Set Vol.CArea = Nothing Set Vol = Nothing End Sub
Kodegennemgang linje for linje.
.Lad os tage et hurtigt kig på VBA-koden ovenfor. Første linje instansierer Class ClsVolume2 med navnet Vol. Efter de næste to kommentarlinjer er Sæt erklæring med Vol.CArea Ejendomsprocedure kaldes og passerer Ny instansieret ClsArea Objekt som parameter.
Jeg har sat et Stop sætning i næste linje for at give en pause i programmet for at se, hvordan objektet bliver tildelt til Sættet Omsorg Objekt. Hvordan? vil vi undersøge det om et øjeblik?
De næste fire linjer tildeler værdier til ClsArea-objektet og til egenskaben Height for ClsVolume2-objektet.
Det næste stop laver en pause i programmet, så vi kan inspicere hukommelsen for, hvordan værdierne opbevares i hukommelsen.
Næste linje udskriver overskrifterne i fejlfindingsvinduet for værdierne udskrevet på næste linje.
Næste linje udskriver værdierne for objektegenskaber fra hukommelsen til fejlfindingsvinduet.
Kør koden til Next Stop Statement
Lad os køre koden og inspicere hukommelsen for at se, hvad der sker der på hvert trin, hvor jeg placerede Stop-sætningen.
- Klik et sted i midten af koden, og tryk på F5 for at køre koden og sætte programmet på pause ved den første Stop-erklæring.
- Vælg Locals Window fra Vis Menu for at åbne et nyt vindue under kodevinduet for at vise, hvordan ClsArea- og ClsVolume2-objekterne, deres egenskaber og deres medlemsegenskabsprocedurer opbevares i hukommelsen. Et eksempelbillede af Locals-vinduet er angivet nedenfor.
Vinduet Locals Vis.
Træk andre Windows' størrelseshåndtag op for at reducere deres højde for at give mere plads til visning af Locals Vindue. Bedre, luk fejlfindingsvinduet, indtil videre, brug Ctrl+G for at bringe det tilbage, når det er nødvendigt senere.
Vi kan have en grafisk visning af alle objekterne og deres egenskaber i Locals Vindue. Fornavnet med plus-symbolet [+] viser navnet på standardmodulet, hvorfra vores program kører.
Det næste plus [+] symbol med navnet Vol er det ClsVolume2-instantierede objekt i hukommelsen.
- Klik på [+]-symbolerne for at udvide og vise detaljerne.
Du vil finde det næste niveau af objekter og egenskaber.
[+]Carea angiver, at dette objekt har det næste niveau af egenskaber og deres værdier.
dblHeight Hent ejendom Proceduren kommer direkte under Vol Object.
[+]p_Area er den private ejendom erklæret som ClsArea Klasse i ClsVolume2-klassen.
p_Højden er også den private ejendom erklæret i ClsVolume2.
- Klik på pluspunktet [+] symboler for at udvide objekterne for at vise deres egenskaber og værdier.
Udvidelsen af [+]CARea giver os visningen af det ClsArea-objekt, vi har videregivet til egenskabsproceduren Set CArea().
Udvidelsen af [+]p_Area giver visningen af ClsArea-ejendommen, der er erklæret som privat.
Bemærk p_Area Privat ejendom, af ClsVolume2 Class Object, og alle dets elementer er kun tilgængelige gennem CArea Objektegenskab Get/Set Procedurer til omverdenen.
Den anden kolonne i Locals-vinduet viser de værdier, der er tildelt til objektegenskaberne og i øjeblikket ingen værdier i dem.
Den tredje kolonne viser datatype- eller objektklassemodulnavnene.
- Tryk på F5 for at køre programmet videre, indtil det er sat på pause ved næste stop-sætning, for at tildele nogle værdier til objektegenskaberne. Programmet stopper ved næste stop udmelding. Tjek Locals-vinduet for ændring af værdier.
Inde i Carea Indsigelse mod de første to linjer med værdierne 90, 10 og den sidste strDesc med værdien "Sengeværelse" er Get Ejendomsprocedurer. p_Desc, p_Length og p_width er værdier tildelt gennem Set Ejendomsprocedurer til p_Area Egenskab for ClsVolume2 klasseobjekt.
p_Area Objekt af ClsArea-klassen erklæret som privat ejendom for ClsVolume2 ses med dets Get/Set Ejendomsprocedurer og tildelte værdier.
Tjek Type Kolonne af [-]CARea og [-]p_Area begge objekter er afledt af ClsArea Base Class.
Anvendelse af ClsArea og ClsVolume2 klasseobjekter forskelligt.
I næste uge vil vi prøve en anden tilgang med de samme to objekter. Hvis du vil prøve det selv, er her et fingerpeg om, hvordan du selv kan prøve det.
- Instantiér ClsVolume2 og ClsArea Class som to forskellige objekter i standardmodulprogrammet.
- Tildel værdier til begge objektegenskaber.
- Tildel det ClsArea-instantierede objekt til CArea Objekt i ClsVolume2 Class Object, før værdierne udskrives til fejlfindingsvinduet.
I dette eksempel kan vi opnå det samme resultat, som vi gjorde i ovenstående eksempel, uden at gentage Get/Let Property-procedurerne, som vi gjorde i ClsVolume Class Module.
Links til 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
- Tilføj klasseobjekter som ordbogselementer
- Opdater Class Object Dictionary Element på formular