Delphi II - OOP Objektorientiertes Programmieren in Delphi:

Slides:



Advertisements
Ähnliche Präsentationen
Anzahl der ausgefüllten und eingesandten Fragebögen: 211
Advertisements

Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Kritische Betrachtung
Telefonnummer.
Pflege der Internetdienste
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Java: Objektorientierte Programmierung
Java: Grundlagen der Objektorientierung
Rechneraufbau & Rechnerstrukturen, Folie 2.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 2.
Internet facts 2008-II Graphiken zu dem Berichtsband AGOF e.V. September 2008.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Differentielles Paar UIN rds gm UIN
Prof. Dr. Bernhard Wasmayr
Studienverlauf im Ausländerstudium
DVG Klassen und Objekte
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
1 Teil 4 Übung: Uhr. 2 Zielsetzung Ziel ist es, mit Hilfe objektorientierter Modellierung ein System zu entwickeln, mit dem eine einfache Uhr simuliert.
Delphi Eine objektorientierte Programmiersprache © Beushausen 2000.
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
Objektorientierte Modellierung
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
20:00.
„Küsse deine Freunde“ – FlexKom-App teilen
Zusatzfolien zu B-Bäumen
Delphi II - OOP IFB Fortbildung
In der Schule.
Eine Einführung in die CD-ROM
Entwurfs- und Implementationsdiagramme
Dokumentation der Umfrage
für Weihnachten oder als Tischdekoration für das ganze Jahr
Wir üben die Malsätzchen
Syntaxanalyse Bottom-Up und LR(0)
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Objektorientierte Konzepte/UML Geoinformation I Vorlesung 2 WS 2000/2001.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Bausteine zum objektorientierten Programmieren mit Delphi
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
PROCAM Score Alter (Jahre)
Grundlagen von Objekt-Pascal Erstellt von J. Rudolf überarbeitet von H.Brehm.
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Geometrische Aufgaben
Symmetrische Blockchiffren DES – der Data Encryption Standard
Retuschen.ppt Die folgende Schau zeigt die Möglichkeiten, mit PhotoDraw Digitalbilder zu retuschieren. Vergleichen Sie jeweils zwei Bildpaare durch fleissiges.
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
Folie Beispiel für eine Einzelauswertung der Gemeindedaten (fiktive Daten)
Objektorientierte Modellierung mit UML
Programmiervorkurs WS 2014 Referenzdatentypen
Folie Einzelauswertung der Gemeindedaten
J-Team: Gymnasium Ulricianum Aurich und MTV Aurich Ein Projekt im Rahmen von UlricianumBewegt.de Euro haben wir schon…  8000 mal habt ihr bereits.
Datum:17. Dezember 2014 Thema:IFRS Update zum Jahresende – die Neuerungen im Überblick Referent:Eberhard Grötzner, EMA ® Anlass:12. Arbeitskreis Internationale.
orgAnice Pi Schulung /13 Konfiguration von orgAnice Pi (1) 2.
Sehen, Hören, Schmecken: wenn uns unsere Sinne täuschen
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Java-Kurs Übung Besprechung der Hausaufgabe
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002.
Sichtbarkeit einschränken
Objektorientierte (OO) Programmierung
 Präsentation transkript:

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

Drei Objekte ... Klasse: ? roter Käfer Pol-Ente blauer Jaguar Objekte

Drei Objekte von einer gemeinsamen Klasse TAuto Objekte: roter Käfer Pol-Ente blauer Jaguar

? TAuto: Methoden? Was sollen Objekte der Klasse TAuto können? Welche Methoden können sie ausführen? ?

prüfen, ob Inspektion nötig ist TAuto: Attribute? Was sollen Objekte der Klasse TAuto können? Welche Methoden können sie ausführen? Welche Attribute besitzen sie? ? fahren tanken km-Stand angeben Tankinhalt angeben prüfen, ob Inspektion nötig ist

prüfen, ob Inspektion nötig ist TAuto: UML-Modell Was sollen Objekte der Klasse TAuto können? Welche Methoden können sie ausführen? Welche Attribute besitzen sie? UML-Modell: Attribute Methoden ? km-Stand Tankinhalt Modell fahren tanken km-Stand angeben Tankinhalt angeben prüfen, ob Inspektion nötig ist

Was sollen Objekte der Klasse TAuto können? TAuto: UML-Modell Was sollen Objekte der Klasse TAuto können? 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! Bsp: neuesAuto := TAuto.erzeuge(‘Manta 08/15‘)

Zugriffsrechte und Notation Kapselung (Geheimnisprinzip): Attribute sind generell privat. Zugriffe nur über Zugriffsmethoden. (z.B. gibKmstand ) Zugriffsrechte: UML-Modell: private ( - ) Attribute öffentliche (public) Methoden ( + ) Weitere Zugriffsrechte: ++ published ( = public + im Objekt- inspektor sichtbar) # protected ( = privat + vererbbar) Bei Methoden zusätzlich: ! für Aufträge (Prozeduren) ? für Anfragen (Funktionen)

TAuto in Delphi Delphi-Code: UML-Modell: per UML-Editor (z.B. UMLed ) automatisch erzeugbar bzw. rück-modellierbar !

MVC-Konzept (strikt) mit zwei Views Modell View 1 View 2 Controller verwaltet das Modell & steuert die Views

MVC-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

MVC-Beispiel mit kombiniertem GUI: Auto Modell Controller + View (GUI) unit Unit1; uses ... TAuto; unitTAuto 2 3 1 procedure TForm1.TankenButtonClick(Sender: TObject); begin auto.tanke(strToFloat(InputBox('Tanken', 'Menge: ', '30'))); aktualisiereAnzeige; end;

Exkurs: Nützliche Dialoge in 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: 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 Variable mit dem eingegebenen String. mtWarning, mtError, mtInformation, mtConfirmation, ... [ mbYes, mbNo, mbCancel, mbOK, ... ]

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!

Aufgaben 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): Fahren-Button: Ereignisprozedur ergänzen (vgl. Tanken-Button) ! fahre-Methode: Auch den km-Stand erhöhen! Auto-Modell: Zugriffsfunktion auf den Modellnamen hinzufügen ( - ist nötig für d) ! Erzeugen-Button: Auch den Modellnamen im GUI anzeigen! 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! 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...! 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! im Auto-Modell: Ein Attribut Tankvolumen ergänzen und beim Erzeugen per Parameter festlegen! Per UML-Editor: Mittels UMLed ein UML-Diagramm der Auto-Klasse erzeugen!

Eine große Objekt-“Familie“

Normale Uhr und Spezialisierungen Uhrwerk / Zähler für Sek., Min., Std, 1/100, ... Taktgenerator Spezialisierungen: Stoppuhr Start, Stopp, Reset Alarm-Uhr Alarmzeit einstellen, Alarm an/aus Schach-Uhr Start, Stopp A, Stopp B

Stoppuhr: Modularisierung? Aufteilung in Module?

Stoppuhr: Klassendiagramm Hundertstel Sekunden Uhrwerk Taktgeber Erforderliche Klassen?

Stoppuhr: Klassendiagramm Uhrwerk Hundertstel Sekunden TUhrwerk TZähler TForm TTimer modulo n (Delphi-Komponente)

Stoppuhr: Klassendiagramm Sekunden Hundertstel Uhrwerk TUhrwerk TZähler modulo n TTimer TForm (Delphi-Komponente)

Stoppuhr: Klassendiagramm Sekunden Hundertstel Uhrwerk TUhrwerk TZähler modulo n TTimer TForm (Delphi-Komponente) ? z.B. ‘07‘ z.B. ’13:07‘ in ms

Stoppuhr: Klassendiagramm Sekunden Hundertstel Uhrwerk TUhrwerk TZähler modulo n TTimer TForm (Delphi-Komponente) ? z.B. ‘07‘ z.B. ’13:07‘ in ms

Stoppuhr: Klassendiagramm Sekunden Hundertstel Uhrwerk TUhrwerk TZähler modulo n TTimer TForm (Delphi-Komponente) z.B. ‘07‘ z.B. ’13:07‘ in ms

Aufgabe: Stoppuhr implementieren Bilden Sie Zweier- oder Dreier-Teams zur Implementierung der Klassen (*): Haupt-Unit mit Formular und Timer-Komponente (aus Registerkarte: System). TUhrwerk. 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 Sie die Unit dem Projekt hinzu, und ergänzen Sie die nötigen uses-Deklarationen. Compilieren und testen Sie - viel Erfolg !! * 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‘)

Aufgabe: Weitere Uhren modellieren 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!) Implementieren Sie eine dieser Uhren! (Nutzen Sie den UML-Editor!) Hausaufgabe: Realisieren Sie diese Uhr als analoge Zeigeruhr (d.h. mit alternativer View)!

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

Lösung: 24-Stunden-Uhr mit Alarm (UML) Die Klasse TZaehler wird unverändert benutzt!

Lösung: 24-Stunden-Uhr mit Alarm (alle Klassen)

Lösung: Schach-Uhr (UML) Tipp zur Implementierung: Zwei 24-Std-Uhrwerke erzeugen, dann das aktuelle Uhrwerk jeweils mit dem entsprechenden Uhrwerk belegen und „ticken“ lassen! UhrA aktuelleUhr UhrB

Vererbung: Alarmuhr erstmal ohne ... Vergleich ? doppelter Code !

Vererbung: Alarmuhr erstmal ohne ... Ohne Vererbung: Die komplette bisherige Klasse T24StdUhrwerk plus weiterem Code für die Alarm-Funktion. Nachteil: Code-Duplikation! Besser geht es mit Vererbung...

Alarmuhr mit Vererbung protected (vererbbar) Oberklasse (vererbt an) Ohne Vererbung: Die komplette bisherige Klasse T24StdUhrwerk plus weiterem Code für die Alarm-Funktion. Nachteil: Code-Duplikation! Unterklasse (erbt von...) Mit Vererbung: Durch T24StdUhrwerk als Oberklasse ist nur noch der Code für die Alarm-Funktion nötig!

Alarmuhr mit Vererbung in Delphi: Delphi-Code für Vererbung: protected (vererbbar) Oberklasse Mit Vererbung: Durch T24StdUhrwerk als Oberklasse ist nur noch der Code für die Alarm-Funktion nötig! ruft die ererbte erzeuge-Methode auf

Stoppuhr mit integriertem Timer ? TUhrwerk TTimer TForm

Stoppuhr mit integriertem Timer TUhrwerk TStoppUhr TTimer TForm

Stoppuhr: Implementierung des Timers die Ereignisprozedur wird hier nur als Name eingetragen, aber hier mit Sender-Parameter deklariert! 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-Konstruktor verlangt einen „Eigentümer“ Und nicht vergessen, die Timer-Unit einzubinden: uses ExtCtrls; Aufruf der eigentlichen Stoppuhr-Methode!

Stoppuhr: Kommunikation mit GUI Kommunikation - oder: Wie erfährt das GUI von der aktuellen Zeit ? 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...) 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 Und nicht vergessen, für TEdit die Standard-Unit einzubinden: uses StdCtrls

Stoppuhr: Kommunikation mit GUI im GUI: in TStoppuhr: Schritte für Mögl.2: Und nicht vergessen, für TEdit die Standard-Unit einzubinden: uses StdCtrls

Aufgaben: Stoppuhr mit Timer Erstellen Sie eine Kopie des bisherigen Stoppuhr-Ordners und integrieren Sie dort einen Timer in die Stoppuhr-Klasse. Testen Sie die Funktion mittels a) manuellem Polling (Abfrageknopf auf GUI) b) zyklischem Polling (Schleife oder weiterer Timer im GUI) Implementieren Sie den direkten Zugriff der Stoppuhr auf das GUI-Anzeigefeld! Bewerten Sie die Vor- und Nachteile dieser Verfahren!

Ticketautomat: Formular ...

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

Ticketautomat: ... und Modell-Klasse 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?

„17 und 4“ : beteiligte Objekte ? Modellierung von 17 und 4 „17 und 4“ : beteiligte Objekte ?

17 und 4 genauer...?

17 und 4 Klassenbildung? Spieler 1 Spieler 2 Kartenstapel Bank Spieler 3 Karten

17 und 4 TSpieler Beteiligte Klassen: Spieler 1 TBank T TKartenstapel Spieler 2 Kartenstapel Bank TKarte Spieler 3 Karten

17 und 4: Modellierung der Spielkarten typNr: 1 2 3 4 5 6 7 8 farbNr: 1 2 3 4     typNr 6 farbNr 4 gibFarbe  Kreuz gibName  Dame gibPunkte  3 Beispiel:

Modellierung des Kartenstapels Methoden?

Aufgaben: GUI für erste Tests 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: 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) Einen Kartenstapel erzeugen, und auf Knopfdruck nacheinander einzelne Karten ziehen und anzeigen! Diesen Stapel mischen und in einer Listbox eine komplette Ziehung anzeigen!

Aufgabe: 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. Erstellen Sie diese Klasse zunächst auf Papier, dann im UML-Editor, und exportieren Sie die zugehörige Unit in Ihren Projektordner. Binden Sie diese Klasse in Ihr Projekt ein (uses...), und ergänzen Sie die Implementierung der Methoden. Per Knopfdruck soll der Spieler eine Karte ziehen. Testen Sie! Erweitern Sie die Klasse TSpieler um die Angabe eines Namens! 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!

Aufgabe: Assoziation des Kartenstapels Assoziation: „Bekanntmachen“ bzw. Zuordnen von Objekten Ein zweiter Mitspieler soll den gleichen Kartenstapel mitbenutzen. 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!

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!

17 und 4: Klassendiagramme

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