Kapitel 5: Programmieren mit Objekten
Test
Öffnen Sie das Formular und werden Sie Zeuge seiner wundersamen Vermehrung (siehe Abbildung 5.17).
Da das neu erzeugte Formular alle Eigenschaften des Originals erbt, wozu auch die Position gehört, ist es
zunächst fast deckungsgleich mit der Standardinstanz. Sie müssen es also anfassen und verschieben, um die
darunter liegende Standardinstanz freizulegen. In jeder der beiden Kopien bzw. Nicht-Standardinstanzen
können Sie sich völlig unabhängig durch die Datensätze bewegen.
Abbildung 5.17 Das Originalformular (oben) und die zwei erzeugten Instanzen (unten)
Mit einer eigenständigen Klasse experimentieren
Klassenmodul; Property Let- und Property Get-Eigenschaftsmethoden, Initialize- und Terminate-Ereignis;
Str$- und Val-Funktion; Report-Objekt: Circle-Methode; ScaleWidth-, ScaleHeight-, Width- und Height-
Eigenschaft, Print-Ereignis;
Zu Beginn machen wir uns Gedanken über die von der Klasse benötigten Zustandsvariablen, diese müssen
nicht identisch mit den Eigenschaften sein! In unserem Fall brauchen wir nur eine einzige (private) Zu-
standsvariable r. Warum? Wie die folgende Tabelle zeigt, lassen sich alle drei Eigenschaften (Radius, Um-
fang, Flaeche) auf r zurückführen (so genannte »berechnete« Eigenschaften).
Lesezugriff (Property Get) Schreibzugriff (Property Let)
Radius = r r = Radius
Umfang = 2 * Pi * r r = Umfang / 2 / Pi
Flaeche = Pi * r * r r = Sqr(Flaeche / Pi)
Tabelle 5.14 Alle Eigenschaften eines Kreises hängen von r ab
282
Quelltext (Klassenmodul)
Über das Menü
Einfügen/Klassenmodul
erstellen wir folgendes Klassenmodul:
Private Const Pi = 3.1416
Private r As Double ' Zustandsvariable
' Eigenschaftsprozeduren ---------------------------------------
Property Get Radius() As Double ' Radius lesen
Radius = r
End Property
Property Let Radius(rad As Double) ' Radius schreiben
r = rad
End Property
Property Get Umfang() As Double ' Umfang lesen
Umfang = 2 * Pi * Radius
End Property
Property Let Umfang(umf As Double) ' Umfang schreiben
Radius = umf / 2 / Pi
End Property
Property Get Flaeche() As Double ' Fläche lesen
Flaeche = Pi * Radius * Radius
End Property
Property Let Flaeche(flae As Double) ' Fläche schreiben
Radius = Sqr(flae / Pi)
End Property
' Methode ---------------------------------------------------
Sub zeichneMich(rep As Report)
rep.Circle (rep.ScaleWidth / 2, rep.ScaleHeight / 2), Radius
End Sub
Die folgenden beiden Event-Handler stehen einem Klassenmodul standardmäßig zur Verfügung.
Sub Class_Initialize() ' beim Initialisieren eines Objekts
MsgBox "Die Klasse 'CKreis' wurde initialisiert!"
End Sub
Sub Class_Terminate() ' beim Zerstören eines Objekts
MsgBox "Die Instanz der Klasse 'CKreis' wurde aus dem Speicher entfernt!"
End Sub
Wir speichern das Klassenmodul unter dem Namen CKreis ab
1
. Dieser Name kennzeichnet die Objekt-
klasse, für welche wir später (von anderen Modulen aus) Instanzen bilden werden.
1
Es ist allgemein üblich, aber nicht zwingend vorgeschrieben, dass benutzerdefinierte Klassen mit dem Großbuchstaben »C« begin-
nen.
283
Praxisbeispiele
Kapitel 5: Programmieren mit Objekten
Berichtsoberfläche
Unser Klassenmodul soll von einem Bericht benutzt werden. Dessen Oberfläche ist im Handumdrehen er-
stellt. In den Kopfbereich eines neuen Berichts platzieren Sie ein Bezeichnungsfeld für die Überschrift. Drei
weitere Bezeichnungsfelder (Bezeichnung1, Bezeichnung2 und Bezeichnung3) setzen Sie an den linken Rand
des Detailbereichs.
Abbildung 5.18 Der Bericht in der Entwurfsansicht
Quelltext (Berichtsmodul)
Dim krs As New CKreis ' Objektinstanz bilden
Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)
Dim title As String, msg As String, answ As String
Dim rmax As Integer
rmax = Me.Height / 2 ' Default-Radius
' Radius eingeben ---------------------------------------------
msg = "Geben Sie einen Wert zwischen 0 und " & Str$(rmax) & " ein!"
answ = InputBox(msg, "Radius des Kreises", rmax)
' selbst definiertes Objekt benutzen ---------------------------
krs.radius = Val(answ) ' Eigenschaft zuweisen
Call krs.zeichneMich(Me) ' Methode aufrufen
' Koordinatenkreuz für Detailbereich zeichnen -----------------
Me.DrawStyle = 3
Me.Line (0, Me.Height / 2)-(Me.Width, Me.Height / 2)
Me.Line (Me.Width / 2, 0)-(Me.Width / 2, Me.Height)
' Informationen anzeigen --------------------------------------
Bezeichnungsfeld1.Caption = Bezeichnungsfeld1.Caption & Str$(krs.Radius) & " Twips"
Bezeichnungsfeld2.Caption = Bezeichnungsfeld2.Caption & Str$(Round(krs.Umfang)) & " Twips"
Bezeichnungsfeld3.Caption = Bezeichnungsfeld3.Caption & Str$(Round(krs.Flaeche)) & " Quadrat-Twips"
End Sub
284

Get Microsoft Office Access 2007-Programmierung - Das Handbuch now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.