sql >> Databáze >  >> RDS >> Access

Pole objektů třídy VBA Ms-Access

Úvod.

Minulý týden jsme měli krátké představení jednoduchého Objektu vlastní třídy pouze se dvěma vlastnostmi pro délku a Šířka Hodnoty. Metoda pro výpočet plochy čehokoli, s hodnotami délky a šířky. Doufám, že jste pochopili základy modulu vlastní třídy Ms-Access. Pokud ne, zde je odkaz:Ms-Access Class Module a VBA. Než budete pokračovat, navštivte prosím stránku.

Class Module Objects ušetří spoustu kódu ve vašich programech. Když najdete něco, co děláte opakovaně v kódu, vzpomeňte si na objekt modulu třídy. Opakující se kód lze také přeměnit na užitečnou funkci, ale pro objekty třídy musíte zvolit jiný přístup.

U jednoduchého úkolu může vylepšování funkcí Class Module Object vyžadovat více kódu, ale vaše hlavní modulové programy budou jednoduché a veškerý komplikovaný kód vyvinutý a rafinovaný zůstane ostatním skryt.

Ale prozatím máme v ruce jednoduchý modul třídy, který si vyzkoušíme, jak vytvořit pole objektů pro výpočet oblasti mnoha položek.

Podrutina ClassArray().

Ukázkový kód VBA ve standardním modulu vytvoří pole pěti objektů třídy ClsArea a vytiskne jejich hodnoty vlastností a výsledek metody v okně ladění. Zkopírujte a vložte (nebo lépe, když je zadáte, abyste každý řádek lépe poznali, co dělají) následující kód do standardního modulu:

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
 

Klikněte někam doprostřed kódu a stisknutím klávesy F5 kód spusťte. Zadejte hodnoty pro popis, délku a šířku z klávesnice pro 5 různých položek, jednu po druhé.

Ukázka běhu programu je uvedena níže:

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 

Recenze kódu řádek po řádku.

Podívejme se na kód řádek po řádku. V oblasti deklarace jsme deklarovali objektovou proměnnou tmpA typu ClsArea. Na druhém řádku je deklarováno prázdné pole CA() typu ClsArea. Požadovaný počet prvků bude později v programu předimenzován.

Na dalších dvou řádcích jsme deklarovali proměnné title typu String a j, L, a U proměnné typu Long Integer.

Dále je proměnná title inicializována řetězcem ‚ClassArray‘ a bude použita jako nadpis ve funkci InputBox(). Pro….Další smyčka je nastavena pomocí řídicí proměnné j spustit smyčku pětkrát. Po dalších dvou řádcích komentáře Nastavit výpis instanciuje (přiděluje paměť) Objekt třídy ClsArea v paměti s názvem tmpA .

Následující tři řádky kódu slouží k zadávání hodnot pro strDesc , dblLength, a dblWidth Vlastnosti objektu třídy tmpA.

Po dalším řádku komentáře je objekt třídy ClsArea (CA) předimenzován na 1 až j krát (1 až 1krát) zachováním existujících prvků Object, pokud existují (toto je první objekt v poli). Toto se bude neustále zvyšovat prostřednictvím ReDim příkazu na 1 až 2, 1 až 3, 1 až 4 a 1 až 5 zachováním dřívějších hodnot objektu v rámci For . . . Další smyčka. Možnost Zachovat klíčové slovo zajišťuje, že se stávající objekty pole neztratí.

Poznámka: Příkaz Re-Dimension zvýší/sníží počet zadaných prvků objektu, ale vymaže existující objekty načtené do pole dříve, bez možnosti Zachovat klíčové slovo.

Sada příkaz na dalším řádku zkopíruje objekt tmpA s jeho daty do CA(j) Nově vytvořený objekt ClsArea j prvek pole.

Další řádek Nastavit tmpA =nic odebere dočasný objekt z paměti.

Cyklus For…Next zopakuje tuto akci ještě čtyřikrát, aby vložil další položky do nově vytvořeného dočasného objektu tmpA, jednu po druhé, a zkopíruje objekt do pole objektů CA.

Další dva řádky za řádkem komentáře najdou rozsah indexu Object Array (najde nejnižší a nejvyšší indexové číslo.

Další Debug.Print příkaz vytiskne řádek záhlaví ve 14 zónách sloupců v okně ladění. Pro . . . Další smyčka s L a U rozsahy čísel indexů vázaného pole spouští vnitřní příkazy pro přístup ke každému objektu z Array CA, s číslem indexu v řídicí proměnné j.

Aktuální odkaz na objekt je nastaven v With. . . Konec namísto opakování názvu objektu CA(j).strDesc, CA(j).dblLength, CA(j).dblWidth a CA(j).Area k vytištění hodnot vlastností objektu a výsledků metody Area() v okně ladění.

Odstraňte symbol komentáře z Stop příkaz k vytvoření pauzy v programu na příkazu Stop. Spusťte kód znovu a zadejte 5 podrobností o položce, abyste mohli experimentovat s objektem Array. Můžete selektivně oslovit kteroukoli vlastnost objektu pomocí čísla Array Index a upravit nebo vytisknout jakoukoli hodnotu v okně ladění, jak je znázorněno níže.


Příkaz Nastavit CA(j) =Nothing v rámci For. . . Další smyčka vymaže objekty pole jeden po druhém z paměti.

Předejte pole objektů třídy jako parametr funkce.

Pole objektů třídy můžeme předat programu jako parametr, jako jsme to udělali s uživatelem definovaným datovým typem.

Vytvořme jednoduchý tiskový podprogram tím, že vyjmeme kód tiskové sekce z hlavního programu a vložíme jej do nového programu.

Zkopírujte kód podprogramu ClassArray(), vložte jej do stejného standardního modulu a změňte název jako ClassArray2(), jak je uvedeno níže.

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
 

Kód ClassArray2 bez části tisku.

Vytvořte nový podprogram, jak je uvedeno níže:

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

End Sub

Zvýrazněte část tisku až k příkazu Stop v programu ClassArray2(), ořízněte zvýrazněnou oblast kódu a vložte ji pod Dim příkazy v ClassPrint() Program. Upravené verze obou kódů jsou uvedeny níže:

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

Program 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

Zkontrolujte změny kódu v obou programech a proveďte opravy, kdykoli je to možné. Klepněte doprostřed kódu ClassArray2() a stisknutím klávesy F5 spusťte program.

Příkaz Call v prvním programu předá pole objektů třídy CA jako parametr ByRef podprogramu ClassPrint(). Program vytiskne vlastnosti objektu a zavolá funkci Area(), aby vypočítala a vrátila hodnotu k tisku.

Příští týden se naučíme, jak používat náš modul třídy ClsArea jako základní třídu k vytvoření nového objektu třídy VBA pro výpočet Volume něčeho.

  1. MS-Access Class Module a VBA
  2. Pole objektů třídy VBA MS Access
  3. Základní třída MS-Access a odvozené objekty
  4. Základní třída VBA a odvozené objekty-2
  5. Základní třída a varianty odvozených objektů
  6. Sada záznamů a modul třídy Ms-Access
  7. Přístup k modulu třídy a třídám Wrapper
  8. Transformace funkčnosti třídy Wrapper
  9. Základy přístupu a shromažďovacích objektů
  10. Modul třídy Ms-Access a objekt kolekce
  11. Záznamy tabulek v objektu a formuláři kolekce
  12. Základy objektů slovníku
  13. Základy objektů slovníku-2
  14. Řazení klíčů a položek objektů slovníku
  15. Zobrazení záznamů ze slovníku do formuláře
  16. Přidat objekty třídy jako položky slovníku
  17. Aktualizovat položku slovníku objektů třídy ve formuláři


  1. Jak aktualizovat tabulku v oracle

  2. Jak převedu celé číslo na řetězec jako součást dotazu PostgreSQL?

  3. Jak používat ora_hash ve sloupci datového typu xmltype

  4. Připojte se k serveru SQL prostřednictvím PDO pomocí ovladače SQL Server Driver