Wprowadzenie.
Zdarza się, że konkretny moduł klasy musi zostać utworzony więcej niż jeden raz, aby użyć podobnego zestawu wartości dla określonej aplikacji.
Na przykład nasz moduł klasy ClsArea, który zaprojektowaliśmy do obliczania powierzchni dywanów w pokojach, jest kandydatem do podobnych zastosowań. Załóżmy, że chcielibyśmy dowiedzieć się, ile płytek podłogowych musimy ułożyć w pokoju, wtedy powinniśmy być w stanie wprowadzić również wartości długości i szerokości płytki, oprócz wartości wymiarów podłogi. Ponieważ zarówno Floor, jak i Tile mają podobne wartości Property jako dane wejściowe, możemy użyć dwóch instancji modułu ClsArea Class Module, jednej instancji dla obszaru FLOOR i drugiej instancji dla obszaru TILE. Floor-Area / Tile-Area podaje całkowitą liczbę płytek dla danego pomieszczenia.
Dwie instancje tego samego modułu klasy.
Możemy to zrobić, tworząc dwie różne instancje modułu klasy ClsArea w programie modułu standardowego, jeśli jest tylko jeden pokój.
Public Sub FloorTiles() Dim FLOOR As ClsArea Dim TILES As ClsArea Dim flrArea As Double, tilearea As Double Dim lngTiles As Long Set FLOOR = New ClsArea Set TILES = New ClsArea FLOOR.strDesc = "Bed Room1" FLOOR.dblLength = 25 FLOOR.dblWidth = 15 flrArea = FLOOR.Area() TILES.strDesc = "Off-White" TILES.dblLength = 2.5 TILES.dblWidth = 1.25 tilearea = TILES.Area() lngTiles = flrArea / tilearea Debug.Print FLOOR.strDesc & " Required Tiles: " & lngTiles & " Numbers - Color: " & TILES.strDesc Set FLOOR = Nothing Set TILES = Nothing End Sub
Obsługa tablicy obiektów.
Ale co, jeśli musimy zastosować powyższą metodę dla szeregu pomieszczeń o różnych rozmiarach lub kolorach płytek? Odpowiedzią na to jest utworzenie nowego modułu klasy z dwoma wystąpieniami tego samego ClsArea Klasa, jedna instancja dla Piętro, a drugi dla kafelków Nieruchomości. Obie instancje są opakowane w nowy moduł klasy.
Zróbmy to.
- Otwórz swoją bazę danych i wyświetl okno edycji kodu (ALT+F11).
- Wybierz Moduł zajęć od Wstaw Menu.
- Zmień nazwę Wartość właściwości do ClsTiles .
- Skopiuj i wklej następujący kod VBA do modułu klasy ClsTiles i zapisz kod:
Option Compare Database Option Explicit Private pFLOOR As ClsArea Private pTILES As ClsArea Private Sub Class_Initialize() Set pFLOOR = New ClsArea Set pTILES = New ClsArea End Sub Private Sub Class_Terminate() Set pFLOOR = Nothing Set pTILES = Nothing End Sub Public Property Get Floor() As ClsArea Set Floor = pFLOOR End Property Public Property Set Floor(ByRef NewValue As ClsArea) Set pFLOOR = NewValue End Property Public Property Get Tiles() As ClsArea Set Tiles = pTILES End Property Public Property Set Tiles(ByRef NewValue As ClsArea) Set pTILES = NewValue End Property Public Function NoOfTiles() As Long NoOfTiles = pFLOOR.Area() / pTILES.Area() End Function
Obie instancje, pFLOOR i pTILES są zadeklarowane jako prywatne właściwości obiektu klasy ClsTiles.
Class_Initialize() Podprogram tworzy instancję obu obiektów w pamięci, gdy ClsTiles Moduł klasy jest tworzony w programie użytkownika.
Class_Terminate() podprogram usuwa obie instancje (pFLOOR i pTILES) z pamięci, gdy instancja ClsTiles Class Module jest ustawiona na Nothing w programie użytkownika.
Pobierz i Ustaw Procedury właściwości umożliwiają pobieranie i przypisywanie wartości odpowiednio z i do instancji pFLOOR w obiekcie klasy ClsTiles.
Następna procedura pobierania i ustawiania właściwości zezwala na te same operacje w instancji pTILES klasy ClsArea.
Dodaliśmy nową funkcję NoOfTiles() w nowym module klasy, aby obliczyć liczbę płytek w oparciu o wymiary podłogi i płytki.
Napiszmy Program i nauczmy się korzystać z wielu wystąpień tego samego obiektu klasy w nowym module klasy:ClsTiles.
- Skopiuj i wklej następujący kod VBA do modułu standardowego:
Public Sub TilesCalc() Dim FTiles As ClsTiles Dim TotalTiles As Long Set FTiles = New ClsTiles FTiles.Floor.strDesc = "Warehouse" FTiles.Floor.dblLength = 100 FTiles.Floor.dblWidth = 50 FTiles.Tiles.dblLength = 2.5 FTiles.Tiles.dblWidth = 1.75 TotalTiles = FTiles.NoOfTiles() Debug.Print "Site Name", "Floor Area", "Tile Area", "No. of Tiles" Debug.Print FTiles.Floor.strDesc, FTiles.Floor.Area, FTiles.Tiles.Area, TotalTiles End Sub
- Utrzymuj otwarte okno debugowania (CTRL+G), aby wydrukować dane testowe.
- Kliknij gdzieś w środku kodu VBA i naciśnij F5 Klucz do uruchomienia kodu. Wynik jest drukowany w oknie debugowania.
Jeśli chcesz obliczyć wymagania dotyczące płytek kilku pomieszczeń lub pomieszczeń kilku pięter wieżowca, powinieneś uruchomić powyższy program kilka razy i zanotować wartości, co jest praktycznie bardzo trudne.
Znajdowanie wymagań dotyczących płytek dla kilku pomieszczeń.
Teraz napiszemy inny program, aby znaleźć wymagania dotyczące płytek kilku pomieszczeń, z tablicą ClsTiles Obiekty, wprowadzając wartości właściwości bezpośrednio z klawiatury.
- Skopiuj i wklej następujący kod VBA do modułu standardowego.
Public Sub TilesCalc2() Dim tmpFT As ClsTiles Dim FTiles() As ClsTiles Dim j As Long, L As Long, H As Long For j = 1 To 3 Set tmpFT = New ClsTiles 'Floor dimension With tmpFT.Floor .strDesc = InputBox(Str(j) & ") Floor Desc", , 0) .dblLength = InputBox(Str(j) & ") Floor Length", , 0) .dblWidth = InputBox(Str(j) & ") Floor Width", , 0) End With 'Tile Dimension With tmpFT.Tiles .strDesc = InputBox(Str(j) & ") Tiles Desc", , 0) .dblLength = InputBox(Str(j) & ") Tile Length", , 0) .dblWidth = InputBox(Str(j) & ") Tile Width", , 0) End With ReDim Preserve FTiles(1 To j) As ClsTiles Set FTiles(j) = tmpFT Set tmpFT = Nothing Next 'Take Printout L = LBound(FTiles) H = UBound(FTiles) Debug.Print "FLOOR", "Floor Area", "TILES", "Tile Area", "Total Tiles" For j = L To H With FTiles(j) Debug.Print .Floor.strDesc, .Floor.Area(), .Tiles.strDesc, .Tiles.Area(), .NoOfTiles End With Next 'Remove all objects from memory For j = L To H Set FTiles(j) = Nothing Next End Sub
- Pozostaw otwarte okno debugowania, aby wydrukować tam dane wyjściowe.
- Uruchom kod jak poprzednio i wprowadź wartości wymiarów podłogi i płytek dla trzech pomieszczeń.
Jak widać z powyższego kodu, obie wartości wymiarów Room i Tile trafiają do tej samej instancji Class Object Array, obok siebie.
Powyższy program to demo, które działa tylko dla trzech zestawów wartości w For. . . Następna pętla. Można go modyfikować za pomocą pętli warunkowej, która działa wymaganą liczbę razy, aż kod warunkowego przerwania zakończy program.
Program można zmodyfikować, aby zapisać każdy zestaw wartości danych i wyniki obliczeń w tabeli do wykorzystania w przyszłości.
Klasa opakowania to kontener Klasa instancji innych klas, struktur danych lub kolekcji instancji innych obiektów. Tutaj użyliśmy go do przechowywania dwóch instancji tej samej klasy Object.
Lista wszystkich linków na ten temat.
- Moduł klasy MS-Access i VBA
- Tablice obiektów klasy MS-Access VBA
- Klasa bazowa MS-Access i obiekty pochodne
- Klasa podstawowa VBA i obiekty pochodne-2
- Warianty klasy bazowej i obiektów pochodnych
- Ms-Access Recordset and Class Module
- Dostęp do modułu klas i klas opakowujących
- Transformacja funkcjonalności klasy opakowującej
- Podstawy dostępu do MS i obiektów kolekcji
- Moduł klasy Ms-Access i obiekt kolekcji
- Rekordy tabeli w obiekcie i formularzu kolekcji
- Podstawy obiektów słownikowych
- Podstawy obiektów słownika-2
- Sortowanie kluczy obiektów i elementów słownika
- Wyświetl rekordy ze słownika do formularza
- Dodaj obiekty klasy jako elementy słownika
- Dodaj obiekty klasy jako elementy słownika
- Aktualizuj element słownika obiektów klasy w formularzu