Wprowadzenie.
Jeśli nie widziałeś wcześniejszych postów na temat modułu Microsoft Access Class Module, przejrzyj je przed kontynuowaniem, linki znajdują się poniżej.
- Moduł klasy MS-Access i VBA.
- Macierz obiektów klasy MS-Access VBA.
Obszar Cls Klasa może działać jako klasa bazowa w innym obiekcie klasy, obliczenia wykonane przez klasę bazową mogą być użyte jako część obliczeń nowego obiektu. Na przykład może być częścią obiektu, który oblicza objętość czegoś,
dbl w dblLength i dblWidth Nazwy procedur właściwości dla Get/Let Procedury są po prostu wskazówką, że obiekt klasy oczekuje wartości długości i szerokości w liczbach o podwójnej precyzji. Podobnie, jeśli zmienimy nazwy procedur właściwości na ilość i cenę jednostkową, wówczas pierwsza wartość pomnożona przez drugą wartość daje nam cenę całkowitą jakiegoś elementu.
Oznacza to po prostu, że możesz użyć klasy ClsArea jako klasy bazowej, gdziekolwiek potrzebujesz wyniku pierwszej wartości pomnożonej przez drugą wartość, np. Cena całkowita * Stawka podatku, aby obliczyć kwotę podatku lub Cena całkowita * Stawka rabatu, aby znaleźć kwotę rabatu i tak dalej.
Mimo że opracowaliśmy prosty moduł klasy, może on być częścią wielu innych klas pochodnych. Możliwości są otwarte na twoją wyobraźnię i kreatywność.
Nasza klasa ClsArea oblicza powierzchnię materiałów, pomieszczeń lub podobnych elementów tylko z właściwościami długości i szerokości. Nie oblicza pola trójkąta ani koła. Ale może być częścią nowego obiektu klasy, który oblicza objętość pomieszczeń i magazynów, aby znaleźć pojemność magazynu. W tym celu potrzebujemy jeszcze jednej wartości Wysokość pomieszczenia, magazynu itp.
Klasa objętości:ClsVolume.
Stwórzmy nowy moduł zajęć ClsVolume, przy użyciu ClsArea jako klasy bazowej. Wstaw moduł zajęć i zmień jego Nazwę Właściwość ClsVolume . Wpisz lub skopiuj i wklej następujący kod do modułu klasy.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() Set p_Area = Nothing End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (p_Height > 0) Then Volume = p_Area.Area * p_Height Else MsgBox "Enter Valid Values for Length,Width and Height.", , "ClsVolume" End If End Function
Kod obiektu klasy ClsVolume nie jest jeszcze kompletny. Przeanalizujmy kod linijka po linijce. W trzecim wierszu zadeklarowanym jako własność prywatna p_Area obiektu klasy ClsArea.
Następna linia deklaruje własność prywatną o nazwie p_Height typu danych Double.
Podprocedury Class_Initialize() i Class_Terminate().
Następne dwie podprogramy (Initialize()) i Zakończ() ) są tutaj bardzo ważne.
Initialize() uruchamia i tworzy instancję obiektu ClsArea w pamięci, gdy używamy i tworzymy wystąpienie ClsVolume Class Obiekt w naszym programie Standard Module.
Kiedy wykonujemy instrukcję Set ClsVolume =Nothing w programie Standard Module, aby usunąć obiekt ClsVolume z pamięci, Terminate() Podprogram uruchamia i zwalnia przestrzeń pamięci zajmowaną przez obiekt ClsArea.
Właściwość Pobierz dblHeight Procedura zwraca wartość z p_Height Własność programu wywołującego.
Właściwość Niech dblHeight Procedura weryfikuje wartość przekazaną do NewValue parametr i przypisuje go do własności prywatnej p_Height .
Funkcja publiczna Volume() oblicza głośność, wywołując p_Area.Area() Funkcja i zwrócona wartość powierzchni jest mnożona przez p_Height, aby obliczyć Volume, z wyrażeniem:Volume =p_Area.Area * p_Height. Jednak przed wykonaniem tej instrukcji przeprowadzamy kontrolę walidacji, aby upewnić się, że funkcja p_Area.Area() zwraca wartość większą od zera, wskazując, że właściwości p_Area.dblLength, p_Area.dblWidth mają prawidłowe wartości, a wartość właściwości p_Height jest większa niż zero.
Uwaga: Ponieważ p_Area Obiekt klasy ClsArea jest zdefiniowany jako Prywatny Własność klasy ClsVolume musimy ustawić jej Właściwości (strDesc, dblLength, dblSzerokość i Obszar() funkcja) widoczne dla świata zewnętrznego dla Pobierz/Pozwól Operacje i zwrócenie wartości powierzchni. Oznacza to, że musimy zdefiniować procedury Get/Let właściwości dla strDesc, dblLength, dblWidth Properties i funkcji Area() obiektu klasy ClsArea również w module klasy ClsVolume.
Procedury Let/Get Property.
Dodaj następującą usługę Get/Let Procedury i Obszar() funkcja do kodu modułu klasy ClsVolume:
Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Sprawdź procedury właściwości strDesc() Get/Let wiersze kodu. Użycie nazwy procedury strDesc to po prostu kwestia wyboru, jeśli chcesz użyć innej nazwy, zapraszamy. Ale oryginalna nazwa właściwości, której użyliśmy w klasie ClsArea, to strDesc. Użycie tutaj tej oryginalnej nazwy przypomina nam o związku z oryginalnym obiektem klasy ClsArea.
W następnej procedurze właściwości Get dblLength() wyrażenie po prawej stronie = znak p_Area.dblLength odczytuje wartość dblLength przechowywaną w obiekcie klasy ClsArea i powraca do programu wywołującego.
Procedura właściwości Let przypisuje wartość parametru w zmiennej NewValue do właściwości p_Area.dblLength obiektu klasy ClsArea. Tutaj nie przeprowadzamy żadnej kontroli walidacji otrzymanej wartości w zmiennej parametru NewValue. Sprawdzanie poprawności zostanie wykonane w samej klasie ClsArea, gdy przypiszemy wartość do p_Area.dblLength właściwość.
Podobnie, procedury Get/Let Property są również dodawane dla właściwości p_Area.dblWidth,
Następnie p_Area.Area() Funkcja jest widoczna dla programu wywołującego poprzez obiekt klasy ClsVolume.
Kod modułu klasy pochodnej ClsVolume.
Kompletny kod modułu klasy ClsVolume znajduje się poniżej.
Option Compare Database Option Explicit Private p_Area As ClsArea Private p_Height As Double Private Sub Class_Initialize() ‘Open ClsArea Object in Memory with the name p_Area Set p_Area = New ClsArea End Sub Private Sub Class_Terminate() ‘Removes the Object p_Area from Memory Set p_Area = Nothing ‘ End Sub Public Property Get dblHeight() As Double dblHeight = p_Height End Property Public Property Let dblHeight(ByVal dblNewValue As Double) Do While Val(Nz(dblNewValue, 0)) <= 0 dblNewValue = InputBox("Negative/0 Values Invalid:", "dblHeight()", 0) Loop p_Height = dblNewValue End Property Public Function Volume() As Double If (p_Area.Area() > 0) And (Me.dblHeight > 0) Then Volume = p_Area.Area * Me.dblHeight Else MsgBox "Enter Valid Values for Length,Width and Height.",vbExclamation , "ClsVolume" End If End Function ‘ClsArea Class Property Procedures and Method are exposed here Public Property Get strDesc() As String strDesc = p_Area.strDesc End Property Public Property Let strDesc(ByVal NewValue As String) p_Area.strDesc = NewValue End Property Public Property Get dblLength() As Double dblLength = p_Area.dblLength End Property Public Property Let dblLength(ByVal NewValue As Double) p_Area.dblLength = NewValue End Property Public Property Get dblWidth() As Double dblWidth = p_Area.dblWidth End Property Public Property Let dblWidth(ByVal NewValue As Double) p_Area.dblWidth = NewValue End Property Public Function Area() As Double Area = p_Area.Area() End Function
Wiem, o czym teraz myślisz:na przykład „to jest podwójna praca, fajnie jest, jeśli możemy w jakiś sposób pominąć te kroki ponownego powtarzania procedur właściwości ClsArea w klasie ClsVolume ”. Albo powiedzmy, że moglibyśmy dodać właściwość dblWidth w samym ClsArea i uruchomić metody Area() i Volume() bezpośrednio z tego miejsca, prawda?
Sedno sprawy polega na tym, że obiekt klasy bazowej może stać się częścią projektowania innego obiektu klasy.
Pamiętaj, cały pomysł zaprojektowania obiektu modułu klasy wielokrotnego użytku jest to, że główne programy korzystające z obiektu klasy będą proste, a zawiłości wbudowane w obiekt klasy pozostaną ukryte.
Tak, możemy to zrobić na więcej niż jeden sposób, również za pomocą kompaktowego kodu. Omówimy je później, ale na razie kontynuujmy nasz pierwotny plan.
Główny program, który używa klasy ClsVolume.
Przetestujmy naszą nową klasę ClsVolume w głównym programie w module standardowym. Przykładowy kod znajduje się poniżej.
Public Sub TestVolume() Dim vol As ClsVolume Set vol = New ClsVolume vol.strDesc = "Warehouse" vol.dblLength = 25 vol.dblWidth = 30 vol.dblHeight = 10 Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With vol Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area(), .Volume() End With End Sub
Widzisz, jak prosty jest program główny, bez linii drukowania?
Skopiuj i wklej kod do modułu standardowego. Naciśnij klawisze Ctrl + G, aby wyświetlić okno debugowania, jeśli nie jest jeszcze w stanie otwartym. Kliknij gdzieś w środku kodu i naciśnij F5 Klucz do uruchomienia kodu. Przykładowe dane wyjściowe w oknie debugowania pokazano poniżej.
Description Length Width Height Area Volume Warehouse 25 30 10 750 7500
Opis Długość Szerokość Wysokość Powierzchnia Kubatura
Magazyn 25 30 10 750 7500
Kontrole walidacyjne Testy wydajności.
Przeprowadzimy testy, aby sprawdzić, czy sprawdzanie poprawności wartości wejściowych klasy ClsArea klasy bazowej działa, gdy wartości są do niej przekazywane przez klasę ClsVolume. Przeprowadziliśmy również pewne sprawdzenia poprawności w funkcjach Area() i Volume().
Wypróbujmy je jeden po drugim:
Najpierw przekażemy wartość ujemną do właściwości ClsArea.dblLength za pośrednictwem klasy ClsVolume. Powinno to wywołać komunikat o błędzie i otworzyć funkcję Inputbox() w pętli Do While…, aby wprowadzić poprawną wartość.
1. Zastąp wartość 25 w wierszu Vol.dblLength =25 , z –5 i naciśnij F5 Klucz do uruchomienia kodu.
Kontrola walidacyjna wywoła błąd i poprosi o wartość większą niż zero. Wprowadź wartość większą niż 0. Następnie przywróć wartość 25 w wierszu, zastępując –5.
2. Wyłącz wiersz Vol.dblHeight =10, wstawiając symbol komentarza (‘) na początku wiersza, jak pokazano:‘Vol.dblHeight =10 . Po zmianie naciśnij klawisz F5, aby uruchomić kod.
Ponieważ nie ma wartości wejściowej przekazywanej do właściwości, funkcja Vol.Volume() wygeneruje błąd mówiący, że wszystkie trzy właściwości:dblLength, dblWidth i dblHeight powinny mieć w sobie wartości, aby uruchomić funkcję Volume.
Podobnie, możesz również sprawdzić wydajność funkcji Vol.Area().
Możemy utworzyć funkcję drukowania danych i przekazać obiekt ClsVolume jako parametr do funkcji i wydrukować wartości w oknie debugowania.
Zmieniony kod głównych programów.
Zmieniony kod dla obu Programów podano poniżej:
Public Sub TestVolume() Dim Vol As ClsVolume Set Vol = New ClsVolume Vol.strDesc = "Warehouse" Vol.dblLength = 25 Vol.dblWidth = 30 Vol.dblHeight = 10 Call CVolPrint(Vol) Set Vol = Nothing End Sub
Public Sub CVolPrint(volm As ClsVolume) Debug.Print "Description", "Length", "Width", "Height", "Area", "Volume" With volm Debug.Print .strDesc, .dblLength, .dblWidth, .dblHeight, .Area, .Volume End With End Sub
W przyszłym tygodniu zbudujemy obiekt klasy objętości z mniejszą ilością kodu.
Linki do wszystkich stron 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
- Aktualizuj element słownika obiektów klasy w formularzu