Delphi II - OOP IFB Fortbildung Grundkonzepte der OOP: Beziehungen zwischen Objekten Bsp: Ticketautomat – Stoppuhr - Kontoverwaltung 7.11.2006 Tobias Selinger
Ticketautomat: Formular
Ticketautomat: Formular-Klasse
Ticketautomat: Klassendiagramm Aufrufe
Ticketautomat: Beziehung? GUI-Klasse Fach-Klasse Beziehung? Aufrufe
Ticketautomat: Assoziation GUI-Klasse „kennt“-Beziehung: Assoziation Fach-Klasse Aufrufe
Ticketautomat: Units GUI-Klasse „kennt“-Beziehung: Fach-Klasse unit Unit1; uses Windows, Forms, ... mTTicketautomat; type TForm1 = class(TForm) „kennt“-Beziehung: Assoziation Fach-Klasse unit mTTicketautomat; Uses Dialogs, SysUtils; type TTicketautomat = class Aufrufe
Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ? Benutzer-Dialog Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ? GUI-Klasse oder Fachklasse ?
Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ? Benutzer-Dialog Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ? Die GUI-Klasse: - Buttons, Edit-Felder, Dialog-Boxen etc. (typischerweise) - Ereignisbehandlungs-Prozeduren - Aufruf der Methoden der bekannten Fachklasse - Behandeln / Anzeigen der Rückgabewerte
Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ? Benutzer-Dialog Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ? Die GUI-Klasse: - Buttons, Edit-Felder, Dialog-Boxen etc. (typischerweise) - Ereignisbehandlungs-Prozeduren - Aufruf der Methoden der bekannten Fachklasse Beispiel: - Behandeln / Anzeigen der Rückgabewerte procedure TForm1.GeldEinwerfenButtonClick(Sender: TObject); var betrag: integer; begin betrag := strtoint(InputBox('Geld einwerfen', 'Betrag', '0')); Automat.geldEinwerfen(betrag); AktuelleAnzahlungEdit.Text:=inttostr(Automat.gibAktuelleAnzahlung); end;
Zum Testen: Dialoge innerhalb der Fachklasse Mitunter kann es hilfreich sein, eine Fachklasse alleine zu testen, d.h. a la BlueJ unabhängig von einer GUI-Klasse. Für kurze Dialoge (kleine Ein-/Ausgabefenster) bietet die Unit Dialogs folgende „unabhängige“ Prozeduren und Funktionen: Ausgabefenster: ShowMessage (<Nachricht>) zeigt einen String an. Eingabefenster: InputBox (<Titel>, <Frage>, <Defaultwert>) liefert den eingegebenen String. InputQuery (<Titel>, <Frage>, <String-Variable>) liefert Erfolg (true/false) und belegt ggf. die Variable mit der Benutzer-Eingabe.
Übung zum Ticketautomat und UML-Editor: Einnahmen abholen Kopieren und öffnen Sie das Delphi-Projekt „Ticketautomat“. Starten Sie auch den UML-Editor und importieren Sie die beteiligten Klassen des Ticketautomaten (TForm1 und TTicketautomat, inkl. Code). Ergänzen Sie (im UML-Editor) die Methode EinnahmenAbholen, die dem Automatenbetreiber zur Entnahme der gesamten Einnahmen dient. Exportieren Sie (im UML-Editor) nun die veränderte Klasse nach Delphi, d.h. überschreiben Sie die zugehörige Unit-Datei. Aktualisieren Sie (in Delphi) die veränderte Klasse, und ergänzen Sie die Implementierung der Methode EinnahmenAbholen: - Erfragen und prüfen Sie den korrekten Zugangscode - Setzen Sie die Einnahmen auf Null, bzw. geben Sie eine Meldung „Zugriff verweigert“ aus. Fügen Sie Ihrem Formular einen entsprechenden Button mit Ereignisbehandlungsprozedur hinzu,speichern Sie Ihre Delphi-Dateien und die (aktualisierte) UML-Datei,und testen Sie! Zusatz: Wie könnte man ein Parkticket in der GUI-Listbox ausgeben?
Stoppuhr: Modularisierung? Aufteilung in Module?
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Sekunden Hundertstel Erforderliche Klassen?
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Sekunden Hundertstel
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Sekunden Hundertstel
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Sekunden Hundertstel
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Sekunden Hundertstel
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Sekunden Hundertstel
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Sekunden Hundertstel
Stoppuhr: Klassendiagramm Beziehung?
Stoppuhr: Klassendiagramm Assoziation:„kennt“ Aggregation:„hat“
Übung: Stoppuhr Definieren Sie im UML-Editor die Klasse TZaehler. Exportieren Sie die zugehörige Delphi-Unit unter dem Dateinamen mTZaehler.pas in einen neuen Ordner namens „Stoppuhr“. Beginnen Sie ein neues Delphi-Projekt und speichern Sie alle Projekt-Dateien ebenfalls in diesem Ordner. Fügen Sie Ihrem Projekt die Zähler-Unit hinzu. (Projekt – Hinzufügen... oder Ansicht – Projektverwaltung... ) Implementieren Sie die Zähler-Methoden! Erstellen Sie ein einfaches GUI zum Testen der Zähler-Klasse (z.B. für Zähler erzeugen, Wert anzeigen, erhöhen). Testen Sie! Kopieren und öffnen Sie das Delphi-Projekt „Stoppuhr“, fügen Sie Ihre Zähler-Klasse hinzu und testen Sie! Erweiterung 1: Fügen Sie einen Highscore für die Bestzeit hinzu! Erweiterung 2: Entwickeln Sie eine 24-Stunden-Uhr mit Weckzeit!
Kontoverwaltung
Kontoverwaltung
Kontoverwaltung Problem: gegenseitige „kennt“-Beziehungen! (Überkreuz-Referenz mehrerer Units in Delphi nicht erlaubt!) Lösung: a) Mehrere Klassen in eine Unit b) Redesign mit „Koppel“-Klassen