Übung Geburtstage ◦ ?

Lernziele

- benutzerdefinierte Objektklasse
- Property-Prozeduren
- Methoden, Konstruktor, Destruktor
- Repetition: Collection, Objektvariable, Objektverweis, binäre Suche

Wiederholungsfragen

Ein Klick auf den roten Hyperlink zeigt die richtige Lösung.

1. Was ist richtig? Als Gültigkeitsbereich bezeichnet man ...

   1. die Zeitspanne, in welcher der Wert einer Variablen gespeichert bleibt.
   2. den Programmabschnitt, in dem ein Element für andere sichtbar ist.
   3. den Wertebereich eines Datentyps.
   4. eine Let-Property, die Eigenschaftswerte validiert.

2. Was ist richtig? Ein Konstruktor ist ...

   1. eine Methode, die ein Objekt bei der Erstellung initialisiert.
   2. eine Methode, die den Zustand eines Objekts freigibt.
   3. eine Anweisung, die eine Instanz einer benutzerdefinierten Klasse erstellt und den Verweis darauf einer Objektvariablen zuweist.
   4. eine Anweisung, die ein (ActiveX-) Objekt einer 'fremden' Anwendung erstellt und den Verweis darauf einer Objektvariablen zuweist.

3. Sei cEintrag eine Klasse. Wie viele Instanzen dieser Klasse existieren, nachdem die folgende Test-Prozedur ausgeführt wurde?

       Private E1 As cEintrag

       Sub Test()
         Dim E2 As cEintrag
         Set E1 = New cEintrag
         Set E2 = New cEintrag
         Set E1 = E2
       End Sub

   1. 0
   2. 1
   3. 2
   4. 3

4. Sei cEintrag eine Klasse. Wie viele Instanzen dieser Klasse existieren, nachdem die folgende Test-Prozedur ausgeführt wurde?

       Private E1 As cEintrag

       Sub Test()
         Dim E2 As cEintrag
         Set E1 = New cEintrag
         Set E1 = E2
         Set E2 = Nothing
       End Sub

   1. 0
   2. 1
   3. 2
   4. 3

5. Welche Aussage ist falsch ?

   1. Module trennen eine unsichtbare und unantastbare Implementation von einer sichtbaren und zugänglichen Schnittstelle.
   2. Eine Benutzerschnittstelle ist eine Schnittstelle.
   3. Eine Prozedur ist ein Modul. Der Prozedurkopf ist die Schnittstelle, der Prozedurrumpf ist die Implementation.
   4. Klassenmodule besitzen wie Standardmodule keine Schnittstelle. Anders als bei Standardmodulen kann man von Klassenmodulen aber zur Laufzeit mehrere Instanzen erstellen.

6. Ein Klassenmodul enthalte die folgenden Programmzeilen. Welche Aussage ist richtig ?

       Private strName As String

       Public Property Get Name() As String
         strName = Name
       End Property

   1. Name ist eine lesegeschützte Eigenschaft.
   2. strName ist eine schreibgeschützte Eigenschaft.
   3. Das Programm erzeugt einen Laufzeitfehler, da die Let-Property fehlt.
   4. Im Rumpf der Property-Prozedur müsste stehen: Name = strName

Vertiefungsfragen

Bevor Sie mit der eigentlichen Aufgabe beginnen, sollten Sie sich nochmals damit vertraut machen, wie Instanzen einer Klasse erstellt und gelöscht werden. Lösen Sie hierfür die Aufgabe Instanzen erstellen und löschen.

Schreiben Sie das Programm Telefonverzeichnis zu einem Programm für die Verwaltung von Geburtstagen um. Die Arbeitsmappe GeburtstageSkelett.xls enthält ein Programmskelett, das aus dem Telefonverzeichnis-Projekt erstellt wurde. Das folgende Bild zeigt die neue Benutzerschnittstelle:

1. Laden Sie die Arbeitsmappe, und studieren Sie den vorhandenen Programmcode.

   - Welche Module besitzt das Projekt?
   - Nennen Sie alle Ereignisprozeduren.
   - Nennen Sie alle Variablen und beschreiben Sie deren Datentypen, Gültigkeitsbereiche und Lebensdauern.
   - Nennen Sie alle Prozeduren und beschreiben Sie deren Gültigkeitsbereiche.

2. Implementieren Sie die Klasse cEintrag. Neu sollen die Namen und Geburtsdaten (statt Telefonnummern) von Freunden und Bekannten gespeichert werden. Das Klassenmodul enthält bereits zwei Variablen dafür. Implementieren Sie die Property-Prozeduren für den Zugriff auf die Eigenschaften.

   - Bei einer Zuweisung an die Name-Eigenschaft sollen führende und nachfolgende Leerzeichen automatisch gelöscht werden.
   - Wird der Geburtsdatum-Eigenschaft ein Datum zugewiesen, das in der Zukunft liegt, so soll eine Warnung ausgegeben werden. Verwenden Sie zur Überprüfung die Funktion Now() (siehe Hilfe).

   - Über eine schreibgeschützte Eigenschaft soll man das Alter einer Person abfragen können. Verwenden Sie hierfür die Funktion DateDiff() (siehe Hilfe).

     Hinweis: | 'Date' ist ein Datentyp zum Speichern von Daten und Zeiten. Die systemdefinierte Funktion Now() gibt das aktuelle Datum in diesem Format zurück. Year() extrahiert aus einem Datum das Jahr als ganze Zahl. DateDiff() berechnet die Differenz zwischen zwei Daten. Zum Entfernen von Leerzeichen in Zeichenketten bietet VBA die Trim()-Funktion an. Andere wichtige Zeichenkettenfunktionen sind Left(), Mid(), Right() und Len().

3. Wir ändern die Verwaltung des Verzeichnisses. Die Ereignisprozedur suchen_Klick suchte im Telefonverzeichnis sequentiell. Im Programmskelett wurde der Suchalgorithmus in eine Funktion suche() ausgelagert und als binäre Suche neu implementiert.

   - Welche Voraussetzungen müssen erfüllt sein, damit die Binärsuche angewendet werden kann?
   - Studieren Sie die Prozedur suche(). Wie muss ein Aufruf der Prozedur formuliert werden? Was muss übergeben werden, und was gibt die Funktion zurück?

   - Studieren Sie die Ereignisprozedur suchen_Klick, und fügen Sie die fehlende Zeile ein.

     Fragen: | Was ist der Vorteil, wenn man anstatt der sequentiellen die binäre Suche verwendet? Arbeitet der implementierte Algorithmus iterativ oder rekursiv?

4. Die Ereignisprozedur hinzufügen_Klick konnte neue Einträge bisher einfach hinten im Verzeichnis anhängen. Implementieren Sie die Prozedur nun neu so, dass neue Einträge sortiert eingefüllt werden.

   - Die Prozedur initialisiert zunächst das Verzeichnis,
   - erstellt dann ein neues Eintrag-Objekt und
   - weist der Name- und der Geburtsdatum-Eigenschaft die Werte vom Tabellenblatt zu.
   - Wenn das Verzeichnis noch keine Elemente enthält, dann kann der neue Eintrag einfach eingefügt werden.
   - Anderenfalls muss überprüft werden, ob bereits ein Objekt mit demselben Namen existiert. Gegebenenfalls wird die Prozedur mit einer Fehlermeldung abgebrochen.
   - Wenn es im Verzeichnis Namen gibt, die kleiner sind als der neue, dann wird der neue Eintrag hinter dem nächst kleineren eingefügt,
   - sonst wird der neue Eintrag vor dem kleinsten eingefügt.

5. Die Ereignisprozedur auflisten_Klick kann einfach alle Elemente des Verzeichnisses der Reihe nach ausgeben, da das Verzeichnis bereits sortiert ist. Implementieren Sie die Prozedur neu.

LGeburtstage.xls

©abo