Introduktion.
Förra veckan har vi skapat ett härlett klass ClsVolume-objekt med klass ClsArea som basklass. Vi har skapat egenskapsprocedurer i den härledda klassen för att exponera basklassens egenskaper och funktion för objektanvändarprogrammen. Denna metod kräver upprepning av alla egenskapsprocedurer för basklassen även i den härledda klassen. Här undersöker vi hur man skapar samma härledda ClsVolume Class utan att upprepa egenskapsprocedurerna för Base ClsArea Class.
Vi har lärt oss hur Hämta används och Låt Egendomsförfaranden i klasser. Det finns ytterligare en egendomsprocedur som används i klasser:Set Egendomsförfarande. Ange egenskapsproceduren tilldelar ett objekt direkt till ett klassobjekt av samma typ.
Innan du fortsätter kan du besöka de tidigare sidorna om detta ämne, om du inte redan har gjort det finns länkarna nedan:
- MS-Access Class Module och VBA
- MS-Access VBA Class Object Arrays
- MS-Access basklass och härledda objekt
ClsVolume Class, Makeover.
Vi kommer att skapa en annan variant av samma ClsVolume Class Module, som vi skapade förra veckan, med ClsArea som basklass, med ett annat tillvägagångssätt och med mindre kod.
Skapa en ny klassmodul och ändra dess namnegenskapsvärde till ClsVolume2 .
Kopiera och klistra in följande kod i klassmodulen ClsVolume2 och spara modulen:
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 Hämta och Ställ in Egenskapsprocedur för 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älj Kompilera Projektnamn från Debug Meny för att kompilera VBA-koden i databasen för att säkerställa att all VBA-projektkod är felfri. Om du har stött på ett fel i dina andra VBA-program, vänligen spåra felet, korrigera det och kompilera om ditt projekt. Annars kommer VBA IntelliSense som visar en lista med egenskaper och funktioner för objekt inte att fungera. Det kommer inte att hindra oss från att tilldela/hämta värden till/från objektegenskaper. Men när du lär dig är det viktigt att se egenskaperna för ett objekt dyker upp och visar listan, som en assistent i kodning.
Hämta/Ställ in istället för Get/Let Property Procedur.
Vi har utelämnat alla egenskapsprocedurer för ClsArea, skapade i den senaste versionen av ClsVolume Class, och ersatt dem med en Get/Set Egendomsprocedurer, istället för Get/Let . Kontrollera deklarationsområdet där vi har deklarerat p_Area deklareras som ClsArea Class Object.
När ett objekt deklareras på detta sätt bör vi normalt skapa en instans av detta objekt i Class_Initialize()-proceduren i ovanstående kod. Vi gjorde det inte här eftersom vi planerar att göra det i användarprogrammet och fylla upp dess egenskaper med lämpliga värden och sedan skicka det till ClsVolume2 Class, innan den slutliga beräkningsfasen för att använda deras värden.
Notera Set CArea() procedur. Dess ByRef-parameter AreaValue deklareras som ClsArea Object. Det kommer att acceptera ClsArea Class Object när det skickas till Property Set CArea(ByRef AreaValue as ClsArea) , i objektvariabeln AreaValue, och tilldelar p_Area Egenskapen för ClsVolume2 Objekt.
Get CArea() Egenskapsproceduren returnerar objektet till det anropande programmet.
I våra tidigare program har vi skrivit egenskapsprocedurer för enskilda element (längd, bredd, höjd) av ett objekt för att tilldela/returnera värden Till/Från dem. Här är skillnaden att vi skickar ett helt objekt som en parameter till Set-proceduren. För att hämta detta objekts egenskapsvärde (säg lblHeight) måste vi adressera det som CArea.dblLength . Get/Set Egendomsprocedurnamn Carea blir det underordnade objektet till huvudobjektet när det deklareras i huvudprogrammet och deras egendomsprocedurer kan nås direkt via objektadressen Vol.CArea.dblLength.
Ett testprogram i standardmodulen.
Vi kommer att skriva ett litet program i standardmodulen för att testa vårt nya härledda klassobjekt ClsVolume2.
Infoga en ny standardmodul i ditt projekt. Kopiera och klistra in följande kod i modulen och spara 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
Kodgranskning rad för rad.
.Låt oss ta en snabb titt på VBA-koden ovan. Första raden instansierar Class ClsVolume2 med namnet Vol. Efter de följande två kommentarsraderna Set uttalande med Vol.CArea Egenskapsproceduren anropas och godkänner Ny instansierat ClsArea Objekt som parameter.
Jag sätter ett Stopp uttalande på nästa rad för att ge en paus i programmet för att se hur objektet tilldelas till uppsättningen Omsorg Objekt. På vilket sätt? ska vi utforska det om en minut?
De nästa fyra raderna tilldelar värden till ClsArea-objektet och till egenskapen Height för ClsVolume2-objektet.
Nästa stopp skapar en paus i programmet så att vi kan inspektera minnet av hur värdena hålls i minnet.
Nästa rad skriver ut rubrikerna i felsökningsfönstret för värdena som skrivs ut på nästa rad.
Nästa rad skrivs ut värdena för objektegenskaper från minnet till felsökningsfönstret.
Kör koden till nästa stopp
Låt oss köra koden och inspektera minnet för att se vad som händer där i varje skede, där jag placerade Stop-satsen.
- Klicka någonstans i mitten av koden och tryck på F5 för att köra koden och pausa programmet vid det första stoppmeddelandet.
- Välj Lokalfönster från Visa Meny för att öppna ett nytt fönster under kodfönstret, för att visa hur ClsArea- och ClsVolume2-objekten, deras egenskaper och deras medlemsegenskapsprocedurer hålls i minnet. En exempelbild av Lokalfönstret ges nedan.
Fönstret Lokaler Visa.
Dra andra Windows storlekshandtag uppåt för att minska deras höjd för att ge mer utrymme för visning av Locals Fönster. Bättre, stäng felsökningsfönstret, för tillfället, använd Ctrl+G för att ta tillbaka det när det behövs senare.
Vi kan ha en grafisk vy av alla objekt och deras egenskaper i Locals Fönster. Förnamnet med plussymbolen [+] visar namnet på standardmodulen, varifrån vårt program körs.
Nästa plussymbol med [+] med namnet Vol är det ClsVolume2 instansierade objektet i minnet.
- Klicka på symbolerna [+] för att expandera och visa detaljerna.
Du hittar nästa nivå av objekt och egenskaper.
[+]Carea indikerar att detta objekt har nästa nivå av egenskaper och deras värden.
dblHeight Proceduren för att hämta egendom kommer direkt under Vol Object.
[+]p_Area är den privata egendomen deklarerad som ClsArea Klass i ClsVolume2 Class.
p_Height är också den privata egendomen som deklareras i ClsVolume2.
- Klicka på plustecknet [+] symboler för att expandera objekten för att visa deras egenskaper och värden.
Utbyggnaden av [+]CARea ger oss en bild av ClsArea-objektet som vi har skickat till egenskapsproceduren Set CArea().
Utbyggnaden av [+]p_Area ger visningen av ClsArea-egendomen som deklarerats som privat.
Observera p_Area Privat egendom, av ClsVolume2 Class Object, och alla dess element är endast tillgängliga via CArea Objektegenskap Get/Set Rutiner till omvärlden.
Den andra kolumnen i Locals-fönstret visar värdena som tilldelats objektegenskaperna och för närvarande inga värden i dem.
Den tredje kolumnen visar datatyp eller objektklassmodulnamn.
- Tryck på F5 för att köra programmet vidare, tills det pausas vid nästa Stop-sats, för att tilldela några värden till Objektegenskaperna. Programmet pausas vid nästa stopp påstående. Kontrollera fönstret Lokalbefolkningen för förändringar av värden.
Inuti Carea Invända de två första raderna med värdena 90, 10 och den sista strDesc med värdet "Sängrum" är Hämta Fastighetsförfaranden. P_Desc, p_Length och p_width är värden som tilldelas genom Set Egendomsrutiner till p_Area Egenskapen för ClsVolume2 Class Object.
p_Area Objekt av ClsArea-klassen som deklarerats som privat egendom för ClsVolume2 ses med dess Get/Set Egenskapsrutiner och tilldelade värden.
Kontrollera Typ Kolumn för [-]CARea och [-]p_Area båda objekten är härledda från ClsArea Base Class.
Användning av ClsArea- och ClsVolume2-klassobjekt på olika sätt.
Nästa vecka kommer vi att prova ett annat tillvägagångssätt med samma två objekt. Om du vill prova själv, här är ledtråden till hur du provar själv.
- Instantera ClsVolume2 och ClsArea Class som två olika objekt i standardmodulprogrammet.
- Tilldela värden till båda objektegenskaperna.
- Tilldela det ClsArea-instansierade objektet till CArea Objekt i ClsVolume2 Class Object, innan du skriver ut värdena till felsökningsfönstret.
I det här exemplet kan vi uppnå samma resultat som vi gjorde i exemplet ovan, utan att upprepa Get/Let Property-procedurerna som vi gjorde i ClsVolume Class Module.
Länkarna till alla sidor om detta ämne.
- MS-Access Class Module och VBA
- MS-Access VBA Class Object Arrays
- MS-Access basklass och härledda objekt
- VBA-basklass och härledda objekt-2
- Basklass- och härledda objektvarianter
- Ms-Access Recordset och Class Module
- Åtkomst till klassmoduler och omslagsklasser
- Omvandling av omslagsklassfunktionalitet
- Ms-Access och Collection Object Basics
- Ms-Access Class Module och Collection Object
- Tabellposter i samlingsobjekt och form
- Grundläggande om ordbokobjekt
- Dictionary Object Basics-2
- Sortera ordboksobjektnycklar och objekt
- Visa poster från ordbok till formulär
- Lägg till klassobjekt som ordboksobjekt
- Lägg till klassobjekt som ordboksobjekt
- Uppdatera Class Object Dictionary-objekt på formulär