Übung Telefonverzeichnis ◦ ?

Lernziele

- Objektvariablen
- Collection-Objekt
- Objekte erstellen
- Klassenmodul und benutzerdefinierte Objekte

Wiederholungsfragen

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

1. Ist Collection ein spezifischer oder ein allgemeiner Objekttyp Begründen Sie Ihre Antwort.

2. Welche der folgenden Gruppen sind geordnet, welche ungeordnet? Begründen Sie Ihre Antwort.

   1. ..... Personen, die vor einem Bankschalter Schlange stehen
   2. ..... eine Gruppe von Schülern und Schülerinnen auf dem Pausenhof
   3. ..... Bücher in einem Bücherregal
   4. ..... die Bände eines 20-bändigen Lexikons auf einem Bücherregal

3. Was ist richtig? Eigenschaften lassen sich durch ...

   1. private Variablen eines Klassenmoduls beschreiben.
   2. öffentliche Variablen eines Klassenmoduls beschreiben.
   3. private Prozeduren eines Klassenmoduls beschreiben.
   4. öffentliche Prozeduren eines Klassenmoduls beschreiben.

4. Was geben Sie als Objekttyp an, wenn Sie eine Objektvariable für ein benutzerdefiniertes Objekt deklarieren möchten?

   1. Class
   2. Collection
   3. den Namen eines Klassenmoduls
   4. den Namen des Objekts mit einem 'c' davor

5. Was tun Sie, wenn Sie in VBA eine neue Objektklassen erstellen möchten?

   1. Sie erstellen ein Klassenmodul mit dem Projektexplorer.
   2. Sie erstellen ein Klassenmodul mit dem Objektbrowser.
   3. Sie verwenden das New-Schlüsselwort in einer Set-Anweisung.
   4. Sie verwenden die Add-Methode einer Auflistung.

Vertiefungsfragen

Das Telefonverzeichnis-Projekt soll vollständig in VBA unter Excel implementiert werden. (Die Arbeitsmappe LTelefonverzeichnis.xls enthält die lauffähige Anwendung. Machen Sie sich mit der Benutzerschnittstelle und den Funktionen der Anwendung vertraut, bevor Sie mit der Aufgabe beginnen)

Vorbereitungen

- Gestalten Sie die Benutzerschnittstelle auf einem Tabellenblatt entsprechend dem folgenden Bild.
- Erstellen Sie im Projektexplorer ein neues Standardmodul und benennen Sie es mit Prozeduren. Es wird alle Ereignisprozeduren aufnehmen.
- Benennen Sie die Ein- und Ausgabebereiche, und weisen Sie den Schaltflächen die entsprechenden (noch leeren) Ereignisprozeduren hinzufügen_Klick(), suchen_Klick() und auflisten_Klick() im Modul Prozeduren zu.

Die Arbeitsmappe TelefonverzeichnisSkelett.xls enthält eine fertige Benutzerschnittstelle und ein Programmskelett. Das nächste Bild zeigt das Objektmodell der Anwendung.

1. Implementieren Sie das Verzeichnis:

   - Vereinbaren Sie im Vereinbarungsabschnitt des Moduls Prozeduren eine Objektvariable Verzeichnis für das Telefonverzeichnis.

     Fragen: | Welchen Gültigkeitsbereich und welchen Datentyp geben Sie bei der Vereinbarung der Variablen an? Begründen Sie Ihre Antwort.

   - Implementieren Sie eine Prozedur initialisiere(), die das Verzeichnis-Objekt erstellt und der Variablen zuweist, falls das Objekt noch nicht existiert.

     Fragen: | Wie überprüfen Sie, ob ein Objekt existiert? Weshalb ist eine solche Überprüfung notwendig oder zumindest sinnvoll?

2. Implementieren Sie die benutzerdefinierte Objektklasse cEintrag für die Einträge.

   - Erstellen Sie ein Klassenmodul, und benennen Sie es mit cEintrag.

     Fragen: | Weshalb sollte man ein Klassenmodul sofort sinnvoll benennen, nachdem man es erstellt hat? Ist es wirklich nötig, dem Namen ein c voran zu stellen?

   - Implementieren Sie die beiden Eigenschaften Name und Telefon.

     Fragen: | Welchen Gültigkeitsbereich und welchen Datentyp geben Sie bei der Vereinbarung der Variablen an? Begründen Sie Ihre Antwort.

3. Implementieren Sie die Ereignisprozedur hinzufügen_Klick().

   - Die Prozedur initialisiert zunächst das Verzeichnis (falls noch nicht initialisiert, siehe Aufgabe a),
   - erstellt dann ein neues Eintrags-Objekt,
   - liest die Eigenschaftswerte (Name und Telefon) vom Tabellenblatt ein und
   - fügt das neue Objekt ins Verzeichnis.

   - Schliesslich gibt sie die neue Anzahl Einträge auf dem Tabellenblatt aus.

     Hinweise: | Sie benötigen eine lokale Variable. Vereinbaren Sie diese und implementieren Sie dann die fünf Punkte der Reihe nach (Sequenz von Anweisungen)

4. Implementieren Sie die Ereignisprozedur suchen_Klick().

   - Die Prozedur initialisiert zunächst das Verzeichnis (falls noch nicht initialisiert, siehe Aufgabe a),
   - durchläuft dann alle Einträge des Verzeichnisses und

   - gibt die Telefonnummer aus, falls der Name des aktuellen Eintrags mit dem Namen auf dem Tabellenblatt übereinstimmt.

     Hinweise: | Im Gegensatz zu Aufgabe c) lässt sich diese Aufgabe nicht mehr einfach als Sequenz von Anweisungen implementieren. Sie benötigen eine Wiederholung.

     Fragen: | Begründen Sie Ihre Wahl des Schleifentyps. Was passiert, wenn Sie einen Namen angeben, der nicht in der Liste existiert? Was passiert, wenn ein Name mehrmals in der Liste vorkommt? Schlagen Sie sinnvolle Reaktionen auf diese Ausnahmefälle vor, und überlegen Sie sich, wie man Sie implementieren könnte.

5. Implementieren Sie die Ereignisprozedur auflisten_Klick(). Sie soll vorläufig das noch unsortierte Verzeichnis ausgeben.

   - Die Prozedur löscht zunächst den Ausgabebereich und initialisiert wieder das Verzeichnis.
   - Danach durchläuft sie alle Einträge des Verzeichnisses und gibt Namen und Telefonnummern aus.

   - Sie benötigen eine Zählvariable, um jedes Datenpaar auf einer neuen Zeile des Tabellenblatts ausgeben zu können.

     Hinweise: | Benutzen Sie zum Löschen des Ausgabebereichs die ClearContents-Methode der Range-Objekte.

6. Implementieren Sie in der Prozedur sortiere() einen Sortieralgorithmus, der die Einträge im Verzeichnis alphabetisch in aufsteigender Reihenfolge sortiert.

   - Den Pseudocode finden Sie unten. Arbeiten Sie mit den Positionen der Einträge in der Auflistung (Index), anstatt mit Objektverweisen.
   - Implementieren Sie zunächst die Funktion kleinsterEintrag(), die den Index (Position) des kleinsten Eintrags im Verzeichnis zurück gibt.
   - Implementieren Sie nun die Prozedur sortiere() unter Verwendung der Prozedur kleinsterEintrag().

   - Binden Sie die Prozedur sortiere() in die Ereignisprozedur auflisten_Klick() ein.

         Sortiere durch Auswählen
           Erstelle neues Verzeichnis (ohne Einträge)
           Solange noch Einträge im alten Verzeichnis
             Suche kleinsten Eintrag im alten Verzeichnis
             Füge Eintrag am Ende des neuen Verzeichnis ein
             Entferne Eintrag aus altem Verzeichnis
           Ersetze altes Verzeichnis durch neues Verzeichnis

         Suche kleinsten Eintrag im Verzeichnis
           Setze kleinster Eintrag = erster Eintrag
           Für alle Einträge im Verzeichnis
             Falls aktueller Eintrag < kleinster Eintrag
               Setze kleinster Eintrag = aktueller Eintrag

     Fragen: | Anstatt die Liste erst vor der Ausgabe zu sortieren, könnte man die Einträge bereits bei der Eingabe in der richtigen Reihenfolge einfüllen. Welche Änderungen müssten Sie am Programm vornehmen? Versuchen Sie diese Variante zu implementieren.

LTelefonverzeichnis.xls

©abo