Delphi II - OOP

download Delphi II  -  OOP

If you can't read please download the document

description

Delphi II - OOP. IFB Fortbildung Objektorientiertes Programmieren in Delphi: Einführung in das Klassenkonzept Tobias Selinger 15. 4. 2008. Klasse : ?. Drei Objekte. blauer Jaguar. roter Käfer. Pol-Ente. Objekte. Klasse : ?. Drei Objekte von einer gemeinsamen Klasse. - PowerPoint PPT Presentation

Transcript of Delphi II - OOP

  • Delphi II - OOPIFB Fortbildung Objektorientiertes Programmieren in Delphi:Einfhrung in das Klassenkonzept Tobias Selinger 15. 4. 2008

    TS OOP mit Delphi

    Drei Objekte ...Pol-Enteblauer Jaguarroter KferObjekte

    TS OOP mit Delphi

    Drei Objekte von einer gemeinsamen KlasseObjekte:Pol-Enteblauer Jaguarroter KferTAuto

    TS OOP mit Delphi

    TAuto: Methoden?

    ? Was sollen Objekte der Klasse TAuto knnen?Welche Methoden knnen sie ausfhren?

    TS OOP mit Delphi

    TAuto: Attribute??fahrentankenkm-Stand angebenTankinhalt angebenprfen, ob Inspektion ntig istWas sollen Objekte der Klasse TAuto knnen?Welche Methoden knnen sie ausfhren? Welche Attribute besitzen sie?

    TS OOP mit Delphi

    TAuto: UML-ModellWas sollen Objekte der Klasse TAuto knnen?Welche Methoden knnen sie ausfhren? Welche Attribute besitzen sie?UML-Modell:km-StandTankinhaltModellfahrentankenkm-Stand angebenTankinhalt angebenprfen, ob Inspektion ntig ist

    TS OOP mit Delphi

    TAuto: UML-Modellfahrentankenkm-Stand angebenTankinhalt angebenprfen, ob Inspektion ntig istkm-StandTankinhaltModellBeachte: Die Methode erzeuge ist ein sog. Konstruktor, der von der Klasse selbst ausgefhrt wird!Bsp: neuesAuto := TAuto.erzeuge(Manta 08/15)Was sollen Objekte der Klasse TAuto knnen?Welche Methoden knnen sie ausfhren? Welche Attribute besitzen sie?UML-Modell:

    TS OOP mit Delphi

    Zugriffsrechte und NotationKapselung (Geheimnisprinzip): Attribute sind generell privat.Zugriffe nur ber Zugriffsmethoden. (z.B. gibKmstand )private ( - ) AttributeBei Methoden zustzlich:! fr Auftrge (Prozeduren)? fr Anfragen (Funktionen)ffentliche (public) Methoden ( + )Zugriffsrechte:UML-Modell:

    TS OOP mit Delphi

    TAuto in DelphiDelphi-Code:UML-Modell:

    TS OOP mit Delphi

    MVC-Konzept (strikt) mit zwei ViewsController

    View 1View 2Modellverwaltet das Modell & steuert die Views

    TS OOP mit Delphi

    MVC-Konzept mit kombiniertem GUIModellController + View: GUI * Vorteil: nur ein GUI-Fenster ntig, einfacher Datenaustausch, schnell programmiertNachteil: unflexibel & verstrickt, konzeptionelle Trennung nur im Kopf des Programmierers!(*) GUI: Graphical User Interface

    TS OOP mit Delphi

    MVC-Beispiel mit kombiniertem GUI: AutoModellController + View (GUI)procedure TForm1.TankenButtonClick(Sender: TObject); begin auto.tanke(strToFloat(InputBox('Tanken', 'Menge: ', '30'))); aktualisiereAnzeige; end;unitTAutounit Unit1;uses ... TAuto;

    TS OOP mit Delphi

    Exkurs: Ntzliche Dialoge in DelphiNtzlich fr kurze Dialoge (d.h. kleine Ein-/Ausgabefenster) sind die folgenden Prozeduren und Funktionen der Unit Dialogs (per uses einbinden!): Ausgabefenster:ShowMessage () zeigt eine einfache Meldung an:

    MessageDlg (,, ,0)

    zeigt eine konfigurierbare Meldung an.Eingabefenster:InputBox (,,) erfragt einen einzugebenden String:

    InputQuery (,,) liefert true / false (fr Erfolg / Abbruch) und belegt die Variable mit dem eingegebenen String.mtWarning, mtError, mtInformation, mtConfirmation, ...[ mbYes, mbNo, mbCancel, mbOK, ... ]

    TS OOP mit Delphi

    Delphi-tckischesEinige typische Delphi-Fehler: Element nicht bekannt: a) falsche Schreibweise (Tippfehler?) b) fehlende Zugriffsrechte? (privat?) c) zugehrige Unit nicht eingebunden? ( uses ...; z.B. Dialogs oder eigene Unit) Ausgabedatei kann nicht erstellt werden: a) luft 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 berprfen! (Min/Max? Beginn mit 0?) Programm hngt: Abbrechen: Entweder im Delphi-Men: Start Programm zurcksetzen, oder im Taskmanager: laufendes Projekt suchen dessen Task beenden!

    TS OOP mit Delphi

    Aufgaben zum Auto-ProjektKopieren 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 ergnzen (vgl. Tanken-Button) !fahre-Methode: Auch den km-Stand erhhen!Auto-Modell: Zugriffsfunktion auf den Modellnamen hinzufgen ( - ist ntig fr d) !Erzeugen-Button: Auch den Modellnamen im GUI anzeigen!im Auto-Modell: Ein Attribut naechsteInspektionBeiKm hinzufgen und diesen Wert im Konstruktor mit 1000 initialisieren! Die Funktion istInspektionNoetig soll true liefern, falls der aktuelle km-Stand hher liegt!Fahren-Button:Jeweils berprfen, ob eine Inspektion ntig ist und ggf. das Inspektionslabel (als Hinweis) sichtbar machen! Fahren Sie nur los, falls das Benzin ausreicht...!Inspektion-Button: Den Inspektions-Hinweis zurcknehmen (d.h. unsichtbar machen) und im Auto-Modell eine Methode macheInspektion aktivieren, die den km-Stand fr die nchste Inspektion geeignet erhht!im Auto-Modell:Ein Attribut Tankvolumen ergnzen und beim Erzeugen per Parameter festlegen!Per UML-Editor: Mittels UMLed ein UML-Diagramm der Auto-Klasse erzeugen!

    TS OOP mit Delphi

    Eine groe Objekt-Familie

    TS OOP mit Delphi

    Normale Uhr und SpezialisierungenNormale Uhr :Uhrwerk / Zhler fr Sek., Min., Std, 1/100, ...Taktgenerator Stoppuhr Start, Stopp, ResetAlarm-Uhr Alarmzeit einstellen, Alarm an/ausSchach-Uhr Start, Stopp A, Stopp BSpezialisierungen:

    TS OOP mit Delphi

    Stoppuhr: Modularisierung?Aufteilung in Module?

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammErforderliche Klassen?

    TS OOP mit Delphi

    Stoppuhr: Klassendiagramm(Delphi-Komponente)modulo n

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammUhrwerkHundertstelSekundenTUhrwerkTZhlerTFormTTimer(Delphi-Komponente)modulo n

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammUhrwerkHundertstelSekundenTUhrwerkTZhlerTFormTTimerz.B. 07z.B. 13:07in ms(Delphi-Komponente)modulo n?

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammUhrwerkHundertstelSekundenTUhrwerkTZhlerTFormTTimerz.B. 07z.B. 13:07in ms(Delphi-Komponente)modulo n?

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammUhrwerkHundertstelSekundenTUhrwerkTZhlerTFormTTimerz.B. 07z.B. 13:07in msmodulo n(Delphi-Komponente)

    TS OOP mit Delphi

    Aufgabe: Stoppuhr implementierenBilden Sie Zweier- oder Dreier-Teams zur Implementierung der Klassen (*):Haupt-Unit mit Formular und Timer-Komponente (aus Registerkarte: System).TUhrwerk.TZaehler.Nutzen Sie fr 2) und 3) den UML-Editor zur Erstellung der jeweiligen Klasse:Erstellen Sie ein entsprechendes UML-Modell.Exportieren Sie den zugehrigen Code in eine entsprechende Delphi-Unit.ffnen Sie diese Unit in Delphi und ergnzen Sie den ntigen Methoden-Code.Speichern Sie ihre Unit in den Projekt-Ordner der Haupt-Unit, fgen Sie die Unit dem Projekt hinzu, und ergnzen Sie die ntigen uses-Deklarationen.Compilieren und testen Sie - viel Erfolg !!

    * Spezifikationsdetails:TForm1.initerzeugt das UhrwerkTUhrwerk.tickeerhht die Hunderstel und ggf. die SekundenTUhrwerk.gibZeitliefert die Zeit als String im Format ss:hhTZaehler.gibStringwertliefert den Wert als zweistelligen String (z.B. 37, 07)

    TS OOP mit Delphi

    Aufgabe: Weitere Uhren modellierenEntwickeln Sie in UML - zunchst auf Papier - geeignete Klassen fr eine a) 24-Stunden-Uhr (mit Stell-Mglichkeit) 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)!

    TS OOP mit Delphi

    Lsung: 24-Stunden-Uhr (UML)

    TS OOP mit Delphi

    Lsung: 24-Stunden-Uhr mit Alarm (UML)Die Klasse TZaehler wird unverndert benutzt!

    TS OOP mit Delphi

    Lsung: 24-Stunden-Uhr mit Alarm (alle Klassen)

    TS OOP mit Delphi

    Lsung: Schach-Uhr (UML)Tipp zur Implementierung: Zwei 24-Std-Uhrwerke erzeugen, dann das aktuelle Uhrwerk jeweils mit dem entsprechenden Uhrwerk belegen und ticken lassen!UhrAUhrBaktuelleUhr

    TS OOP mit Delphi

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

    TS OOP mit Delphi

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

    TS OOP mit Delphi

    Alarmuhr mit VererbungOhne Vererbung: Die komplette bisherige Klasse T24StdUhrwerk plus weiterem Code fr die Alarm-Funktion. Nachteil: Code-Duplikation!Mit Vererbung:Durch T24StdUhrwerk als Oberklasse ist nur noch der Code fr die Alarm-Funktion ntig!Unterklasse (erbt von...) Oberklasse (vererbt an)

    TS OOP mit Delphi

    Alarmuhr mit Vererbung in Delphi:Delphi-Code fr Vererbung:Oberklasseruft die ererbte erzeuge-Methode aufMit Vererbung:Durch T24StdUhrwerk als Oberklasse ist nur noch der Code fr die Alarm-Funktion ntig!

    TS OOP mit Delphi

    Stoppuhr mit integriertem Timer ?TUhrwerkTFormTTimer

    TS OOP mit Delphi

    Stoppuhr mit integriertem TimerTUhrwerkTFormTTimer

    TS OOP mit Delphi

    Stoppuhr: Implementierung des TimersDer Timer: Einfach im Konzept, aber tckisch 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 EigentmerAufruf der eigentlichen Stoppuhr-Methode!Und nicht vergessen, die Timer-Unit einzubinden:uses ExtCtrls;

    TS OOP mit Delphi

    Stoppuhr: Kommunikation mit GUIKommunikation - oder:Wie erfhrt das GUI von der aktuellen Zeit ? Mgl.1:Das GUI fragt stndig nach der Zeit (Polling)! de Endlosschleife...Mgl.2: Das Modell (Stoppuhr) informiert das GUI ber nderungen! Die Stoppuhr muss hierfr auf das Anzeigefeld zugreifen. (Das verletzt allerdings die Unabhngigkeit der Stoppuhr...)ein privates Attribut fr (einen Zeiger auf) das GUI-Anzeigefeld einbauenbeim Erzeugen (einen Zeiger auf) dieses Anzeigefeld mitgeben

    TS OOP mit Delphi

    Stoppuhr: Kommunikation mit GUISchritte fr Mgl.2:im GUI:in TStoppuhr:

    TS OOP mit Delphi

    Aufgaben: Stoppuhr mit TimerErstellen 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!

    TS OOP mit Delphi

    Ticketautomat: Formular ...

    TS OOP mit Delphi

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

    TS OOP mit Delphi

    Ticketautomat: ... und Modell-Klasse

    Aufrufe

    TS OOP mit Delphi

    Ticketautomat: Beziehung?

    AufrufeGUI-KlasseFach-KlasseBeziehung?

    TS OOP mit Delphi

    Ticketautomat: Assoziation

    AufrufeGUI-KlasseFach-Klassekennt-Beziehung:Assoziation

    TS OOP mit Delphi

    Ticketautomat: Units

    AufrufeGUI-KlasseFach-Klasseunit Unit1;uses Windows, Forms, ... mTTicketautomat;type TForm1 = class(TForm)

    unit mTTicketautomat;Uses Dialogs, SysUtils;type TTicketautomat = class

    kennt-Beziehung:Assoziation

    TS OOP mit Delphi

    Benutzer-DialogWer d.h. welche Klasse? fhrt den Dialog mit dem Benutzer ?GUI-Klasse oderFachklasse ?

    TS OOP mit Delphi

    Benutzer-DialogWer d.h. welche Klasse? fhrt 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 Rckgabewerte

    TS OOP mit Delphi

    Benutzer-DialogWer d.h. welche Klasse? fhrt 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 Rckgabewerte

    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;

    TS OOP mit Delphi

    Zum Testen: Dialoge innerhalb der FachklasseMitunter kann es hilfreich sein, eine Fachklasse alleine zu testen, d.h. a la BlueJ unabhngig von einer GUI-Klasse.Fr kurze Dialoge (kleine Ein-/Ausgabefenster) bietet die Unit Dialogs folgende unabhngige Prozeduren und Funktionen:Ausgabefenster:ShowMessage () zeigt einen String an.

    Eingabefenster:InputBox (, , ) liefert den eingegebenen String.InputQuery (, , ) liefert Erfolg (true/false) und belegt ggf. die Variable mit der Benutzer-Eingabe.

    TS OOP mit Delphi

    bung zum Ticketautomat und UML-Editor: Einnahmen abholenKopieren 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).Ergnzen Sie (im UML-Editor) die Methode EinnahmenAbholen, die dem Automatenbetreiber zur Entnahme der gesamten Einnahmen dient.Exportieren Sie (im UML-Editor) nun die vernderte Klasse nach Delphi, d.h. berschreiben Sie die zugehrige Unit-Datei.Aktualisieren Sie (in Delphi) die vernderte Klasse, und ergnzen Sie die Implementierung der Methode EinnahmenAbholen: - Erfragen und prfen Sie den korrekten Zugangscode - Setzen Sie die Einnahmen auf Null, bzw. geben Sie eine Meldung Zugriff verweigert aus.Fgen Sie Ihrem Formular einen entsprechenden Button mit Ereignisbehandlungsprozedur hinzu,speichern Sie Ihre Delphi-Dateien und die (aktualisierte) UML-Datei,und testen Sie!Zusatz: Wie knnte man ein Parkticket in der GUI-Listbox ausgeben?

    TS OOP mit Delphi

    Modellierung von 17 und 417 und 4 : beteiligte Objekte ?

    TS OOP mit Delphi

    17 und 4genauer...?

    TS OOP mit Delphi

    17 und 4BankKartenstapelSpieler 1Spieler 2Spieler 3KartenKlassenbildung?

    TS OOP mit Delphi

    17 und 4TBankKartenstapelSpieler 1Spieler 2Spieler 3KartenTSpielerTKartenstapelTKarteTBankBeteiligte Klassen:

    TS OOP mit Delphi

    17 und 4: Modellierung der Spielkarten typNr6 farbNr4 gibFarbe Kreuz gibName Dame gibPunkte 3 Beispiel:

    TS OOP mit Delphi

    Modellierung des Kartenstapels Methoden?

    TS OOP mit Delphi

    Aufgaben: GUI fr erste Tests1.Verwenden von gegebenen Klassen: Spielkarten ziehen Vorgabe: nur diese beiden Klassen. Beginnen Sie ein neues Projekt und ent- wickeln Sie ein GUI fr 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!

    TS OOP mit Delphi

    Aufgabe: Entwurf von TSpieler2.Entwurf einer neuen Klasse TSpieler fr 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 zunchst auf Papier, dann im UML-Editor, und exportieren Sie die zugehrige Unit in Ihren Projektordner.Binden Sie diese Klasse in Ihr Projekt ein (uses...), und ergnzen 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). Prfen Sie beim Ziehen einer Karte (im GUI), ob sich der Spieler dadurch berreizt hat, und deaktivieren Sie ggf. den Ziehe-Button!

    TS OOP mit Delphi

    Aufgabe: Assoziation des KartenstapelsAssoziation: Bekanntmachen bzw. Zuordnen von ObjektenEin zweiter Mitspieler soll den gleichen Kartenstapel mitbenutzen.

    KartenstapelSchreib-Methode fr das (private!) AttributErweitern Sie TSpieler um das Assoziations-Attribut und die zugehrige Methode, erzeugen Sie zwei Spieler und einen Kartenstapel, und ordnen Sie diesen Stapel beiden Spielern zu. Testen Sie!

    TS OOP mit Delphi

    Aufgabe: Bank-Klasse (mit Vererbung)4.Vererbung: Spezialisierung von Objekten bzw. KlassenDie Bank ist ein besonderer Spieler mit erweiterten Fhigkeiten: 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 ergnzen Sie den exportierten Code-Rahmen. Testen Sie!TSpielerist eine Spezialisierung von Die Klasse TBank erbt von ihrer Oberklasse TSpieler alle Attribute und Methoden. Ggf. mssen ererbte Methoden neu definiert (berschrieben) werden!

    TS OOP mit Delphi

    17 und 4: Klassendiagramme

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammSekundenStoppuhr (ohne GUI)Hundertstel

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammSekundenStoppuhr (ohne GUI)Hundertstel

    TS OOP mit Delphi

    Stoppuhr: KlassendiagrammSekundenStoppuhr (ohne GUI)Hundertstel

    TS OOP mit Delphi

    Stoppuhr: Klassendiagramm

    TS OOP mit Delphi

    Stoppuhr: Klassendiagramm

    TS OOP mit Delphi

    bung: StoppuhrDefinieren Sie im UML-Editor die Klasse TZaehler.Exportieren Sie die zugehrige 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.Fgen Sie Ihrem Projekt die Zhler-Unit hinzu. (Projekt Hinzufgen... oder Ansicht Projektverwaltung... )Implementieren Sie die Zhler-Methoden!Erstellen Sie ein einfaches GUI zum Testen der Zhler-Klasse (z.B. fr Zhler erzeugen, Wert anzeigen, erhhen). Testen Sie!Kopieren und ffnen Sie das Delphi-Projekt Stoppuhr, fgen Sie Ihre Zhler-Klasse hinzu und testen Sie! Erweiterung 1:Fgen Sie einen Highscore fr die Bestzeit hinzu!Erweiterung 2:Entwickeln Sie eine 24-Stunden-Uhr mit Weckzeit!

    TS OOP mit Delphi

    Kontoverwaltung

    TS OOP mit Delphi

    Kontoverwaltung

    TS OOP mit Delphi

    KontoverwaltungProblem: gegenseitige kennt-Beziehungen!(berkreuz-Referenz mehrerer Units in Delphi nicht erlaubt!) Lsung: a) Mehrere Klassen in eine Unit b) Redesign mit Koppel-Klassen