260 likes | 515 Views
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?.
E N D
Delphi II - OOP IFB Fortbildung Grundkonzepte der OOP: Beziehungen zwischen Objekten Bsp: Ticketautomat – Stoppuhr - Kontoverwaltung 7.11.2006 Tobias Selinger
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 unit Unit1; uses Windows, Forms, ...mTTicketautomat; type TForm1 = class(TForm) „kennt“-Beziehung: Assoziation Fach-Klasse unit mTTicketautomat; Uses Dialogs, SysUtils; type TTicketautomat = class Aufrufe
Benutzer-Dialog • Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ? GUI-Klasse oder Fachklasse ?
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
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 FachklasseBeispiel: - 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 Dialogsfolgende „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, diedem 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, undergä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) Hundertstel Sekunden Erforderliche Klassen?
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Hundertstel Sekunden
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Hundertstel Sekunden
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Hundertstel Sekunden
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Hundertstel Sekunden
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Hundertstel Sekunden
Stoppuhr: Klassendiagramm Stoppuhr (ohne GUI) Hundertstel Sekunden
Beziehung? Beziehung? Stoppuhr: Klassendiagramm
Aggregation:„hat“ Assoziation:„kennt“ Stoppuhr: Klassendiagramm
Übung: Stoppuhr • Definieren Sie im UML-Editor die Klasse TZaehler. • Exportieren Sie die zugehörige Delphi-Unit unter dem DateinamenmTZaehler.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 Problem: gegenseitige „kennt“-Beziehungen! (Überkreuz-Referenz mehrererUnits in Delphi nicht erlaubt!) Lösung:a) Mehrere Klassen in eine Unitb) Redesign mit „Koppel“-Klassen