sql >> Databasteknik >  >> RDS >> Access

Ms-Access VBA Class Object Arrays

Introduktion.

Förra veckan hade vi en kort introduktion av ett enkelt Custom Class Object med bara två egenskaper, för Längd och Bredd Värderingar. En metod för att beräkna Area av vad som helst, med längd- och breddvärden. Hoppas du förstod grunderna i en Ms-Access Custom Class Module. Om inte, här är länken:Ms-Access Class Module och VBA. Besök sidan innan du fortsätter.

Class Module Objects sparar mycket kod i dina program. När du hittat något som du gör upprepade gånger i kod, tänk på ett klassmodulobjekt. Den repetitiva koden kan också omvandlas till en hjälpfunktion, men för klassobjekt måste du ta ett annat tillvägagångssätt.

För en enkel uppgift kan det krävas mer kod för att förfina funktionerna i klassmodulobjektet, men dina huvudmodulprogram kommer att vara enkla och all komplicerad kod som utvecklas och förfinas kommer att förbli dold för andra.

Men för tillfället har vi en enkel klassmodul i handen, vi kommer att försöka skapa en array av objekt för att beräkna arean för många objekt.

ClassArray()-underrutinen.

Exempel VBA-koden i standardmodulen skapar en array med fem objekt av ClsArea Class och skriver ut deras egenskapsvärden och metodresultat i felsökningsfönstret. Kopiera och klistra in (eller bättre om du skriver in dem, för att veta varje rad bättre vad de gör) följande kod i en standardmodul:

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
 

Klicka någonstans i mitten av koden och tryck på F5 för att köra koden. Mata in värdena för beskrivning, längd och bredd från tangentbordet för 5 olika objekt, efter varandra.

Exempel på programmet ges nedan:

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 

Granska kod rad för rad.

Låt oss undersöka koden rad för rad. I deklarationsområdet har vi deklarerat en objektvariabel tmpA av ClsArea Type. På den andra raden deklarerades en tom Array CA() av ClsArea Type. Erforderligt antal element kommer att dimensioneras om senare i programmet.

På de följande två raderna har vi deklarerat variabler titel av strängtyp och j, L, och U variabler av typen Långt heltal.

Därefter initieras titelvariabeln med strängen 'ClassArray' och kommer att användas som en titel i InputBox()-funktionen. För….Nästa loop ställs in med en kontrollvariabel j att köra slingan fem gånger. Efter de kommande två kommentarsraderna visas Set uttalande instansierar (allokerar minne) ClsArea Class Objekt i minnet med namnet tmpA .

De nästa tre raderna kod tjänar till att mata in värden för strDesc , dblLength, och dblWidth Egenskaper för tmpA Class Object.

Efter nästa kommentarrad omdimensioneras ClsArea Class Object (CA) för 1 till j gånger (1 till 1 gång) genom att bevara befintliga objektelement, om några (detta är det första objektet i arrayen). Detta kommer att fortsätta öka genom ReDim sats, till 1 till 2, 1 till 3, 1 till 4 och 1 till 5 genom att bevara de tidigare objektvärdena, inom For . . . Nästa slinga. Bevara nyckelordet säkerställer att de befintliga arrayobjekten inte går förlorade.

Obs! Re-Dimension-satsen ökar/minskar antalet angivna objektelement men raderar de befintliga objekten som laddats in i arrayen tidigare, utan Bevara nyckelord.

Set satsen på nästa rad kopierar tmpA-objektet med dess data till CA(j) ClsArea Object nyskapat j arrayelement.

Nästa rad Ange tmpA =Ingenting tar bort det tillfälliga objektet från minnet.

For...Next-loopen upprepar den här åtgärden fyra gånger till för att mata in andra objekt i det nyligen instansierade temporära objektet tmpA, en efter en, och kopierar objektet till CA Object Array.

De nästa två raderna, efter kommentarsraden, hittar Object Array-indexintervallet (hittar de lägsta och högsta indexnumren.

Nästa Debug.Print uttalande skriver ut en rubrikrad i 14 kolumnzoner i felsökningsfönstret. För . . . Nästa slinga med L och U bundna arrayindexnummerintervall kör de inre satserna för att komma åt varje objekt från Array CA, med indexnummer i kontrollvariabel j.

Den aktuella objektreferensen ställs in i Med. . . Avsluta med struktur, snarare än att upprepa objektnamnet CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth och CA(j).Area för att skriva ut objektets egenskapsvärden och metodområde()-resultat i felsökningsfönstret.

Ta bort kommentarsymbolen från Stopp för att skapa en paus i programmet på Stop-satsen. Kör koden igen och ange 5 objektdetaljer så att du kan experimentera med Array-objektet. Du kan selektivt adressera vilken som helst av objektegenskapen, med Array Index-numret, för att redigera eller skriva ut valfritt värde i felsökningsfönstret som visas nedan.


Satsen Ange CA(j) =Ingenting inom For. . . Next Loop rensar arrayobjekten, ett efter ett, från minnet.

Lämna klassobjektmatris som funktionsparameter.

Vi kan skicka Class Object Array som en parameter till ett program, som vi gjorde med User-Defined Data Type.

Låt oss skapa en enkel utskriftssubrutin genom att klippa ut koden för utskriftssektionen för huvudprogrammet och placera den i det nya programmet.

Kopiera ClassArray()-subrutinkoden, klistra in den i samma standardmodul och ändra namnet som ClassArray2(), som visas nedan.

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
 

ClassArray2-koden utan utskrift.

Skapa en ny underrutin enligt nedan:

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

End Sub

Markera utskriftsavsnittet upp till "Stop-satsen i ClassArray2()-programmet, klipp ut det markerade området i koden och klistra in det under Dim uttalanden i ClassPrint() Program. Den modifierade versionen av båda koderna ges nedan:

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

Programmet ClassPrint().

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

Kontrollera om det finns kodändringar i båda programmen och gör korrigeringar där det är tillämpligt. Klicka i mitten av ClassArray2()-koden och tryck på F5 för att köra programmet.

Call-satsen i det första programmet skickar CA Class Object Array som ByRef-parameter till ClassPrint()-subrutinen. Programmet skriver ut objektegenskaperna och anropar funktionen Area() för att beräkna och returnera värdet för utskrift.

Nästa vecka kommer vi att lära oss hur du använder vår ClsArea Class-modul som en basklass för att skapa ett nytt VBA-klassobjekt för att beräkna Volymen av någonting.

  1. MS-Access Class Module och VBA
  2. MS-Access VBA Class Object Arrays
  3. MS-Access basklass och härledda objekt
  4. VBA-basklass och härledda objekt-2
  5. Basklass- och härledda objektvarianter
  6. Ms-Access Recordset och Class Module
  7. Åtkomst till klassmoduler och omslagsklasser
  8. Omvandling av omslagsklassfunktionalitet
  9. Ms-Access och Collection Object Basics
  10. Ms-Access Class Module och Collection Object
  11. Tabellposter i samlingsobjekt och form
  12. Grundläggande om ordbokobjekt
  13. Dictionary Object Basics-2
  14. Sortera ordboksobjektnycklar och objekt
  15. Visa poster från ordbok till formulär
  16. Lägg till klassobjekt som ordboksobjekt
  17. Uppdatera Class Object Dictionary-objekt på formulär


  1. Online kontra offline säkerhetskopiering

  2. Hur man återställer AUTO_INCREMENT i MySQL

  3. Inaktiv session i Oracle av JDBC

  4. Välj slumpmässig rad från en PostgreSQL-tabell med viktade radsannolikheter