71
Delphi II - OOP Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

Embed Size (px)

Citation preview

Page 1: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

Delphi II - OOPDelphi II - OOP

IFB Fortbildung

Objektorientiertes Programmieren in Delphi:

Einführung in das Klassenkonzept

Tobias Selinger 15. 4. 2008

Page 2: Delphi 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

Page 3: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 4: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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?

Page 5: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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?

Page 6: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

?

?

Page 7: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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:

Page 8: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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:

Page 9: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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 !

Page 10: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 11: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 12: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 13: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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, ... ]

Page 14: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 15: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 16: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

16

TS

OO

P m

it D

elp

hi

Eine große Objekt-“Familie“Eine große Objekt-“Familie“

Page 17: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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:

Page 18: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

18

TS

OO

P m

it D

elp

hi

Stoppuhr: Modularisierung?Stoppuhr: Modularisierung?

Aufteilung in Module?

Page 19: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

19

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

Hundertstel

Sekunden

Erforderliche Klassen?Taktgeber

Uhrwerk

Page 20: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

20

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

UhrwerkHundertstel

Sekunden

TUhrwerkTZähler

TFormTTimer(Delphi-Komponente)

modulo n

Page 21: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

21

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

UhrwerkHundertstel

Sekunden

TUhrwerkTZähler

TFormTTimer(Delphi-Komponente)

modulo n

Page 22: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

?

Page 23: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

?

Page 24: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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)

Page 25: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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‘)

Page 26: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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)!

Page 27: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

27

TS

OO

P m

it D

elp

hi

Lösung: 24-Stunden-Uhr (UML)Lösung: 24-Stunden-Uhr (UML)

Page 28: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 29: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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)

Page 30: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 31: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

31

TS

OO

P m

it D

elp

hi

Vererbung: Alarmuhr erstmal ohne ...Vererbung: Alarmuhr erstmal ohne ...

Vergleich ?doppelter Code !

Page 32: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 33: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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)

Page 34: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 35: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

35

TS

OO

P m

it D

elp

hi

Stoppuhr mit integriertem Timer ?Stoppuhr mit integriertem Timer ?

TUhrwerk

TForm

TTimer

Page 36: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

36

TS

OO

P m

it D

elp

hi

Stoppuhr mit integriertem TimerStoppuhr mit integriertem Timer

TUhrwerk

TForm

TTimer

mit TStoppUhr

Page 37: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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;

Page 38: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 39: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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:

Page 40: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 41: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

41

TS

OO

P m

it D

elp

hi

Ticketautomat: Formular ...Ticketautomat: Formular ...

Page 42: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

42

TS

OO

P m

it D

elp

hi

Ticketautomat: ... mit GUI-Klasse ...Ticketautomat: ... mit GUI-Klasse ...

Page 43: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

43

TS

OO

P m

it D

elp

hi

Ticketautomat: ... und Modell-KlasseTicketautomat: ... und Modell-Klasse

Aufrufe

Page 44: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

44

TS

OO

P m

it D

elp

hi

Ticketautomat: Beziehung?Ticketautomat: Beziehung?

Aufrufe

GUI-Klasse

Fach-KlasseBeziehung?

Page 45: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

45

TS

OO

P m

it D

elp

hi

Ticketautomat: AssoziationTicketautomat: Assoziation

Aufrufe

GUI-Klasse

Fach-Klasse„kennt“-Beziehung:Assoziation

Page 46: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 47: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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 ?

Page 48: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 49: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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;

Page 50: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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.

Page 51: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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?

Page 52: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

52

TS

OO

P m

it D

elp

hi

Modellierung von 17 und 4Modellierung von 17 und 4

„17 und 4“ : beteiligte Objekte ?

Page 53: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

53

TS

OO

P m

it D

elp

hi17 und 417 und 4

genauer...?

Page 54: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

54

TS

OO

P m

it D

elp

hi17 und 417 und 4

Bank Kartenstapel

Spieler 1

Spieler 2

Spieler 3

Karten

Klassenbildung?

Page 55: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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:

Page 56: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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:

Page 57: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

57

TS

OO

P m

it D

elp

hi

Modellierung des KartenstapelsModellierung des Kartenstapels

Methoden?

Page 58: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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

Page 59: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 60: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 61: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 62: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

62

TS

OO

P m

it D

elp

hi

17 und 4: Klassendiagramme17 und 4: Klassendiagramme

Page 63: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

63

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

Sekunden

Stoppuhr (ohne GUI)

Hundertstel

Page 64: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

64

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

Sekunden

Stoppuhr (ohne GUI)

Hundertstel

Page 65: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

65

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

Sekunden

Stoppuhr (ohne GUI)

Hundertstel

Page 66: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

66

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

Beziehung? Beziehung?

Page 67: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

67

TS

OO

P m

it D

elp

hi

Stoppuhr: KlassendiagrammStoppuhr: Klassendiagramm

Assoziation:„kennt“

Aggregation:„hat“

Page 68: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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!

Page 69: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

69

TS

OO

P m

it D

elp

hi

KontoverwaltungKontoverwaltung

Page 70: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

70

TS

OO

P m

it D

elp

hi

KontoverwaltungKontoverwaltung

Page 71: Delphi II - OOP IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008

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