Delphi II OOP IFB Fortbildung Objektorientiertes Programmieren in
Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008
Drei Objekte. . . 2 OOP mit Delphi Klasse: roter Käfer ? Pol-Ente Objekte TS blauer Jaguar
Drei Objekte von einer gemeinsamen Klasse 3 OOP mit Delphi Klasse: TAuto ? TS Objekte: roter Käfer Pol-Ente blauer Jaguar
TAuto: Methoden? 4 Was sollen Objekte der Klasse TAuto können? OOP mit Delphi Welche Methoden können sie ausführen? TS ?
TAuto: Attribute? 5 Was sollen Objekte der Klasse TAuto können? OOP mit Delphi Welche Methoden können sie ausführen? Welche Attribute besitzen sie? TS ? fahren tanken km-Stand angeben Tankinhalt angeben prüfen, ob Inspektion nötig ist
TAuto: UML-Modell 6 Was sollen Objekte der Klasse TAuto können? OOP mit Delphi Welche Methoden können sie ausführen? Welche Attribute besitzen sie? TS km-Stand Tankinhalt Modell fahren tanken km-Stand angeben Tankinhalt angeben prüfen, ob Inspektion nötig ist UML-Modell: ? Attribute ? Methoden
TAuto: UML-Modell 7 Was sollen Objekte der Klasse TAuto können? OOP mit Delphi Welche Methoden können sie ausführen? Welche Attribute besitzen sie? UML-Modell: km-Stand Tankinhalt Modell fahren tanken km-Stand angeben Tankinhalt angeben prüfen, ob Inspektion nötig ist Beachte: Die Methode erzeuge ist ein sog. Konstruktor, der von der Klasse selbst ausgeführt wird! TS Bsp: neues. Auto : = TAuto. erzeuge(‘Manta 08/15‘)
Zugriffsrechte und Notation 8 Kapselung Zugriffsrechte: (Geheimnisprinzip): UML-Modell: OOP mit Delphi Attribute sind generell privat. Zugriffe nur über Zugriffsmethoden. (z. B. gib. Kmstand ) private ( - ) Attribute öffentliche (public) Methoden ( + ) Weitere Zugriffsrechte: ++ published # protected TS ( = public + im Objektinspektor sichtbar) ( = privat + vererbbar) Bei Methoden zusätzlich: ! für Aufträge (Prozeduren) ? für Anfragen (Funktionen)
TAuto in Delphi 9 UML-Modell: OOP mit Delphi-Code: per UML-Editor (z. B. UMLed ) automatisch erzeugbar bzw. rück-modellierbar ! TS
MVC-Konzept (strikt) mit zwei Views 10 OOP mit Delphi Modell Controller verwaltet das Modell & steuert die Views TS View 1 View 2
MVC-Konzept mit kombiniertem GUI 11 OOP mit Delphi Modell Vorteil: nur ein GUI-Fenster nötig, einfacher Datenaustausch, schnell programmiert Nachteil: unflexibel & verstrickt, konzeptionelle Trennung nur „im Kopf“ des Programmierers! TS Controller + View: GUI * (*) GUI: Graphical User Interface
MVC-Beispiel mit kombiniertem GUI: Auto 12 Controller + View (GUI) Modell unit. TAuto unit Unit 1; uses. . . TAuto; OOP mit Delphi 2 1 procedure TForm 1. Tanken. Button. Click(Sender: TObject); begin auto. tanke(str. To. Float(Input. Box('Tanken', 'Menge: ', '30'))); aktualisiere. Anzeige; end; TS 3
Exkurs: Nützliche Dialoge in Delphi 13 OOP mit Delphi Nützlich für kurze Dialoge (d. h. kleine Ein-/Ausgabefenster) sind die folgenden Prozeduren und Funktionen der Unit Dialogs (per uses einbinden!): Ausgabefenster: Eingabefenster: Show. Message (<Meldung>) Input. Box (<Titel>, <Frage>, <Defaultwert>) zeigt eine einfache Meldung an: erfragt einen einzugebenden String: Message. Dlg (<Meldung>, <Typ>, <Buttons>, 0) [ mb. Yes, mb. No, mb. Cancel, mb. OK, . . . ] TS mt. Warning, mt. Error, mt. Information, mt. Confirmation, . . . zeigt eine konfigurierbare Meldung an. Input. Query (<Titel>, <Frage>, <Variable>) liefert true / false (für Erfolg / Abbruch) und belegt die Variable mit dem eingegebenen String.
Delphi-„tückisches“ 14 Einige typische Delphi-Fehler: OOP mit Delphi • Element nicht bekannt: a) falsche Schreibweise (Tippfehler? ) b) fehlende Zugriffsrechte? (privat? ) c) zugehörige Unit nicht eingebunden? ( uses. . . ; z. B. Dialogs oder eigene Unit) • Ausgabedatei kann nicht erstellt werden: a) läuft das Projekt gerade? ( Abbrechen! s. u. ) b) fehlen Zugriffsrechte? (richtiger Ordner? eigene Kopie? ) • Programm-Absturz: a) bei Objektzugriff? entsprechendes Objekt vorher erzeugen! (nur Formularkomponenten werden automatisch erzeugt) b) bei Arrayzugriff? Indexbereich überprüfen! (Min/Max? Beginn mit 0? ) • Programm „hängt“: Abbrechen: Entweder im Delphi-Menü: Start – Programm zurücksetzen, oder im Taskmanager: laufendes Projekt suchen – dessen Task beenden! TS
Aufgaben zum Auto-Projekt 15 Kopieren Sie den Ordner Auto-Aufgabe in Ihre eigenen Dateien. (Immer den ganzen Ordner!) Öffnen Sie das Projekt und lassen Sie sich auch die Auto-Unit anzeigen! (zu finden in der uses-Klausel, dann per Kontextmenü „Datei beim Cursor öffnen“) Bearbeiten Sie die folgenden Aufgaben (jeweils in der Haupt-Unit oder Auto-Unit): a) Fahren-Button: Ereignisprozedur ergänzen (vgl. Tanken-Button) ! OOP mit Delphi b) fahre-Methode: Auch den km-Stand erhöhen! c) Auto-Modell: Zugriffsfunktion auf den Modellnamen hinzufügen ( - ist nötig für d) ! d) Erzeugen-Button: Auch den Modellnamen im GUI anzeigen! e) im Auto-Modell: Ein Attribut „naechste. Inspektion. Bei. Km“ hinzufügen und diesen Wert im Konstruktor mit 1000 initialisieren! Die Funktion „ist. Inspektion. Noetig“ soll true liefern, falls der aktuelle km-Stand höher liegt! f) Fahren-Button: Jeweils überprüfen, ob eine Inspektion nötig ist und ggf. das Inspektionslabel (als Hinweis) sichtbar machen! Fahren Sie nur los, falls das Benzin ausreicht. . . ! g) Inspektion-Button: Den Inspektions-Hinweis zurücknehmen (d. h. unsichtbar machen) und im Auto-Modell eine Methode „mache. Inspektion“ aktivieren, die den km-Stand für die nächste Inspektion geeignet erhöht! TS h) im Auto-Modell: Ein Attribut Tankvolumen ergänzen und beim Erzeugen per Parameter festlegen! i) Per UML-Editor: Mittels UMLed ein UML-Diagramm der Auto-Klasse erzeugen!
OOP mit Delphi 16 TS Eine große Objekt-“Familie“
Normale Uhr und Spezialisierungen 17 „Normale“ Uhr : Uhrwerk / Zähler für Sek. , Min. , Std, 1/100, . . . OOP mit Delphi Taktgenerator TS Spezialisierungen: Stoppuhr Alarm-Uhr Schach-Uhr Start, Stopp, Reset Alarmzeit einstellen, Alarm an/aus Start, Stopp A, Stopp B
18 Stoppuhr: Modularisierung? OOP mit Delphi Aufteilung in Module? TS
19 Stoppuhr: Klassendiagramm Sekunden OOP mit Delphi Uhrwerk TS Taktgeber Hundertstel Erforderliche Klassen?
Stoppuhr: Klassendiagramm 20 Sekunden Uhrwerk Hundertstel OOP mit Delphi TUhrwerk TS TZähler TForm TTimer (Delphi-Komponente) modulo n
Stoppuhr: Klassendiagramm 21 Sekunden Uhrwerk Hundertstel OOP mit Delphi TUhrwerk TS TZähler TForm TTimer (Delphi-Komponente) modulo n
Stoppuhr: Klassendiagramm 22 Sekunden Hundertstel Uhrwerk OOP mit Delphi TUhrwerk TZähler TForm modulo n TTimer (Delphi-Komponente) ? z. B. ’ 13: 07‘ TS in ms z. B. ‘ 07‘
Stoppuhr: Klassendiagramm 23 Sekunden Hundertstel Uhrwerk OOP mit Delphi TUhrwerk TZähler TForm modulo n TTimer (Delphi-Komponente) ? z. B. ’ 13: 07‘ TS in ms z. B. ‘ 07‘
Stoppuhr: Klassendiagramm 24 Sekunden Hundertstel Uhrwerk OOP mit Delphi TUhrwerk TZähler TForm modulo n TTimer (Delphi-Komponente) z. B. ’ 13: 07‘ TS in ms z. B. ‘ 07‘
Aufgabe: Stoppuhr implementieren 25 Bilden Sie Zweier- oder Dreier-Teams zur Implementierung der Klassen (*): 1) Haupt-Unit mit Formular und Timer-Komponente (aus Registerkarte: System). 2) TUhrwerk. OOP mit Delphi 3) TZaehler. 4) Nutzen Sie für 2) und 3) den UML-Editor zur Erstellung der jeweiligen Klasse: - Erstellen Sie ein entsprechendes UML-Modell. - Exportieren Sie den zugehörigen Code in eine entsprechende Delphi-Unit. - Öffnen Sie diese Unit in Delphi und ergänzen Sie den nötigen Methoden-Code. - Speichern Sie ihre Unit in den Projekt-Ordner der Haupt-Unit, fügen Sie die Unit dem Projekt hinzu, und ergänzen Sie die nötigen uses-Deklarationen. Compilieren und testen Sie - viel Erfolg !! * Spezifikationsdetails: TS TForm 1. init erzeugt das Uhrwerk TUhrwerk. ticke erhöht die Hunderstel und ggf. die Sekunden TUhrwerk. gib. Zeit liefert die Zeit als String im Format ss: hh TZaehler. gib. Stringwert liefert den Wert als zweistelligen String (z. B. ‘ 37‘, ’ 07‘)
Aufgabe: Weitere Uhren modellieren 26 OOP mit Delphi 1. Entwickeln Sie in UML - zunächst auf Papier - geeignete Klassen für eine TS a) 24 -Stunden-Uhr (mit „Stell“-Möglichkeit) b) Uhr mit Weckfunktion c) Schachuhr d) Countdown-Uhr (Tipp: TZaehler um eine Methode „erniedrige“ erweitern!) 2. Implementieren Sie eine dieser Uhren! (Nutzen Sie den UML-Editor!) 3. Hausaufgabe: Realisieren Sie diese Uhr als analoge Zeigeruhr (d. h. mit alternativer View)!
OOP mit Delphi 27 TS Lösung: 24 -Stunden-Uhr (UML)
Lösung: 24 -Stunden-Uhr mit Alarm (UML) OOP mit Delphi 28 Die Klasse TZaehler wird unverändert benutzt! TS
OOP mit Delphi 29 TS Lösung: 24 -Stunden-Uhr mit Alarm (alle Klassen)
Lösung: Schach-Uhr (UML) OOP mit Delphi 30 Tipp zur Implementierung: Zwei 24 -Std-Uhrwerke erzeugen, dann das aktuelle Uhrwerk jeweils mit dem entsprechenden Uhrwerk belegen und „ticken“ lassen! aktuelle. Uhr. A Uhr. B TS
31 Vererbung: Alarmuhr erstmal ohne. . . OOP mit Delphi doppelter Code Vergleich ? ! TS
Vererbung: Alarmuhr erstmal ohne. . . 32 Ohne Vererbung: OOP mit Delphi Die komplette bisherige Klasse T 24 Std. Uhrwerk plus weiterem Code für die Alarm-Funktion. Nachteil: Code-Duplikation! TS Besser geht es mit Vererbung. . .
Alarmuhr mit Vererbung 33 Ohne Vererbung: (vererbbar) OOP mit Delphi Die komplette bisherige Klasse T 24 Std. Uhrwerk plus weiterem Code für die Alarm-Funktion. Nachteil: Code-Duplikation! protected Oberklasse (vererbt an) Unterklasse (erbt von. . . ) Mit Vererbung: TS Durch T 24 Std. Uhrwerk als Oberklasse ist nur noch der Code für die Alarm-Funktion nötig!
34 Alarmuhr mit Vererbung in Delphi: Delphi-Code für Vererbung: protected (vererbbar) OOP mit Delphi Oberklasse Mit Vererbung: TS ruft die ererbte erzeuge-Methode auf Durch T 24 Std. Uhrwerk als Oberklasse ist nur noch der Code für die Alarm-Funktion nötig!
Stoppuhr mit integriertem Timer ? 35 TUhrwerk OOP mit Delphi TTimer TS TForm
Stoppuhr mit integriertem Timer 36 TUhrwerk mit OOP mit Delphi TTimer TS TForm TStopp. Uhr
OOP mit Delphi 37 TS Stoppuhr: Implementierung des Timers Der Timer: Einfach im Konzept, aber tückisch in der Implementierung: constructor TStoppuhr. erzeuge; . . . Timer : = TTimer. Create(nil); Timer. Enabled : = false; Timer. On. Timer : = Timer. Tick; der Timer-Konstruktor verlangt einen „Eigentümer“ die Ereignisprozedur wird hier nur als Name eingetragen, aber hier mit Sender-Parameter deklariert! procedure TStopp. Uhr. Timer. Tick(Sender: TObject); begin Und nicht vergessen, Aufruf der eigentlichen ticke; die Timer-Unit einzubinden: Stoppuhr-Methode! end; uses Ext. Ctrls;
Stoppuhr: Kommunikation mit GUI 38 Kommunikation - oder: Wie erfährt das GUI von der aktuellen Zeit ? Mögl. 1: Das GUI fragt ständig nach der Zeit („Polling“)! Öde OOP mit Delphi Endlosschleife. . . Mögl. 2: Das Modell (Stoppuhr) informiert das GUI über Änderungen! Die Stoppuhr muss hierfür auf das Anzeigefeld zugreifen. (Das verletzt allerdings die Unabhängigkeit der Stoppuhr. . . ) Schritte für Mögl. 2: ein privates Attribut für (einen Zeiger auf) das GUI-Anzeigefeld einbauen beim Erzeugen (einen Zeiger auf) dieses Anzeigefeld mitgeben TS Und nicht vergessen, für TEdit die Standard-Unit einzubinden: uses Std. Ctrls
39 Stoppuhr: Kommunikation mit GUI im GUI: OOP mit Delphi in TStoppuhr: TS Schritte für Mögl. 2: Und nicht vergessen, für TEdit die Standard-Unit einzubinden: uses Std. Ctrls
40 Aufgaben: Stoppuhr mit Timer 1. Erstellen Sie eine Kopie des bisherigen Stoppuhr-Ordners und integrieren Sie dort einen Timer in die Stoppuhr-Klasse. OOP mit Delphi 2. Testen Sie die Funktion mittels a) manuellem Polling (Abfrageknopf auf GUI) b) zyklischem Polling (Schleife oder weiterer Timer im GUI) TS 3. Implementieren Sie den direkten Zugriff der Stoppuhr auf das GUI-Anzeigefeld! 4. Bewerten Sie die Vor- und Nachteile dieser Verfahren!
OOP mit Delphi 41 TS Ticketautomat: Formular. . .
OOP mit Delphi 42 TS Ticketautomat: . . . mit GUI-Klasse. . .
Ticketautomat: . . . und Modell-Klasse OOP mit Delphi 43 TS Aufrufe
Ticketautomat: Beziehung? OOP mit Delphi 44 TS GUI-Klasse Beziehung? Aufrufe Fach-Klasse
Ticketautomat: Assoziation OOP mit Delphi 45 TS GUI-Klasse „kennt“-Beziehung: Assoziation Aufrufe Fach-Klasse
Ticketautomat: Units OOP mit Delphi 46 GUI-Klasse unit Unit 1; uses Windows, Forms, . . . „kennt“-Beziehung: m. TTicketautomat; Assoziation type TForm 1 TS Fach-Klasse unit m. TTicketautomat; Uses Dialogs, Sys. Utils; type TTicketautomat = class(TForm) Aufrufe
Benutzer-Dialog 47 Wer – d. h. welche Klasse? – führt den Dialog mit dem Benutzer ? OOP mit Delphi GUI-Klasse TS oder Fachklasse ?
Benutzer-Dialog 48 Wer – d. h. welche Klasse? – führt den Dialog mit dem Benutzer ? Die GUI-Klasse: OOP mit Delphi (typischerweise) TS - Buttons, Edit-Felder, Dialog-Boxen etc. Ereignisbehandlungs-Prozeduren Aufruf der Methoden der bekannten Fachklasse Behandeln / Anzeigen der Rückgabewerte
Benutzer-Dialog 49 Wer – d. h. welche Klasse? – führt den Dialog mit dem Benutzer ? Die GUI-Klasse: (typischerweise) Buttons, Edit-Felder, Dialog-Boxen etc. Ereignisbehandlungs-Prozeduren Aufruf der Methoden der bekannten Fachklasse Behandeln / Anzeigen der Rückgabewerte OOP mit Delphi Beispiel: - procedure TForm 1. Geld. Einwerfen. Button. Click(Sender: TObject); var betrag: integer; begin betrag : = strtoint(Input. Box('Geld einwerfen', 'Betrag', '0')); Automat. geld. Einwerfen(betrag); Aktuelle. Anzahlung. Edit. Text: =inttostr(Automat. gib. Aktuelle. Anzahlung); end; TS
50 Zum Testen: Dialoge innerhalb der Fachklasse Mitunter kann es hilfreich sein, eine Fachklasse alleine zu testen, d. h. a la Blue. J unabhängig von einer GUI-Klasse. Für kurze Dialoge (kleine Ein-/Ausgabefenster) bietet die Unit Dialogs folgende „unabhängige“ Prozeduren und Funktionen: OOP mit Delphi Ausgabefenster: Show. Message (<Nachricht>) zeigt einen String an. Eingabefenster: Input. Box (<Titel>, <Frage>, <Defaultwert>) liefert den eingegebenen String. Input. Query (<Titel>, <Frage>, <String-Variable>) liefert Erfolg (true/false) und belegt ggf. die Variable mit der Benutzer-Eingabe. TS
51 Ü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 (TForm 1 und TTicketautomat, inkl. Code). OOP mit Delphi Ergänzen Sie (im UML-Editor) die Methode Einnahmen. Abholen, 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 Einnahmen. Abholen: - 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! TS Zusatz: Wie könnte man ein Parkticket in der GUI-Listbox ausgeben?
OOP mit Delphi 52 TS Modellierung von 17 und 4 „ 17 und 4“ : beteiligte Objekte ?
17 und 4 OOP mit Delphi 53 genauer. . . ? TS
17 und 4 54 Klassenbildung? OOP mit Delphi Spieler 1 Spieler 2 Bank Kartenstapel Spieler 3 TS Karten
17 und 4 55 Beteiligte Klassen: TSpieler 1 OOP mit Delphi TBank TKartenstapel T Spieler 2 Bank Kartenstapel TKarte Spieler 3 TS Karten
17 und 4: Modellierung der Spielkarten OOP mit Delphi 56 typ. Nr: farb. Nr: 1 2 4 5 6 7 1 Beispiel: TS 3 2 3 4 typ. Nr farb. Nr gib. Farbe gib. Name gib. Punkte 6 4 Kreuz Dame 3 8
Modellierung des Kartenstapels OOP mit Delphi 57 TS Methoden?
58 Aufgaben: GUI für erste Tests OOP mit Delphi 1. Verwenden von gegebenen Klassen: Spielkarten ziehen Vorgabe: nur diese beiden Klassen. Beginnen Sie ein neues Projekt und entwickeln Sie ein GUI für folgende Aufgaben: a) Per Knopfdruck eine bestimmte Spielkarte erzeugen und anzeigen! (Deklarieren Sie die verwendeten Klassen (Units) mittels uses. . . , und die Spielkarte als privates Attribut der GUI-Klasse TForm 1) b) Einen Kartenstapel erzeugen, und auf Knopfdruck nacheinander einzelne Karten ziehen und anzeigen! c) Diesen Stapel mischen und in einer Listbox eine komplette Ziehung anzeigen! TS
Aufgabe: Entwurf von TSpieler 59 2. Entwurf einer neuen Klasse TSpieler für das Spiel „ 17 und 4“ : OOP mit Delphi Attribute: karte (die aktuell gezogene) und summe (aller bisherigen Kartenpunkte), jeweils inklusive Lese-Methoden: erzeuge (Konstruktor), ziehe. Karte. a) Erstellen Sie diese Klasse zunächst auf Papier, dann im UML-Editor, und exportieren Sie die zugehörige Unit in Ihren Projektordner. b) Binden Sie diese Klasse in Ihr Projekt ein (uses. . . ), und ergänzen Sie die Implementierung der Methoden. c) Per Knopfdruck soll der Spieler eine Karte ziehen. Testen Sie! d) Erweitern Sie die Klasse TSpieler um die Angabe eines Namens! e) Erweitern Sie TSpieler um die Methode hat. Sich. Ueberreizt (liefert true, falls die Summe 21 übersteigt). Prüfen Sie beim Ziehen einer Karte (im GUI), ob sich der Spieler dadurch überreizt hat, und deaktivieren Sie ggf. den Ziehe-Button! TS
Aufgabe: Assoziation des Kartenstapels 60 3. Assoziation: „Bekanntmachen“ bzw. Zuordnen von Objekten OOP mit Delphi 4. Ein zweiter Mitspieler soll den gleichen Kartenstapel mitbenutzen. Spieler 1 benutzter. Stapel Spieler 2 Kartenstapel verwende. Stapel(stapel) a) TS benutzter. Stapel verwende. Stapel(stapel) Schreib-Methode für das (private!) Attribut Erweitern Sie TSpieler um das Assoziations-Attribut und die zugehörige Methode, erzeugen Sie zwei Spieler und einen Kartenstapel, und ordnen Sie diesen Stapel beiden Spielern zu. Testen Sie!
61 Aufgabe: Bank-Klasse (mit Vererbung) 4. Vererbung: „Spezialisierung“ von Objekten bzw. Klassen Die Bank ist ein besonderer Spieler mit erweiterten Fähigkeiten: Sie verwaltet die Mitspieler, bestimmt den Gewinner, und hat ihre eigene Zug-Strategie (nur Ziehen, falls Summe < 17). OOP mit Delphi TSpieler ist eine Spezialisierung von Die Klasse TBank „erbt“ von ihrer Oberklasse TSpieler alle Attribute und Methoden. Ggf. müssen ererbte Methoden neu definiert („überschrieben“) werden! Definieren Sie diese Klasse TBank im UML-Editor, und ergänzen Sie den exportierten Code-Rahmen. Testen Sie! TS
OOP mit Delphi 62 TS 17 und 4: Klassendiagramme
63 Stoppuhr: Klassendiagramm OOP mit Delphi Stoppuhr (ohne GUI) TS Sekunden Hundertstel
64 Stoppuhr: Klassendiagramm OOP mit Delphi Stoppuhr (ohne GUI) TS Sekunden Hundertstel
65 Stoppuhr: Klassendiagramm OOP mit Delphi Stoppuhr (ohne GUI) TS Sekunden Hundertstel
OOP mit Delphi 66 TS Stoppuhr: Klassendiagramm Beziehung?
OOP mit Delphi 67 TS Stoppuhr: Klassendiagramm Assoziation: „kennt“ Aggregation: „hat“
68 Übung: Stoppuhr Definieren Sie im UML-Editor die Klasse TZaehler. Exportieren Sie die zugehörige Delphi-Unit unter dem Dateinamen m. TZaehler. pas in einen neuen Ordner namens „Stoppuhr“. OOP mit Delphi 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 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! TS
OOP mit Delphi 69 TS Kontoverwaltung
OOP mit Delphi 70 TS Kontoverwaltung
Kontoverwaltung OOP mit Delphi 71 Problem: gegenseitige „kennt“Beziehungen! TS (Überkreuz-Referenz mehrerer Units in Delphi nicht erlaubt!) Lösung: a) Mehrere Klassen in eine Unit b) Redesign mit „Koppel“-Klassen
- Slides: 71