sql >> Database >  >> RDS >> Access

Ms-Access VBA Class Object Arrays

Inleiding.

Vorige week hadden we een korte introductie van een eenvoudig Aangepast klassenobject met slechts twee eigenschappen, voor Lengte en Breedte Waarden. Een methode voor het berekenen van oppervlakte van alles, met lengte- en breedtewaarden. Ik hoop dat je de basis van een Ms-Access Custom Class-module hebt begrepen. Zo niet, dan is hier de link:Ms-Access Class Module en VBA. Bezoek de pagina voordat u verdergaat.

Class Module Objects bespaart veel code in uw programma's. Als je iets hebt gevonden dat je herhaaldelijk in Code doet, denk dan aan een Class Module Object. De herhalende code kan ook worden omgezet in een hulpprogramma-functie, maar voor Class Objects moet u een andere benadering kiezen.

Voor een eenvoudige taak kan er meer code nodig zijn om de functies van het Class Module Object te verfijnen, maar uw hoofdmoduleprogramma's zullen eenvoudig zijn en alle ingewikkelde code die is ontwikkeld en verfijnd, blijft voor anderen verborgen.

Maar voor nu hebben we een eenvoudige klassenmodule in de hand. We zullen proberen een reeks objecten te maken om de oppervlakte van veel items te berekenen.

De ClassArray()-subroutine.

De voorbeeld-VBA-code in de standaardmodule creëert een array van vijf objecten van de ClsArea-klasse en drukt hun eigenschapswaarden en methoderesultaat af in het foutopsporingsvenster. Kopieer en plak (of beter als je ze typt, om elke regel beter te weten wat ze doen) de volgende code in een standaardmodule:

Public Sub ClassArray()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
Set tmpA = Nothing 'Remove temporary object from memory.
Next


‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

Klik ergens in het midden van de code en druk op F5 om de code uit te voeren. Voer de waarden voor Beschrijving, Lengte en Breedte van het toetsenbord in voor 5 verschillende items, de een na de ander.

Voorbeeld van het programma wordt hieronder gegeven:

Description   Length        Width         Area
Door Mat       5             8             40 
Carpet         12            23            276 
Bed Room       21            23            483 
Store Room     15            25            375 
Terrace        40            50            2000 

Review van code regel voor regel.

Laten we de code regel voor regel bekijken. In het declaratiegebied hebben we een objectvariabele tmpA . gedeclareerd van het ClsArea-type. In de tweede regel een lege array gedeclareerd CA() van het ClsArea-type. Het benodigde aantal elementen wordt later in het programma opnieuw gedimensioneerd.

In de volgende twee regels hebben we variabelen title . gedeclareerd van het type String en j, L, en U variabelen van het type Long Integer.

Vervolgens wordt de titelvariabele geïnitialiseerd met de tekenreeks 'ClassArray' en wordt deze gebruikt als een titel in de InputBox()-functie. De Voor….Volgende lus wordt ingesteld met een regelvariabele j om de lus vijf keer uit te voeren. Na de volgende twee commentaarregels, de Set verklaring instantieert (wijst geheugen toe) ClsArea Class Object in geheugen met de naam tmpA .

De volgende drie regels code dienen om waarden in te voeren voor strDesc , dblLength, en dblWidth Eigenschappen van tmpA Class Object.

Na de volgende regel met commentaar wordt het ClsArea Class Object (CA) opnieuw gedimensioneerd voor 1 tot j keer (1 tot 1 keer) door de bestaande objectelementen te behouden, indien aanwezig (dit is het eerste object in de array). Dit zal blijven toenemen, via de ReDim statement, tot 1 tot 2, 1 tot 3, 1 tot 4 en 1 tot 5 door de eerdere objectwaarden te behouden, binnen de For . . . Volgende lus. Het Behoud trefwoord zorgt ervoor dat de bestaande array-objecten niet verloren gaan.

Opmerking: De Re-Dimension-instructie verhoogt/verlaagt het aantal opgegeven objectelementen, maar wist de bestaande objecten die eerder in de array zijn geladen, zonder de Preserve trefwoord.

De Set statement in de volgende regel kopieert het tmpA-object, met zijn gegevens naar de CA(j) ClsArea Object nieuw gemaakt j array-element.

Volgende regel Set tmpA =Nothing verwijdert het tijdelijke object uit het geheugen.

De For...Next-lus herhaalt deze actie nog vier keer om andere items een voor een in het nieuw geïnstantieerde tijdelijke object tmpA in te voeren, en kopieert het object naar de CA Object Array.

De volgende twee regels, na de commentaarregel, vinden het indexbereik van Object Array (vindt de laagste en hoogste indexnummers.

De volgende Debug.Print statement drukt een kopregel af in 14 kolomzones in het foutopsporingsvenster. De Voor . . . Volgende lus met de L en U gebonden array-indexnummerbereiken voert de innerlijke instructies uit om toegang te krijgen tot elk object vanuit Array CA, met indexnummer in controlevariabele j.

De huidige objectreferentie wordt ingesteld binnen With. . . Eindig met structuur, in plaats van de objectnaam te herhalen CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth en CA(j).Area om de Property Values ​​en Method Area()-resultaten van het object in het Debug-venster af te drukken.

Verwijder het commentaarsymbool uit de ‘Stop instructie om een ​​pauze in het programma te maken op de stop-instructie. Voer de code opnieuw uit en voer 5 itemdetails in zodat u kunt experimenteren met het array-object. U kunt elk objecteigenschap selectief adresseren, met het array-indexnummer, om elke waarde in het foutopsporingsvenster te bewerken of af te drukken, zoals hieronder weergegeven.


Het statement Set CA(j) =Nothing binnen de Voor. . . Next Loop wist de array-objecten een voor een uit het geheugen.

Klasobjectarray doorgeven als functieparameter.

We kunnen de Class Object Array als parameter doorgeven aan een programma, zoals we deden met User-Defined Data Type.

Laten we een eenvoudige afdruksubroutine maken door de afdruksectiecode van het hoofdprogramma te knippen en in het nieuwe programma te plaatsen.

Kopieer de ClassArray()-subroutinecode, plak deze in dezelfde standaardmodule en verander de naam als ClassArray2(), zoals hieronder weergegeven.

Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String
Dim L As Long, U As Long

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea

     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

‘PRINTING SECTION
'Print the Array contents into the Debug Window
L = LBound(CA)
U = UBound(CA)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With CA(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

’stop

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub
 

De ClassArray2-code zonder afdruksectie.

Maak een nieuwe subroutine zoals hieronder aangegeven:

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

End Sub

Markeer de sectie Afdrukken tot aan de 'Stop-instructie in het ClassArray2()-programma, knip het gemarkeerde gedeelte van de code uit en plak het onder de Dim uitspraken in de ClassPrint() Programma. De gewijzigde versie van beide codes wordt hieronder gegeven:

Public Sub ClassArray2()
Dim tmpA As ClsArea
Dim CA() As ClsArea
Dim j As Long, title As String

title = "ClassArray"
For j = 1 To 5 ‘the Loop is set for 5 items
  'instantiate temporary ClsArea Object
  'to enter input
  Set tmpA = New ClsArea
     tmpA.strDesc = InputBox(Str(j) & ") Description:", title, "")
     tmpA.dblLength = InputBox(Str(j) & ") Enter Length:", title, 0)
     tmpA.dblWidth = InputBox(Str(j) & ") Enter Width:", title, 0)
    
  'Redimension Array
  ReDim Preserve CA(1 To j) As ClsArea
  Set CA(j) = tmpA   'Copy Object to Array
  
 Set tmpA = Nothing 'Remove temporary object from memory.
Next

Call ClassPrint(CA) ‘Pass the Object Array to print routine

'Clear array objects from memory
For j = L To U
   Set CA(j) = Nothing
Next

End Sub

Het ClassPrint()-programma.

Public Sub ClassPrint(ByRef clsPrint() As ClsArea)
Dim L As Long, U As Long
Dim j As Long

'Printing Section
'Print the Array Contents into the Debug Window.
L = LBound(clsPrint)
U = UBound(clsPrint)

Debug.Print "Description", "Length", "Width", "Area"
For j = L To U
  With clsPrint(j)
    Debug.Print .strDesc, .dblLength, .dblWidth, .Area
  End With
Next

End Sub

Controleer op codewijzigingen in beide programma's en voer correcties uit, waar van toepassing. Klik in het midden van de ClassArray2()-code en druk op F5 om het programma uit te voeren.

De Call-instructie in het eerste programma geeft de CA Class Object Array als ByRef-parameter door aan de ClassPrint()-subroutine. Het programma drukt de Objecteigenschappen af ​​en roept de functie Area() aan om de waarde te berekenen en terug te sturen om af te drukken.

Volgende week leren we hoe we onze ClsArea Class-module als basisklasse kunnen gebruiken om een ​​nieuw VBA-klasseobject te maken om het Volume te berekenen. van iets.

  1. MS-Access Class-module en VBA
  2. MS-Access VBA Class Object Arrays
  3. MS-Access-basisklasse en afgeleide objecten
  4. VBA-basisklasse en afgeleide objecten-2
  5. Basisklasse en afgeleide objectvarianten
  6. Ms-Access Recordset en Class Module
  7. Toegang tot klassenmodule en wrapperklassen
  8. Transformatie van functionaliteit van wrapperklasse
  9. Basisprincipes voor MS-Access en verzamelingsobjecten
  10. Ms-Access Class-module en verzamelobject
  11. Tabelrecords in verzamelobject en formulier
  12. Basisprincipes van woordenboekobjecten
  13. Basisprincipes van woordenboekobjecten-2
  14. Woordenboekobjectsleutels en -items sorteren
  15. Records van woordenboek naar formulier weergeven
  16. Klasobjecten toevoegen als woordenboekitems
  17. Klasobjectwoordenboekitem op formulier bijwerken


  1. Onbekende kolom in 'veldlijst'-fout op MySQL Update-query

  2. Hoe krijg ik ASCII-waarde in Oracle?

  3. Hoe Width_Bucket() werkt in PostgreSQL

  4. 6 manieren om een ​​string te converteren naar een datum/tijd-waarde in SQL Server