Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das...
-
Upload
sepp-althaus -
Category
Documents
-
view
106 -
download
0
Transcript of Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das...
Delphi II - OOPDelphi II - OOP
IFB Fortbildung
Objektorientiertes Programmieren in Delphi:
Einführung in das Klassenkonzept
Tobias Selinger 15. 4. 2008
2
TS
OO
P m
it D
elp
hi
Drei Objekte ...Drei Objekte ...
Pol-Ente blauer Jaguarroter Käfer
Klasse: ?
Objekte
3
TS
OO
P m
it D
elp
hi
Drei Objekte von einer gemeinsamen KlasseDrei Objekte von einer gemeinsamen Klasse
Objekte:
Pol-Ente blauer Jaguarroter Käfer
Klasse: ?TAuto
4
TS
OO
P m
it D
elp
hi
TAuto: Methoden?TAuto: Methoden?
?
Was sollen Objekte der Klasse TAuto können?
Welche Methoden können sie ausführen?
5
TS
OO
P m
it D
elp
hi
TAuto: Attribute?TAuto: Attribute?
?
fahrentanken
km-Stand angebenTankinhalt angeben
prüfen, ob Inspektion nötig ist
Was sollen Objekte der Klasse TAuto können?
Welche Methoden können sie ausführen?Welche Attribute besitzen sie?
6
TS
OO
P m
it D
elp
hi
TAuto: UML-ModellTAuto: UML-Modell
Attribute
Methoden
Was sollen Objekte der Klasse TAuto können?
Welche Methoden können sie ausführen?Welche Attribute besitzen sie?
UML-Modell:
km-StandTankinhalt
Modell
fahrentanken
km-Stand angebenTankinhalt angeben
prüfen, ob Inspektion nötig ist
?
?
7
TS
OO
P m
it D
elp
hi
TAuto: UML-ModellTAuto: UML-Modell
fahrentanken
km-Stand angebenTankinhalt angeben
prüfen, ob Inspektion nötig ist
km-StandTankinhalt
Modell
Beachte: Die Methode erzeuge ist ein sog. Konstruktor, der von der Klasse selbst ausgeführt wird!
Bsp: neuesAuto := TAuto.erzeuge(‘Manta 08/15‘)
Was sollen Objekte der Klasse TAuto können?
Welche Methoden können sie ausführen?Welche Attribute besitzen sie?
UML-Modell:
8
TS
OO
P m
it D
elp
hi
Zugriffsrechte und NotationZugriffsrechte und Notation
Kapselung(Geheimnisprinzip):
Attribute sind generell privat.
Zugriffe nur über Zugriffsmethoden.(z.B. gibKmstand )
private ( - )Attribute
Bei Methoden zusätzlich:
! für Aufträge (Prozeduren)
? für Anfragen (Funktionen)
öffentliche (public) Methoden ( + )
Weitere Zugriffsrechte:
++ published ( = public + im Objekt- inspektor sichtbar)
# protected ( = privat + vererbbar)
Zugriffsrechte:
UML-Modell:
9
TS
OO
P m
it D
elp
hi
TAuto in DelphiTAuto in Delphi
Delphi-Code: UML-Modell:
per UML-Editor (z.B. UMLed )
automatisch erzeugbarbzw. rück-modellierbar !
10
TS
OO
P m
it D
elp
hi
MVC-Konzept (strikt) mit zwei ViewsMVC-Konzept (strikt) mit zwei Views
Controller
View 1 View 2Modell
verwaltet das Modell &
steuert die Views
11
TS
OO
P m
it D
elp
hi
MVC-Konzept mit kombiniertem GUIMVC-Konzept mit kombiniertem GUI
Modell Controller + View: GUI *
Vorteil: nur ein GUI-Fenster nötig, einfacher Datenaustausch,
schnell programmiert
Nachteil: unflexibel & verstrickt, konzeptionelle Trennung
nur „im Kopf“ des Programmierers! (*) GUI: Graphical User Interface
12
TS
OO
P m
it D
elp
hi
MVC-Beispiel mit kombiniertem GUI: AutoMVC-Beispiel mit kombiniertem GUI: Auto
Modell Controller + View (GUI)
procedure TForm1.TankenButtonClick(Sender: TObject);begin auto.tanke(strToFloat(InputBox('Tanken', 'Menge: ', '30'))); aktualisiereAnzeige;end;
1
2
unitTAuto unit Unit1;
uses ... TAuto;
3
13
TS
OO
P m
it D
elp
hi
Nützlich für kurze Dialoge (d.h. kleine Ein-/Ausgabefenster) sind diefolgenden Prozeduren und Funktionen der Unit Dialogs (per uses einbinden!):
Ausgabefenster:
ShowMessage (<Meldung>)zeigt eine einfache Meldung an:
MessageDlg (<Meldung>,<Typ>, <Buttons>,0)
zeigt eine konfigurierbare Meldung an.
Eingabefenster:
InputBox (<Titel>,<Frage>,<Defaultwert>) erfragt einen einzugebenden String:
InputQuery (<Titel>,<Frage>,<Variable>) liefert true / false (für Erfolg / Abbruch)und belegt die Variablemit dem eingegebenen String.
Exkurs: Nützliche Dialoge in DelphiExkurs: Nützliche Dialoge in Delphi
mtWarning, mtError, mtInformation, mtConfirmation, ...
[ mbYes, mbNo, mbCancel, mbOK, ... ]
14
TS
OO
P m
it D
elp
hi
Delphi-„tückisches“Delphi-„tückisches“
Einige typische Delphi-Fehler:
• 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!
15
TS
OO
P m
it D
elp
hi
Aufgaben zum Auto-ProjektAufgaben zum Auto-Projekt
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) !
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 „naechsteInspektionBeiKm“ hinzufügen und diesen Wert im Konstruktor mit 1000 initialisieren! Die Funktion „istInspektionNoetig“ soll true liefern, falls der aktuelle km-Stand höher liegt!
f) Fahren-Button: Jeweils überprüfen, ob eine Inspektion nötig istund 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 „macheInspektion“ aktivieren,die den km-Stand für die nächste Inspektion geeignet erhöht!
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!
16
TS
OO
P m
it D
elp
hi
Eine große Objekt-“Familie“Eine große Objekt-“Familie“
17
TS
OO
P m
it D
elp
hi
Normale Uhr und SpezialisierungenNormale Uhr und Spezialisierungen
„Normale“ Uhr :
Uhrwerk / Zählerfür Sek., Min., Std, 1/100, ...
Taktgenerator
StoppuhrStart,
Stopp, Reset
Alarm-UhrAlarmzeit
einstellen, Alarm an/aus
Schach-UhrStart,
Stopp A,Stopp B
Spezialisierungen:
18
TS
OO
P m
it D
elp
hi
Stoppuhr: Modularisierung?Stoppuhr: Modularisierung?
Aufteilung in Module?
19
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
Hundertstel
Sekunden
Erforderliche Klassen?Taktgeber
Uhrwerk
20
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
UhrwerkHundertstel
Sekunden
TUhrwerkTZähler
TFormTTimer(Delphi-Komponente)
modulo n
21
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
UhrwerkHundertstel
Sekunden
TUhrwerkTZähler
TFormTTimer(Delphi-Komponente)
modulo n
22
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
UhrwerkHundertstel
Sekunden
TUhrwerkTZähler
TFormTTimer
z.B. ‘07‘z.B. ’13:07‘
in ms
(Delphi-Komponente)
modulo n
?
23
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
UhrwerkHundertstel
Sekunden
TUhrwerkTZähler
TFormTTimer
z.B. ‘07‘z.B. ’13:07‘
in ms
(Delphi-Komponente)
modulo n
?
24
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
UhrwerkHundertstel
Sekunden
TUhrwerkTZähler
TFormTTimer
z.B. ‘07‘z.B. ’13:07‘
in ms
modulo n
(Delphi-Komponente)
25
TS
OO
P m
it D
elp
hi
Bilden Sie Zweier- oder Dreier-Teams zur Implementierung der Klassen (*):
1) Haupt-Unit mit Formular und Timer-Komponente (aus Registerkarte: System).
2) TUhrwerk.
3) TZaehler.
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 Siedie Unit dem Projekt hinzu, und ergänzen Sie die nötigen uses-Deklarationen.
Compilieren und testen Sie - viel Erfolg !!
Aufgabe: Stoppuhr implementierenAufgabe: Stoppuhr implementieren
* Spezifikationsdetails:
TForm1.init erzeugt das Uhrwerk
TUhrwerk.ticke erhöht die Hunderstel und ggf. die Sekunden
TUhrwerk.gibZeit liefert die Zeit als String im Format ss:hh
TZaehler.gibStringwert liefert den Wert als zweistelligen String (z.B. ‘37‘, ’07‘)
26
TS
OO
P m
it D
elp
hi
Aufgabe: Weitere Uhren modellierenAufgabe: Weitere Uhren modellieren
1. Entwickeln Sie in UML - zunächst auf Papier - geeignete Klassen für eine
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)!
27
TS
OO
P m
it D
elp
hi
Lösung: 24-Stunden-Uhr (UML)Lösung: 24-Stunden-Uhr (UML)
28
TS
OO
P m
it D
elp
hi
Lösung: 24-Stunden-Uhr mit Alarm (UML)Lösung: 24-Stunden-Uhr mit Alarm (UML)
Die Klasse TZaehler wird unverändert benutzt!
29
TS
OO
P m
it D
elp
hi
Lösung: 24-Stunden-Uhr mit Alarm (alle Klassen)Lösung: 24-Stunden-Uhr mit Alarm (alle Klassen)
30
TS
OO
P m
it D
elp
hi
Lösung: Schach-Uhr (UML)Lösung: Schach-Uhr (UML)
Tipp zur Implementierung:Zwei 24-Std-Uhrwerke erzeugen,dann das aktuelle Uhrwerk jeweils mitdem entsprechenden Uhrwerk belegenund „ticken“ lassen!
UhrA
UhrBaktuelleUhr
31
TS
OO
P m
it D
elp
hi
Vererbung: Alarmuhr erstmal ohne ...Vererbung: Alarmuhr erstmal ohne ...
Vergleich ?doppelter Code !
32
TS
OO
P m
it D
elp
hi
Vererbung: Alarmuhr erstmal ohne ...Vererbung: Alarmuhr erstmal ohne ...
Besser geht es
mit Vererbung...
Ohne Vererbung:
Die komplette bisherige Klasse T24StdUhrwerk plus weiterem Code für die Alarm-Funktion.Nachteil: Code-Duplikation!
33
TS
OO
P m
it D
elp
hi
Alarmuhr mit VererbungAlarmuhr mit Vererbung
Ohne Vererbung:
Die komplette bisherige Klasse T24StdUhrwerk plus weiterem Code für die Alarm-Funktion.Nachteil: Code-Duplikation!
Mit Vererbung:
Durch T24StdUhrwerk als Oberklasse ist nur noch der Code für die Alarm-Funktion nötig!
Unterklasse (erbt von...)
protected
(vererbbar)
Oberklasse(vererbt an)
34
TS
OO
P m
it D
elp
hi
Alarmuhr mit Vererbung in Delphi:Alarmuhr mit Vererbung in Delphi:
protected
(vererbbar)
Delphi-Code für Vererbung:
Oberklasse
ruft die ererbte erzeuge-Methode
auf
Mit Vererbung:
Durch T24StdUhrwerk als Oberklasse ist nur noch der Code für die Alarm-Funktion nötig!
35
TS
OO
P m
it D
elp
hi
Stoppuhr mit integriertem Timer ?Stoppuhr mit integriertem Timer ?
TUhrwerk
TForm
TTimer
36
TS
OO
P m
it D
elp
hi
Stoppuhr mit integriertem TimerStoppuhr mit integriertem Timer
TUhrwerk
TForm
TTimer
mit TStoppUhr
37
TS
OO
P m
it D
elp
hi
Stoppuhr: Implementierung des TimersStoppuhr: 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.OnTimer := TimerTick;
procedure TStoppUhr.TimerTick(Sender: TObject);begin ticke;end;
der Timer-Konstruktorverlangt einen „Eigentümer“
die Ereignisprozedur wird hier nur als Name eingetragen, aber hier mit Sender-Parameter deklariert!
Aufruf der eigentlichen Stoppuhr-Methode!
Und nicht vergessen, die Timer-Unit einzubinden:
uses ExtCtrls;
38
TS
OO
P m
it D
elp
hi
Stoppuhr: Kommunikation mit GUIStoppuhr: Kommunikation mit GUI
Kommunikation - oder:
Wie erfährt das GUI von der aktuellen Zeit ?
Schritte für Mögl.2:
Mögl.1: Das GUI fragt ständig nach der Zeit („Polling“)! Öde 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...)ein privates Attribut für (einen Zeiger auf) das
GUI-Anzeigefeld einbauen
beim Erzeugen (einen Zeiger auf) dieses Anzeigefeld
mitgeben
Und nicht vergessen, für TEdit die Standard-Unit einzubinden:
uses StdCtrls
39
TS
OO
P m
it D
elp
hi
Stoppuhr: Kommunikation mit GUIStoppuhr: Kommunikation mit GUI
Schritte für Mögl.2:
im GUI:
Und nicht vergessen, für TEdit die Standard-Unit einzubinden:
uses StdCtrls
in TStoppuhr:
40
TS
OO
P m
it D
elp
hi
Aufgaben: Stoppuhr mit TimerAufgaben: Stoppuhr mit Timer
1. Erstellen Sie eine Kopie des bisherigen Stoppuhr-Ordnersund integrieren Sie dort einen Timer in die Stoppuhr-Klasse.
2. Testen Sie die Funktion mittels a) manuellem Polling (Abfrageknopf auf GUI)b) zyklischem Polling (Schleife oder weiterer Timer im GUI)
3. Implementieren Sie den direkten Zugriff der Stoppuhrauf das GUI-Anzeigefeld!
4. Bewerten Sie die Vor- und Nachteile dieser Verfahren!
41
TS
OO
P m
it D
elp
hi
Ticketautomat: Formular ...Ticketautomat: Formular ...
42
TS
OO
P m
it D
elp
hi
Ticketautomat: ... mit GUI-Klasse ...Ticketautomat: ... mit GUI-Klasse ...
43
TS
OO
P m
it D
elp
hi
Ticketautomat: ... und Modell-KlasseTicketautomat: ... und Modell-Klasse
Aufrufe
44
TS
OO
P m
it D
elp
hi
Ticketautomat: Beziehung?Ticketautomat: Beziehung?
Aufrufe
GUI-Klasse
Fach-KlasseBeziehung?
45
TS
OO
P m
it D
elp
hi
Ticketautomat: AssoziationTicketautomat: Assoziation
Aufrufe
GUI-Klasse
Fach-Klasse„kennt“-Beziehung:Assoziation
46
TS
OO
P m
it D
elp
hi
Ticketautomat: UnitsTicketautomat: Units
Aufrufe
GUI-Klasse
Fach-Klasse
unit Unit1;uses Windows, Forms, ...
mTTicketautomat;type
TForm1 = class(TForm)unit mTTicketautomat;Uses Dialogs, SysUtils;type
TTicketautomat = class
„kennt“-Beziehung:Assoziation
47
TS
OO
P m
it D
elp
hi
Benutzer-DialogBenutzer-Dialog
Wer – d.h. welche Klasse? – führt den Dialog mit dem Benutzer ?
GUI-Klasse oder Fachklasse ?
48
TS
OO
P m
it D
elp
hi
Benutzer-DialogBenutzer-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
49
TS
OO
P m
it D
elp
hi
Benutzer-DialogBenutzer-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;
50
TS
OO
P m
it D
elp
hi
Zum Testen: Dialoge innerhalb der FachklasseZum 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.
51
TS
OO
P m
it D
elp
hi
Übung zum Ticketautomat und UML-Editor: Einnahmen Übung zum Ticketautomat und UML-Editor: Einnahmen abholenabholen
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?
52
TS
OO
P m
it D
elp
hi
Modellierung von 17 und 4Modellierung von 17 und 4
„17 und 4“ : beteiligte Objekte ?
53
TS
OO
P m
it D
elp
hi17 und 417 und 4
genauer...?
54
TS
OO
P m
it D
elp
hi17 und 417 und 4
Bank Kartenstapel
Spieler 1
Spieler 2
Spieler 3
Karten
Klassenbildung?
55
TS
OO
P m
it D
elp
hi
T
17 und 417 und 4
Bank Kartenstapel
Spieler 1
Spieler 2
Spieler 3
Karten
TSpieler
TKartenstapel
TKarte
TBank
Beteiligte Klassen:
56
TS
OO
P m
it D
elp
hi
typNr 6farbNr 4gibFarbe KreuzgibName DamegibPunkte 3
17 und 4: Modellierung der Spielkarten17 und 4: Modellierung der Spielkarten
typNr: 1 2 3 4 5 6 7 8
farbNr: 1 2 3 4
Beispiel:
57
TS
OO
P m
it D
elp
hi
Modellierung des KartenstapelsModellierung des Kartenstapels
Methoden?
58
TS
OO
P m
it D
elp
hi
1. Verwenden von gegebenen Klassen: Spielkarten ziehen
Vorgabe: nur diese beiden Klassen.Beginnen Sie ein neues Projekt und ent-wickeln 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 TForm1)
b) Einen Kartenstapel erzeugen, und auf Knopfdrucknacheinander einzelne Karten ziehen und anzeigen!
c) Diesen Stapel mischen und in einer Listbox eine komplette Ziehung anzeigen!
Aufgaben: GUI für erste TestsAufgaben: GUI für erste Tests
59
TS
OO
P m
it D
elp
hi
Aufgabe: Entwurf von TSpielerAufgabe: Entwurf von TSpieler
2. Entwurf einer neuen Klasse TSpieler für das Spiel „17 und 4“ :
Attribute: karte (die aktuell gezogene) und summe (aller bisherigen Kartenpunkte),jeweils inklusive Lese-Methoden
Methoden: erzeuge (Konstruktor),zieheKarte.
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 hatSichUeberreizt(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!
60
TS
OO
P m
it D
elp
hi
3. Assoziation: „Bekanntmachen“ bzw. Zuordnen von Objekten
Ein zweiter Mitspieler soll den gleichen Kartenstapel mitbenutzen.
Aufgabe: Assoziation des KartenstapelsAufgabe: Assoziation des Kartenstapels
Spieler 1
benutzterStapel
verwendeStapel(stapel)
Spieler 2
benutzterStapel
verwendeStapel(stapel)
Kartenstapel
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
TS
OO
P m
it D
elp
hi
Aufgabe: Bank-Klasse (mit Vererbung)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).
Definieren Sie diese Klasse TBank im UML-Editor,und ergänzen Sie den exportierten Code-Rahmen. Testen Sie!
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!
62
TS
OO
P m
it D
elp
hi
17 und 4: Klassendiagramme17 und 4: Klassendiagramme
63
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
Sekunden
Stoppuhr (ohne GUI)
Hundertstel
64
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
Sekunden
Stoppuhr (ohne GUI)
Hundertstel
65
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
Sekunden
Stoppuhr (ohne GUI)
Hundertstel
66
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
Beziehung? Beziehung?
67
TS
OO
P m
it D
elp
hi
Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm
Assoziation:„kennt“
Aggregation:„hat“
68
TS
OO
P m
it D
elp
hi
Übung: StoppuhrÜ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!
69
TS
OO
P m
it D
elp
hi
KontoverwaltungKontoverwaltung
70
TS
OO
P m
it D
elp
hi
KontoverwaltungKontoverwaltung
71
TS
OO
P m
it D
elp
hi
KontoverwaltungKontoverwaltung
Problem: gegenseitige „kennt“-Beziehungen!
(Überkreuz-Referenz mehrererUnits in Delphi nicht erlaubt!)
Lösung:a) Mehrere Klassen in eine Unitb) Redesign mit „Koppel“-Klassen