Introduktion.
De sidste par uger har vi lært, hvordan man bruger User-Defined Type (UDT) ved at skabe en kompleks datastruktur, og vi kender UDTs styrke eller svaghed, mere eller mindre efterhånden. Hvis du ikke har gennemgået disse artikler, kan du besøge dem. Brug følgende links:
- Brugerdefineret datatype-2
- Brugerdefineret datatype-3
I Microsoft Access er der to typer VBA-moduler.
- Standardmoduler
- Klassemoduler
Vi har arbejdet med klassemoduler på Formularer og Rapporter af Microsoft Access. Form/Rapport Class Modul-programmer er for det meste hændelsesdrevne (knap-klik, før-opdatering, formular/rapporter aktuel hændelse osv.) små rutiner.
Mere seriøs databehandling Programmer vil blive skrevet i standardmoduler. Flere programmer, der ikke nødvendigvis er relaterede, kan skrives i ét standardmodul for at udføre forskellige opgaver.
Klassemoduler er forskellige. De bruges til at bygge brugerdefinerede objekter, og et klassemodul bruges kun til ét objekt.
Grundlæggende om det selvstændige klassemodul.
Lad os skabe et simpelt klassemodul fra bunden og lære det grundlæggende.
- Start Microsoft Access, og åbn en database eller opret en ny. Hvis det er en ny database, skal du gemme den i den eksisterende betroede placering (mappe) eller tilføje den nye placering til listen over betroede placeringer. Klik på Office-knappen ->Adgangsindstillinger -> Tillidscenter -> Tillidscenterindstillinger. Tilføj databasemappen til listen, og klik på OK.
- Åbn VBA-redigeringsvinduet (Alt+F11).
- Klik på Indsæt Menu, og vælg Klassemodulet fra listen. Et nyt klassemodul er indsat.
Bemærk: Klassens navn:ClsArea blive objektnavnet. Det betyder, at uanset hvor vi bruger dette objekt, vil det være som en normal variabelerklæring:Dim xyz As ClsArea . Vi skrev en lignende erklæring til brugerdefinerede datatypedeklarationer.
Dernæst vil vi tilføje tre egenskaber (variabler) for objektet (for Beskrivelse, Længde, og Bredde ) øverst i modulet under Option Sammenlign database og Option Eksplicit linjer. Indtast følgende linjer i klassemodulet.
Valg Sammenlign DatabaseOption ExplicitPublic p_Desc som StringPublic p_Length som DoublePublic p_Width as Double
Disse variabler identificeres som egenskaber for VBA Custom Class Object. Gem klassemodulet.
Bemærk: Vores klassemodulobjekt og kodelinjer vil ikke være så enkle. Det vil gennemgå ændringer med flere linjer kode. Vær bedre forberedt på at følge dem trin for trin uden at miste overblikket over hvert trin af ændringer. Dette er en simpel arealberegningsklasse (areal =længde * bredde ), så enkelt. Det vil gradvist undergå ændringer, så du ved, hvorfor disse ændringer bliver nødvendige.
Vi vil skrive et lille program i et standardmodul for at teste vores nye klassemodul. Indsæt et standardmodul fra menuen Indsæt. Du kan indtaste eller kopiere og indsætte følgende kode i standardmodulet og overskrive den eksisterende linje i modulet:
Option Sammenlign DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.Set oArea =NothingEnd Function
Dæmpet statement erklærer en variabel, som vi gør for en normal variabel, som Dim Desc som streng. Men dette er ikke en almindelig variabel, vi sætter en reference til vores klassemodulobjekt ClsArea . Da det er et objekt, er en simpel Dimension-sætning alene ikke nok, fordi den ikke vil allokere nogen hukommelsesplads til at gemme værdier i vores lokalt definerede Objekt oArea Egenskaber.
Sættet sætning i næste linje med Ny nøgleord påkrævet for at oprette en forekomst af et objekt ud fra ClsArea i hukommelsen med objektforekomstnavnet oArea . Vi kan åbne flere forekomster af det samme klasseobjekt i hukommelsen på denne måde, hvis det er nødvendigt (vi vil lære om dem i de kommende uger), så vi kan gemme værdier i dets egenskaber (p_Desc, p_Length, p_Width). p_ præfiks til variablerne er en indikator for, at omfanget af variabler er Private, dvs. variablerne er ikke synlige uden for klassemodulet, hvis variablen er erklæret med nøgleordet Privat, men nu er den erklæret som offentlig. Variabelnavnet kan være et hvilket som helst gyldigt navn.
Bemærk: Vi har ikke erklæret det som privat endnu. Vi er på vej mod den forandring.
Umiddelbart efter søgeordet Indstil det lokale objektnavn (du kan vælge et passende navn, du foretrækker, men det skal være i overensstemmelse med de normale regler for variabelnavn) efterfulgt af et lighedstegn og nøgleordet Ny og Klassemodulnavnet (ClsArea) at oprette en instans af clsArea-objektet i hukommelsen med alle dets egenskaber (variabler).
Der er en genvej til denne to-linjers kode. Handlinger af begge disse kodelinjer kan opnås med én sætning som vist nedenfor :
Dim oArea As ClsAreaSet oArea =New ClsArea'genvejen til ovenstående to udsagnDim oArea As New ClsArea
Når du skriver den næste linje oArea efterfulgt af en prik (. ) separator vises følgende skærm for at vise listen over tilgængelige egenskaber for brugerdefinerede objekter at vælge imellem.
Hvis det ikke vises, skal du gå til dialogboksen Indstillinger fra menuen Værktøjer og sætte et flueben i Auto List Members i Editor-fanen.
Før du afslutter funktionen, skal den sidste sætning være Set oArea =Nothing . Denne erklæring frigiver eksplicit den hukommelse, der er optaget af forekomsten af det brugerdefinerede objekt, så der er mere hukommelse tilgængelig for andre programmer. Dette er en ansvarlig oprydningsoperation fra vores program.
Uanset hvad vi gør med det instansierede brugerdefinerede objekt, skal det kodes mellem det første og sidste sæt udsagn.
ClsArea Class Object Test Program.
Den udfyldte klassetestprogramkode er angivet nedenfor:
Option Sammenlign DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.p_Desc ="Carpet"oArea.p_Length =25oArea.p_Width =15Debugth.Print "Debugth.Winth.Print "Debugth.Winth. oArea.p_Desc, oArea.p_Length, oArea.p_WidthSet oArea =NothingEnd-funktion
Klik et sted i midten af koden, og tryk på F5 at køre programmet. Kørsel af programmet er givet nedenfor som reference.
Beskrivelse Længde BreddeTæppe 25 15
Offentlig|Privat omfang af objektegenskaber.
Vores enkle klassemodulobjekt har få ulemper, og vi vil rette op på dem.
Den første er, at vi har erklæret alle variabler (eller egenskaber) med Offentlige Omfang. På grund af det er de synlige for andre VBA-programmer og kan få deres værdi ændret direkte. Det andet problem er, at det vil acceptere alle ugyldige værdier, såsom negative eller nul værdier, som ikke er egnet til vores klasseobjekt. Vi er nødt til at inkorporere nogle valideringstjek, før vi accepterer værdierne i variablerne.
Det første problem kan vi let løse ved at ændre de variable erklæringer fra Offentlig til Privat . Når vi gør det, burde vi have en indirekte metode til at gemme og hente værdier fra de private variabler. Det er formålet med Get og Lad Ejendomsprocedurer, for hver Ejendom af Objektet. Lad os foretage disse ændringer i klassemodulet.
Åbn klassemodulet ClsArea. Skift ordet Offentlig til Privat for alle tre variabler.
Oprettelse af ejendomsprocedurer
Vælg Procedure fra Indsæt Menu, skriv strDesc i Navn tekstkontrol, vælg Egenskab i Type Indstillingsgruppe og Offentlig i Omfang valggruppe. Klik på OK for at indsætte egenskabsprocedurerne for Private p_Desc Variabel (Ejendom).
Option Sammenlign DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePublic p_Width As DoublePublic Property Hent strDesc() As String strDesc =p_Desc 'return værdien fra p_DescEnd PropertyPublic Property Lad strDesc(ByVal-værdien StrDesc(ByVal-værdien StrDesc =p_Desc 'return værdien fra p_DescEnd PropertyPublic Property =Lad strDesc(ByVal-værdien StrDesc(ByVal-værdien StrenVeny StrenValc's p_DescEnd Property
Både Hent Fremgangsmåde og Lad Proceduren er erklæret som Offentlig . Begge procedurenavne er de samme strDesc. Som standard er den returnerede datatypen er Variant i Hent Procedure og parameterdatatypen indsættes også som Variant i Lad Procedure. Disse kan vi ændre til specifikke typer efter behov, hvilket vi gjorde og ændrede til String type. De første tre bogstaver str i strDesc giver brugeren et hint om, at egenskaben forventer en streng datatypeværdi. Skift Lad Egenskabsprocedure Parameter Variabelnavn vNewValue til strNewValue
Når vi indsætter ejendomsproceduren, indsættes de altid med Get og Lad Procedurepar for en variabel.
Tag nu et nærmere kig på det udtryk, vi har skrevet i Get Procedure. Venstre side af = Underskriv navnet på Hent-proceduren strDesc fungerer som en variabel for at returnere værdien kopieret fra den private variabel p_Desc til opkaldsprogrammet.
Lad Procedure strDesc accepterer strengværdi i parameter Variabel strNewValue . Indtastningsværdien overføres til vores private variabel p_Desc.
Pointen at bemærke her er, at der ikke er direkte adgang til vores private variabel p_Desc til omverdenen. Transport af værdier Fra/Til variablen (egenskab) p_Desc er altid dirigeret gennem Get/Let Kun ejendomsprocedurer og underlagt valideringstjek (endnu ikke implementeret), Vi vil introducere valideringstjek på værdier, der er input (Let Procedure) i ejendommen senere.
Get/Lad Procedurer udføres automatisk afhængigt af hvad vi gør med objektegenskaben i et udtryk i VBA-programmer.
Hent proceduren udføres, når vi bruger ejendomsnavnet i et udtryk på følgende måde:
‘ Læser værdien fra p_Desc til PrintDebug.Print oArea.strDescOR‘ Læser værdien fra p_Desc og tildeler den til variablen XX =oArea.strDesc
Lad Ejendomsproceduren køres, når vi forsøger at tildele en værdi til ejendomsnavnet. Tjek eksempeludtrykket i vores testprogram nedenfor:
oArea.strDesc ="Tæppe"
I tidligere BASIC Language-bøger kan du se brugen af søgeordet LET.
LET X =25 ‘ LET er valgfrit
Da det var valgfrit, fungerer sætningen uden den og stoppede overhovedet med at bruge den.
Her, hvis du kun læser en værdi fra en variabel og ikke gemmer noget direkte i den, så kan du udelade Lad-proceduren og kun bruge Hent Procedure.
Denne regel gælder også for Let-proceduren. Du må kun bruge Lad Procedure, hvis du tildeler en værdi ind i en privat variabel, men læs ikke noget tilbage fra den samme variabel, og udelad derefter Hent-proceduren.
Hent og Lad Procedurer vil køre den ene efter den anden, hvis vores udtryk er noget i stil med følgende:
oArea.strDesc =oArea.strDesc &“ – King Size.”
I ovenstående udtryk vil vi Få den eksisterende værdi fra den private variabel p_Desc og rediger beskrivelsen og gem den tilbage i den samme variabel. Kort sagt i et udtryk hvis du bruger ejendomsnavnet til højre for lighedstegnet (= ) Hent Proceduren kaldes og Lad Proceduren køres, når objektegenskabens procedurenavn vises til venstre for lig (= ) underskrive.
Indsæt to sæt egenskabsprocedurer for variablerne p_Length og p_Width. Når du giver procedurenavne i Navn kontrol giv navnet dblLength og dblWidth for at give brugeren et hint om, at disse egenskaber forventer dobbeltpræcisionstal som input.
ClsArea-klasseobjekt med dets egenskabsprocedurer.
Den færdige kode indtil videre med dblLength og dblWidth egenskabsprocedurer er givet nedenfor til reference og for at opdatere din kode.
Option Sammenlign DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePublic p_Width As DoublePublic Property Get strDesc() As String strDesc =p_Desc 'kopiér værdien fra p_DescEnd PropertyPublic Property Lad strDesc(ByVal StrueEngNy) p_Desc. ) As Double dblLength =p_LengthEnd PropertyPublic Property Let dblLength(ByVal dblNewValue As Double) p_Length =dblNewValueEnd PropertyPublic Property Get dblWidth() As Double dblWidth =p_WidthEnd Property =p_WidthEnd PropertyPublic Property Let dblVidth Double dblBW>NyEjendom dblVidDblBW>NewTestprogrammet med ændringer.
Hvis du er færdig med at udfylde ovenstående kode, så lad os foretage ændringer i vores testprogram for at afspejle de ændringer, vi har lavet her. Den ændrede prøvekode er angivet nedenfor.
Option Sammenlign DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsArea'Property Lad procedurer kaldet hereoArea.strDesc ="Tæppe"oArea.dblLength =25oArea.dblLength =25oArea.dblDebuth ="Dbl5Debuth ="dbl5Debuth =15Debuth. "Width"'Ejendom Få procedurer kaldt her for at printDebug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidthSet oArea =NothingEnd FunctionNår du indtaster en prik (.) umiddelbart efter objektnavnet oArea (oArea.), vises listen over egenskabsprocedurenavne af VBA IntelliSense, og du kan vælge det ønskede fra listen uden at indtaste det manuelt.
Formålet med dette klasseobjekt er at beregne arealet af noget, såsom rumareal, tæppe, gulvfliser eller hvilket som helst materiale, som har værdierne længde og bredde. Det betyder, at vi har brug for en offentlig funktion til at beregne arealet af enhver genstands længde, bredde og beskrivelsesværdier, der er indtastet i klasseobjektet.
ClsArea Object Method:Area()
Her er kodeksen for den offentlige funktion:
Public Function Area() As Double Area =Me.dblLength * Me.dblWidthEnd FunctionDu kan indsætte denne funktion fra Indsæt Menu ved at gå ind i Område i Navn Kontrol, vælg Funktion fra Type indstillingsgruppe og Offentlig som Omfang ind i ClsArea klassemodulet. Fuldfør funktionen ved at indtaste linjen i midten.
Vi kan adressere p_Length og p_Width variabler direkte (fordi funktionen Area() er en del af klassemodulet) i udtrykket til beregning af arealet. Men vi tager den rigtige rute og kalder Get Procedures dblLength og dblWidth til beregning. Du har måske bemærket referencen Mig. bruges til at kvalificere dblLength, dblWidth Get-procedurerne, som vi plejede at skrive i Form/Report Class Modules, for at henvise til det aktuelle objekt i hukommelsen og dets egenskaber. Som jeg sagde tidligere, kan vores Custom Class Object have flere Object-forekomster åbnet i hukommelsen på samme tid og Mig nøgleord refererer til den aktuelle instans, som funktionsområde() tilhører.
Testfunktionen med modifikation.
Rediger vores testfunktion ClassTest1() for at inkorporere Area()-funktionens output som nedenfor:
Option Sammenlign DatabaseOption ExplicitPublic Function ClassTest1()Dim oArea As ClsAreaSet oArea =New ClsAreaoArea.strDesc ="Tæppe"oArea.dblLength =25oArea.dblWidth =""Print "Debugth.Area", "Print "Descript.Ath.", "Debug.Print oArea.strDesc, oArea.dblLength, oArea.dblWidth, oArea.AreaSet oArea =NothingEnd FunctionÆndringen er kun i Debug.Print-sætningerne. Kør koden og tjek fejlfindingsvinduet for resultatet.
Der kræves to hændelsesprocedurer i de tilpassede klassemoduler:Class_Initialize() og Class_Terminate() .
Auto-udførelsesmetoder.
Class_Initialize() programmet udføres automatisk, når vi instansierer et objekt med Ny Nøgleord. Dette program kan bruges til at indstille standardværdier i variabler eller instansiere andre objekter i hukommelsen. Et klasseobjekt kan bruge andre klasser som underordnede objekt(er) og skal instansieres. Dette aspekt vil vi udforske yderligere og lære, hvordan man gør det senere.
Class_Terminate() programmet kører, når vi forsøger at rydde objektet fra hukommelsen, når Intet søgeord køres i sætningen Set oArea =Nothing . Når programmet, der bruger klasseobjektet, slutter, fjernes forekomsten af objektet i hukommelsen som standard. Men det er en god programmeringspraksis, at vi bruger Set oArea =Nothing sætning som den sidste eksekverbare sætning i vores programmer for at rydde objektet fra hukommelsen.
Vi tilføjer ovenstående programmer i vores klassemodul. Tilføj følgende kode i slutningen af dit klassemodul:
Privat Sub Class_Initialize() p_Length =0 p_Width =0 'MsgBox "Initialize.", vbInformation, "Class_Initialize()"End SubPrivate Sub Class_Terminate() 'MsgBox "Terminate.", vbInformation, "UnderKlasse()_ClassHvis du gerne vil teste disse to underrutiner, skal du fjerne kommentarsymbolet og gøre MsgBox aktiv. Kør dit testprogram en gang til. Du finder Initialiser meddelelsen vises i begyndelsen (klik på OK for at fortsætte) og Afslut meddelelsen vises i slutningen af testprogrammet.
Jeg ved, hvad du tænker nu, som "så meget kode til at gange to variable sammen". Det er rigtigt i det perspektiv, men det er meget sandsynligt, at vi har skrevet kode til lignende problemløsningsproblemer gentagne gange hver gang, duplikere kode til valideringstjek og andre logiske fejlsikringer.
Her skriver vi ikke et almindeligt program, men udvikler et brugerdefineret objekt, der kan bruges mange gange eller kan indgå i andre objekter, hvor end vi har brug for det uden at bekymre os om, hvordan det fungerer, set fra brugerens synspunkt. Microsoft Access har mange indbyggede objekter/funktioner, som vi bruger hele tiden uden at bekymre os om, hvordan det fungerer, ved at indstille deres egenskaber eller parametre og få arbejdet gjort.
Vi har endnu et problem at tage os af, valideringstjek af værdier, der indtastes i dblNewValue Parameter i Lad Egenskabsprocedurer for dblLength() og dblWidth(), for at sikre, at gyldige værdier tildeles til Objektegenskaber p_Length og p_Width .
Negative eller nul-værdier, der indtastes, betragtes som ugyldige, og vi er nødt til at tage forholdsregler for at sikre, at den korrekte værdi indtastes af brugeren.
Udførelse af valideringstjek.
Den ændrede Lad Ejendomsprocedurekodesegmenter er angivet nedenfor. Foretag ændringer i din kode i overensstemmelse hermed.
Offentlig ejendom Lad dblLength(ByVal dblNewValue As Double) Gør Mens dblNewValue <=0 dblNewValue =InputBox("Negative/0 værdier ugyldige:", "dblLength()", 0) Loop p_Length =dblNewValueEndEnd Property(yblVid PropertyPublic dblNewValue As Double) Gør Mens dblNewValue <=0 dblNewValue =InputBox("Negative/0 værdier ugyldige:", "dblwidth()", 0) Loop p_Width =dblNewValueEnd PropertyGør mens. . . Løkke kører gentagne gange, indtil en gyldig værdi (større end 0) er indtastet i dblNewValue af brugeren
Valideringstjek i den offentlige metode:Area()
Vi har brug for endnu en valideringskontrol i Area() Fungere. Hvis brugeren kalder Area()-funktionen uden først at indtaste gyldige værdier for Length og Width, så skal brugeren informeres om det. Vi vil kontrollere, om p_Length og p_Width variabler har gyldige værdier, før vi kører udtrykket til arealberegning. Her er koden:
Public Function Area() As Double If (Me.dblLength> 0) And (Me.dblWidth> 0) Then Area =Me.dblLength * Me.dblWidth Else Area =0 MsgBox "Fejl:Længde/Bredde værdi(er) ) Ugyldig., Program afbrudt." Afslut IfEnd-funktionenDen komplette kode for ClsArea Object.
Den fuldt udfyldte kode for vores klassemodul ClsArea er angivet nedenfor:
Option Sammenlign DatabaseOption ExplicitPrivate p_Desc As StringPrivate p_Length As DoublePublic p_Width As DoublePublic Property Get strDesc() As String strDesc =p_Desc 'kopiér værdien fra p_DescEnd PropertyPublic Property Lad strDesc(ByVal StrueEngNy) p_Desc. ) As Double dblLength =p_LengthEnd PropertyPublic Property Lad dblLength(ByVal dblNewValue As Double) Gør Mens dblNewValue <=0 dblNewValue =InputBox("Negative/0 værdier ugyldige:", "dblLength()", 0) Loop dblNyVærdi Ejendom p_NyVærdi dblWidth() As Double dblWidth =p_WidthEnd PropertyPublic Property Lad dblWidth(ByVal dblNewValue As Double) Gør Mens dblNewValue <=0 dblNewValue =InputBox("Negative/0 værdier ugyldige:", "dblwidth =dblNewValue As Double) Funktion Area() Som Dobbelt If (Me.dblLength> 0) Og (Me.dblWidth> 0) Then Area =Me.dblLength * Me.dblWidth Else Area =0 MsgBox "Fejl:Længde/Bredde værdi(er) ugyldig., Program afbrudt." End IfEnd FunctionPrivate Sub Class_Initialize() p_Length =0 p_Width =0 'MsgBox "Initialize.", vbInformation, "Class_Initialize()"End SubPrivate Sub Class_Terminate() 'MsgBox "Terminate.", vbInformation, SubPrivateC /pre>Test af egenskabsprocedurer og -metoder.
Du kan teste vores Custom Class Object ved at indtaste negative eller 0 værdier som input til dblLength, dblWidth Properties.
I testprogrammet Kommenter linjerne (oArea.dblLength=25 og oArea.dblWidth=15) for at teste Area()-funktionen. Den skulle vise den fejlmeddelelse, vi har skrevet i funktionen.
Vores klassemodul til arealberegning anses nu for at være komplet, og vi har testet og fundet ud af, at det fungerer korrekt. Du kan teste det yderligere for eventuelle logiske fejl, som jeg har overset. Hvis du støder på noget, som jeg ikke havde regnet med, så del det med mig.
Fremtidsplan for test.
Vi har kun testet klasseobjektet for ét element. Vi skal beregne arealet af flere genstande (f.eks. arealet af 5 soveværelser eller 10 forskellige størrelser tæpper og så videre. Vi får at vide, at når et objekt er udviklet, kan vi instantiere det flere gange i hukommelsen ved at tildele et andet sæt værdier ind i hver forekomst af objektet og kan arbejde med dem.
Udover det kan dette objekt bruges som en del af andre objekter, vi udvikler med mindre kode, fordi en del af vores nye klasseobjekt allerede er udviklet i ClsArea klassemodulet.
I næste uge lærer vi, hvordan man opretter en række tilpassede objekter for at beregne arealet af flere elementer.
- 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
- Grundlæggende om Ms-Access og Collection Object
- 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