Access
 sql >> Baza danych >  >> RDS >> Access

Klasa bazowa MS-Access i obiekty pochodne

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.

  1. Moduł klasy MS-Access i VBA.
  2. 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.

  1. Moduł klasy MS-Access i VBA
  2. Tablice obiektów klasy MS-Access VBA
  3. Klasa bazowa MS-Access i obiekty pochodne
  4. Klasa podstawowa VBA i obiekty pochodne-2
  5. Warianty klasy bazowej i obiektów pochodnych
  6. Ms-Access Recordset and Class Module
  7. Dostęp do modułu klas i klas opakowujących
  8. Transformacja funkcjonalności klasy opakowującej
  9. Podstawy dostępu do MS i obiektów kolekcji
  10. Moduł klasy Ms-Access i obiekt kolekcji
  11. Rekordy tabeli w obiekcie i formularzu kolekcji
  12. Podstawy obiektów słownikowych
  13. Podstawy obiektów słownika-2
  14. Sortowanie kluczy obiektów i elementów słownika
  15. Wyświetl rekordy ze słownika do formularza
  16. Dodaj obiekty klasy jako elementy słownika
  17. Aktualizuj element słownika obiektów klasy w formularzu


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z nawigacji tylko za pomocą klawiatury w programach Word, Excel i PowerPoint (Część 2:Okna dialogowe)

  2. Dowiedz się, jak tworzyć formularze w pamięci (tak, dobrze słyszałeś)

  3. Używanie dużych parametrów dla procedury składowanej Microsoft SQL z DAO

  4. Powody, dla których należy optymistycznie patrzeć na przyszłość Microsoft Access

  5. Masz problemy z awarią MS Access? Najpierw wypróbuj te rozwiązania