Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Einführung in die Software-Entwicklung mit Delphi Teil 1

Ähnliche Präsentationen


Präsentation zum Thema: "Einführung in die Software-Entwicklung mit Delphi Teil 1"—  Präsentation transkript:

1 Einführung in die Software-Entwicklung mit Delphi Teil 1
Klaus Becker 2005

2 Miniprojekt „chuck a luck“
1 4 1$ 1$ 2 5 1$ 1$ 1$ 1$ 1$ 3 1$ 1$ 1$ 1$ 3 3 6 Interaktive Systeme entwickeln Benutzungsoberfläche gestalten Ereignisverarbeitung konzipieren und implementieren Systeme modellieren und strukturieren

3 Grafische Benutzungsoberfläche
Teil 1 Grafische Benutzungsoberfläche

4 Das Würfelspiel „chuck a luck“
Einsatz zahlen und Zahl tippen Würfel werfen Gewinn verbuchen Einsatz: 1 $ Gewinn: 0 Treffer: 1 Treffer: Einsatz + 1 $ 2 Treffer: Einsatz + 2 $ 3 Treffer: Einsatz + 3 $ 1$ 1$ 1 4 1$ 1$ 2 5 1$ 1$ 1$ 1$ 1$ 3 1$ 1$ 1$ 1$ 1$ 3 3 6

5 Zielsetzung Ziel ist es, ein System zu entwickeln, mit dem das in Amerika weit verbreitete Würfelspiel „chuck a luck“ am Rechner gespielt werden kann. Als Werkzeug benutzen wir das Programmiersystem „Delphi“.

6 Anforderungen /1/ Der Benutzer hat einen vorgegebenen Geldbetrag auf seinem Konto. /2/ Der Benutzer kann seinen Einsatz zahlen und eine Zahl auf dem Spielfeld setzen. /3/ Das System simuliert auf Wunsch das Werfen von drei Würfeln. /4/ Das System berechnet auf Wunsch den Gewinn und verbucht ihn auf dem Konto. ...

7 Benutzungsoberfläche
Eine grafische Benutzungsoberfläche (GUI: Graphical User Interface) legt das äußere Erscheinungsbild eines Programms und die Interaktionsmöglichkeiten des Benutzers mit dem Programm fest. Eine grafische Benutzungsschnittstelle dient als Mensch-Maschine-Schnittstelle. Der erste Schritt besteht darin, eine Benutzungsoberfläche zu entwerfen und sie mit Hilfe der von Delphi vorgegebenen Komponentenpalette zu erstellen.

8 GUI-Objekt Eine Benutzungsoberfläche wird mit Hilfe von sog. GUI-Objekten aufgebaut. (GUI: Graphical User Interface) GUI-Objekt GUI-Objekt GUI-Objekt GUI-Objekt Die Eigenschaften eines Objekts kann man sich mit dem Objektinspektor anzeigen lassen.

9 Objekt Ein Objekt hat (in der Regel) einen Namen und wird einer Klasse zugeordnet. Die Klasse legt dabei den Typ des Objekts fest. PKonto: TPanel PKonto: TPanel Im Objektinspektor werden Name und zugehörige Klasse eines Objekts in einem Fenster angezeigt.

10 Aufbau und Zustand eines Objekts
Der Aufbau eines Objekts wird mit Hilfe von Attributen (Eigenschaften) festgelegt. Die Attributwerte legen den aktuellen Objektzustand fest. Klasse Name Name Klasse PKonto: TPanel Caption = ´Konto´ Left = 223 ... Attributwert Attribut Attributwert Attribut Objektdiagramm Um die Struktur von Objekten zu beschreiben, benutzen wir eine vereinfachende Darstellung. Man nennt eine solche Darstellung Objektdiagramm.

11 Aufgabe Erstellen Sie eine Benutzungsoberfläche, die aus folgendenden GUI-Objekten aufgebaut ist. Beachten Sie unbedingt den Hinweis auf der nächsten Folie. FGUI: TFGUI PWuerfel1: TPanel PWuerfel3: TPanel PWuerfel2: TPanel PWuerfel: TPanel PUeberschrift: TPanel Pspielfeld: TPanel PKonto: TPanel ESpielzahl: TEdit PKontostand: TPanel BGewinnVerbuchen: TButton BWuerfelWerfen: TButton BEinsatzZahlen: TButton

12 Vorbereitung eines Delphi-Projektes
Delphi erzeugt eine ganze Reihe von Dateien zur Verwaltung eines Programmierprojektes. Um diese Dateien verwalten zu können, sollte man sie immer in einem eigenen Ordner speichern. Schritte zur Vorbereitung eines Delphi-Projektes: 1. Neuen Ordner anlegen: <ChuckALuck0> 2. Delphi starten 3. Datei  Projekt speichern unter: <ChuckALuck0/...>

13 Ein Blick in die Datei „Unit1.dfm“
object FGUI: TFGUI Left = 399 Top = 112 Width = 514 Height = 302 Caption = 'Fgui' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object PUeberschrift: TPanel Left = 32 Top = 32 Width = 441 Height = 41 Caption = 'chuck a luck' ... Font.Color = clWindowText Font.Height = -19 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False TabOrder = 0 end object PSpielfeld: TPanel Left = 32 Top = 104 Width = 137 Height = 25 Caption = 'Spielfeld' TabOrder = 1 object PWuerfel: TPanel Left = 184 ... ... end Achtung: Diese Datei wird in älteren Delphi-Versionen als Binärdatei abgespeichert. Siehe auch

14 Objekthierarchie ... object FGUI: TFGUI Left = 399 Top = 112
Width = 514 Height = 302 Caption = 'Fgui' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object PUeberschrift: TPanel Left = 32 Top = 32 Width = 441 Height = 41 Caption = 'chuck a luck' ... FGUI: TFGUI PUeberschrift: TPanel PSpielfeld: TPanel PWuerfel: TPanel PKonto: TPanel ESpielzahl: TEdit ... „verwaltet“ ... ...

15 Ein Blick in die Datei „Unit1.pas“
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ExtCtrls; type TFGUI = class(TForm) ... private { Private-Deklarationen } public { Public-Deklarationen } end; var FGUI: TFGUI; implementation {$R *.DFM} end. Delphi-Quelltext

16 Delphi-Quelltext (Unit1.pas)
unit Unit1; interface uses ... type TFgui = class(TForm) PUeberschrift: TPanel; PSpielfeld: TPanel; PWuerfel: TPanel; PKonto: TPanel; ESpielzahl: TEdit; PWuerfel1: TPanel; PWuerfel2: TPanel; PWuerfel3: TPanel; PKontostand: TPanel; BWuerfelWerfen: TButton; BGewinnVerbuchen: TButton; BEinsatzZahlen: TButton; private { Private-Deklarationen } public { Public-Deklarationen } end; ... Deklaration eines Formulars mit GUI-Objekten

17 Kompilierung Beim Kompilieren wird ein Delphi-Projekt in lauffähigen Delphi-Code übersetzt (siehe Project1.exe). Dieser Code kann dann anschließend ausgeführt werden. Start

18 Aufgabe Testen Sie die Funktionalitäten des bisher entwickelten Programms. Was fällt auf?

19 Ereignisse und ihre Verarbeitung
Teil 2 Ereignisse und ihre Verarbeitung

20 Interaktion: Benutzer - Programm
Das erwartete Verhalten des Programms kann wie folgt beschrieben werden: Auslösendes Ereignis Eingabe der Spielzahl Mausklick auf den Button mit der Aufschrift „Einsatz zahlen“ Mausklick auf den Button mit der Aufschrift „Würfel werfen“ Mausklick auf den Button mit der Aufschrift „Gewinn verbuchen“ Ausgelöste Aktion(en) Der Einsatz wird vom Konto abgebucht. Der neue Kontostand wird angezeigt. Die Würfelwürfe werden simuliert. Die Würfelergebnisse werden angezeigt. Die Spielzahl wird übernommen, der Gewinn dann ermittelt und auf dem Konto verbucht. Der neue Kontostand wird angezeigt.

21 Realisierung in Delphi
Doppel-Klick auf den Button erzeugt eine neue Prozedur. Ereignis Doppel-Klick Prozedur zur Ereignisverarbeitung

22 Ereignisverarbeitung
Wir ergänzen die Implementierung der Prozedur wie unten angezeigt und kompilieren das Programm. Bei einem Mausklick auf den Button mit der Aufschrift „Würfel werfen“ zeigt das Programm das gewünschte Verhalten. procedure TFGUI.BWuerfelWerfenClick(Sender: TObject); var wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; begin // Verarbeitung: Würfeln simulieren wuerfel1 := random(6)+1; wuerfel2 := random(6)+1; wuerfel3 := random(6)+1; // Ausgabe: Aktualisierung der Anzeige PWuerfel1.Caption := IntToStr(wuerfel1); PWuerfel2.Caption := IntToStr(wuerfel2); PWuerfel3.Caption := IntToStr(wuerfel3); end;

23 Ereignisverarbeitung
Analog erzeugen wir eine Prozedur zur Verarbeitung eines Mausklicks auf den Button mit der Aufschrift „Einsatz zahlen“. procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer; begin // Eingabe: Kontostand übernehmen konto := StrToInt(PKontostand.Caption); // Verarbeitung: Einsatz vom Konto abbuchen konto := konto-1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end;

24 Initialisierung des Zufallsgenerators
Auslösendes Ereignis Erzeugung des Formulars (unmittelbar nach dem Programmstart) Ausgelöste Aktion(en) Der Zufallsgenerator von Delphi wird initialisiert. Doppel-Klick auf das Formular erzeugt eine neue Prozedur. procedure TFGUI.FormCreate(Sender: TObject); begin randomize; end;

25 Ereignisse Ein Ereignis ist eine Zustandsänderung in einem Objekt, die von Interesse ist und daher mit einer Ereignisbehandlungsroutine (Prozedur zur Ereignisverarbeitung) verknüpft werden kann. (K. Merkert) Ereignis: Der Benutzer klickt auf den Button „Würfel werfen“ und löst hierdurch das Ereignis „BWuerfelWerfen.onClick“ aus. Ereignis: Das Formular wird von Delphi erzeugt und löst dabei das Ereignis „FGUI.onCreate“ aus. Ereignisverarbeitung: Dieses Ereignis wird vom Betriebssystem an das Programm weitergegeben. Im Programm muss eine spezielle Prozedur „BWuerfelWerfenClick“ zur Verarbeitung des Ereignisses implementiert sein. Ereignisverarbeitung: Dieses Ereignis wird vom Betriebs-system an das Programm weiter-gegeben. Im Programm muss eine spezielle Prozedur „FGUICreate“ zur Verarbeitung des Ereignisses implementiert sein. Zur Ereignisverarbeitung in Delphi siehe K. Merkert:

26 Aufgabe Ergänzen Sie Schritt für Schritt die Prozeduren zur Ereignisverarbeitung. Versuchen Sie insbesondere, die Prozedur zur Verarbeitung des Ereignisses „Mausklick auf den Button Gewinn verbuchen“ in Analogie zu den gezeigten Ereignisverarbeitungsprozeduren zu entwickeln. Nutzen Sie das Hilfe-System von Delphi bei der Implementierung bzw. die folgenden Folien.

27 Exkurs: Delphi-Grundlagen
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer; begin // Eingabe: Kontostand übernehmen konto := StrToInt(PKontostand.Caption); // Verarbeitung: Einsatz vom Konto abbuchen konto := konto-1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end; PKontostand: TPanel Variablendeklaration Caption = ´100´ ... konto: Bezeichner Datentyp konto: 100 konto: 99 PKontostand: TPanel Caption = ´99´ ... Variablen dienen dazu, Daten (eines festgelegten Datentyps) innerhalb eines Programms zwischenzuspeichern.

28 Exkurs: Delphi-Grundlagen
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer; begin // Eingabe: Kontostand übernehmen konto := StrToInt(PKontostand.Caption); // Verarbeitung: Einsatz vom Konto abbuchen konto := konto-1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end; konto: konto: 100 Variablenzustand vorher Wertzuweisung konto: 99 Variablenzustand nachher Eine Veränderung eines Variablenwerts kann mit Hilfe einer Wertzuweisung erfolgen. Der Wert des Terms (rechte Seite der Wertzuweisung) wird bzgl. des aktuellen Variablenzustands ermittelt und der Variablen (linke Seite der Wertzuweisung) als neuer Wert zugewiesen. Der Inhalt der zur Variablen gehörenden Speicherzelle wird dabei überschrieben.

29 Exkurs: Delphi-Grundlagen
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer; begin // Eingabe: Kontostand übernehmen konto := StrToInt(PKontostand.Caption); // Verarbeitung: Einsatz vom Konto abbuchen konto := konto-1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end; PKontostand: TPanel Datentyp Caption = ´100´ ... konto: konto: 100 integer Typumwandlung string konto: 99 PKontostand: TPanel Caption = ´99´ ... string Typumwandlung integer Beachte: Bei einer Wertzuweisung müssen die Datentypen zusammenpassen.

30 Exkurs: Delphi-Grundlagen
procedure TFGUI.BWuerfelWerfenClick(Sender: TObject); var wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; begin // Verarbeitung: Würfeln simulieren wuerfel1 := random(6)+1; wuerfel2 := random(6)+1; wuerfel3 := random(6)+1; // Ausgabe: Aktualisierung der Anzeige PWuerfel1.Caption := IntToStr(wuerfel1); PWuerfel2.Caption := IntToStr(wuerfel2); PWuerfel3.Caption := IntToStr(wuerfel3); end; Variablendeklaration Deklarationsteil Kommentar Anweisung Anweisungsteil Prozedur-Deklaration Beachte: Erst deklarieren, dann benutzen Alle Variablen (Prozeduren etc.) müssen zuerst deklariert werden, bevor sie benutzt werden können.

31 Exkurs: Delphi-Grundlagen
procedure TFGUI.BWuerfelWerfenClick(Sender: TObject); var wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; begin // Verarbeitung: Würfeln simulieren wuerfel1 := random(6)+1; wuerfel2 := random(6)+1; wuerfel3 := random(6)+1; // Ausgabe: Aktualisierung der Anzeige PWuerfel1.Caption := IntToStr(wuerfel1); PWuerfel2.Caption := IntToStr(wuerfel2); PWuerfel3.Caption := IntToStr(wuerfel3); end; Schlüsselwort Semikolon als Trennsymbol Vordefinierte Bezeichner Beachte: Syntaxregeln Damit der Delphi-Compiler das Programm in Maschinencode übersetzen kann, müssen die für die Programmiersprache Delphi geltenden Syntaxregeln eingehalten werden.

32 Exkurs: Delphi-Grundlagen
procedure TFGUI.BGewinnVerbuchenClick(Sender: TObject); var wuerfel1, wuerfel2, wuerfel3: integer; spielzahl: integer; konto: integer; treffer: integer; begin // Eingabe: spieldaten übernehmen spielzahl := StrToInt(ESpielzahl.Text); konto := StrToInt(PKontostand.Caption); wuerfel1 := StrToInt(PWuerfel1.Caption); wuerfel2 := StrToInt(PWuerfel2.Caption); wuerfel3 := StrToInt(PWuerfel3.Caption); // Verarbeitung: Treffer und neuen Kontostand bestimmen treffer := 0; if spielzahl = wuerfel1 then inc(treffer); if spielzahl = wuerfel2 then inc(treffer); if spielzahl = wuerfel3 then inc(treffer); if treffer > 0 then konto := konto+treffer+1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end; Wertzuweisung Sequenz Fallunterscheidung

33 Exkurs: Delphi-Grundlagen
Kontrollstrukturen dienen dazu, den genauen Ablauf der Verarbeitung festzulegen. Wichtige Kontrollstrukturen sind Sequenz(bildung), Fallunterscheidung und Wiederholung. begin end; if ... then begin end; Wiederholung mit Anfangsbedingung while ... do begin end; Sequenz if ... then begin end else begin end; Einseitige Fallunterscheidung Zweiseitige Fallunterscheidung repeat until ...; for ... to ... do begin end; Wiederholung mit Endbedingung Zählschleife

34 Aufgabe Das Programm zur Simulation des Chuck-A-Luck-Spiels soll wie folgt modifiziert werden: - Das gesamte Spiel soll mit nur einem Button ausgeführt werden. - Zur Eingabe der Spielzahl soll eine sog. RadioGroup benutzt werden.

35 Teil 4 Datenmodellierung

36 Initialisierung des Kontostands
Die Initialisierung des Kontostands soll im Programm selbst erfolgen. Version 1 procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer; begin konto := 100; // Eingabe: Kontostand übernehmen konto := StrToInt(PKontostand.Caption); // Verarbeitung: Einsatz vom Konto abbuchen konto := konto-1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end; Vorsicht: nicht korrekt!

37 Initialisierung des Kontostands
Die Initialisierung des Kontostands soll im Programm selbst erfolgen. Vorsicht: nicht korrekt! Version 2 procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer; begin // Verarbeitung: Einsatz vom Konto abbuchen konto := konto-1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end; procedure TFGUI.FormCreate(Sender: TObject); var konto: integer; begin randomize; konto := 100; PKontostand.Caption := IntToStr(konto); end;

38 Initialisierung des Kontostands
unit Unit1; interface uses ... type TFGUI = class(TForm) PUeberschrift: TPanel; private { Private-Deklarationen } konto: integer; public { Public-Deklarationen } end; var FGUI: TFGUI; procedure TFGUI.BEinsatzZahlenClick (Sender: TObject); begin // Verarbeitung: Einsatz abbuchen konto := konto-1; // Ausgabe: Aktual. der Anzeige PKontostand.Caption := IntToStr(konto); end; Korrekt! procedure TFGUI.FormCreate(Sender: TObject); begin randomize; konto := 100; PKontostand.Caption := IntToStr(konto); end; Version 3

39 Attribut als globale Variable
unit Unit1; interface uses ... type TFGUI = class(TForm) PUeberschrift: TPanel; private { Private-Deklarationen } konto: integer; public { Public-Deklarationen } end; var FGUI: TFGUI; Durch die nebenstehende Deklaration wird das Formular-Objekt um ein Attribut zur Verwaltung des Kontostandes erweitert. Neben Attributen zur Verwaltung der GUI-Objekte kann ein Formular-Objekt auch Attribute zur Verwaltung weiterer Daten enthalten. Diese werden hier in den Bereich „private Deklarationen“ geschrieben. Attribut procedure TFGUI.FormCreate(Sender: TObject); begin randomize; konto := 100; PKontostand.Caption := IntToStr(konto); end;

40 Datenmodell zur Miniwelt
1 4 1$ 1$ 2 5 1$ 1$ 1$ 1$ 1$ 3 1$ 1$ 1$ 1$ 3 3 6 spielzahl: integer; wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; konto: integer; Unter einem Datenmodell soll hier eine Beschreibung der Miniwelt verstanden werden, bei der die relevanten Daten mit Hilfe von Variablen / Attributen eines Objektes erfasst werden.

41 Datenmodell zur Miniwelt
type TFGUI = class(TForm) Pueberschrift: TPanel; Pspielfeld: TPanel; Pwuerfel: TPanel; Pkonto: TPanel; ... BWuerfelWerfen: TButton; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } spielzahl: integer; wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; konto: integer; public { Public-Deklarationen } end; Das Formular-Objekt soll auch für die Verwaltung der Spieldaten zuständig sein. Hierzu werden entsprechende Attribute in den Bereich „private Deklarationen“ eingeführt. spielzahl: integer; wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; konto: integer;

42 Lokale Variable type TFGUI = class(TForm) ... private { Private-Deklarationen } konto: integer; public { Public-Deklarationen } end; „Globale Variable“ procedure TFGUI.BGewinnVerbuchenClick(Sender: TObject); var treffer: integer; begin ... if treffer > 0 then konto := konto+treffer+1; ... end; Lokale Variable Eine lokale Variable ist eine Variable, die innerhalb einer Prozedur deklariert ist und auch nur innerhalb dieser Prozedur zugreifbar ist.

43 Aufgabe Verändern Sie das Programm so, dass das Datenmodell mit Hilfe von Formular-Attributen implementiert wird.

44 Aufgabe Das Programm zur Simulation des Spiels „chuck a luck“ soll dem Benutzer auch folgende statistische Daten liefern: - Gesamtanzahl der Spiele - insgesamt gewonnener / verlorener Betrag - pro Spiel durchschnittlich gewonnener / verlorener Betrag Erweitern Sie schrittweise das bestehende Chuck-A-Luck-System.

45 Zustandsbasierte Modellierung
Teil 5 Zustandsbasierte Modellierung

46 Aufbesserung des Kontos
Das Programm zur Simulation des Chuck-A-Luck-Spiels lässt noch Bedienungen zu, die in der Miniwelt nicht erlaubt sind. Einsatz zahlen und Zahl tippen Würfel werfen Gewinn verbuchen Einsatz zahlen Zahl tippen (z. B. 1) Solange Würfel werfen, bis die getippte Zahl fällt Gewinn verbuchen

47 Zustandsbasierte Ablaufmodellierung
Aktueller Zustand bereit einsatzgezahlt gewürfelt Auslösendes Ereignis BEinsatzZahlen. onClick RGSpielfeld. onClick BWuerfelWerfen. onClick BGewinnVerbuchen. onClick Ausgelöste Aktion(en) Einsatz vom Konto abbuchen Spielzahl festlegen Würfelwerfen simulieren Gewinn ermitteln und auf dem Konto verbuchen Neuer Zustand einsatzgezahlt gewürfelt bereit Einsatz zahlen und Zahl tippen Würfel werfen Gewinn verbuchen

48 Zustandsbasierte Ablaufmodellierung
RGSpielfeld.onClick / Spielzahl festlegen BEinsatzZahlen.onClick / Einsatz vom Konto abbuchen BWuerfelWerfen.onClick/ Würfelwerfen simulieren einsatz gezahlt bereit gewürfelt BGewinnVerbuchen.onClick / Gewinn ermitteln und auf dem Konto verbuchen Einsatz zahlen und Zahl tippen Würfel werfen Gewinn verbuchen

49 Zustandsbasierte Modellierung
Aktueller Zustand bereit einsatzgezahlt gewürfelt Auslösendes Ereignis BEinsatzZahlen. onClick RGSpielfeld. onClick BWuerfelWerfen. onClick BGewinnVerbuchen. onClick Ausgelöste Aktion(en) Einsatz vom Konto abbuchen Spielzahl festlegen Würfelwerfen simulieren Gewinn ermitteln und auf dem Konto verbuchen Neuer Zustand einsatzgezahlt gewürfelt bereit Zustandsbasierte Modellierung wird benutzt, um Systeme zu beschreiben, bei denen das Verhalten nicht nur von „äußeren“ Eingaben bzw. Ereignissen, sondern auch von „inneren“ Zuständen abhängt, die das System durchlaufen hat. Das Ergebnis einer solchen Modellierung nennt man auch Zustandsautomat.

50 Zustandsbasierte Modellierung
Zustandsautomat RGSpielfeld.onClick / Spielzahl festlegen Auslösendes Ereignis Ausgelöste Aktion(en) Anfangs-zustand BEinsatzZahlen.onClick / Einsatz vom Konto abbuchen BWuerfelWerfen.onClick/ Würfelwerfen simulieren einsatz gezahlt bereit gewürfelt BGewinnVerbuchen.onClick / Gewinn ermitteln und auf dem Konto verbuchen Zustand Zustands-übergang

51 Ansatz: GUI-Objekte (de)aktivieren
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); begin // Aktualisierung des Datenmodells konto := konto-1; // Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); // Aktualisierung der Kontrolle BEinsatzZahlen.Enabled := false; RGSpielfeld.Enabled := true; BWuerfelWerfen.Enabled := true; end; Das gewünschte Verhalten lässt sich mit Hilfe des Attribut „Enabled“ der benutzten GUI-Objekte implementieren.

52 Aufgabe Modifizieren Sie das Chuck-A-Luck-System so, dass es das gewünschte Ablaufverhalten zeigt.

53 Ansatz: Datenmodell erweitern
type tZustand = (bereit, einsatzgezahlt, gewuerfelt); TFGUI = class(TForm) ... spielzahl: integer; wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; konto: integer; zustand: tZustand; Wir erweitern das Datenmodell um eine Variable zur Beschreibung des Spielzustands. procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); begin if zustand = bereit then // Aktualisierung des Datenmodells konto := konto-1; zustand := einsatzgezahlt; // Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end;

54 Aufgabe Modifizieren Sie das Chuck-A-Luck-System so, dass es das gewünschte Ablaufverhalten zeigt.

55 Ein Button, viele Aufgaben
Wir benutzen nur noch einen Button zur Spielkontrolle. In Abhängigkeit des jeweiligen Spielzustands soll sich die Aufschrift und das Verhalten des Buttons ändern.

56 Aufgabe Passen Sie das Chuck-A-Luck-System an die neuen Anforderungen an. Nutzen Sie die sog. case-Anweisung zur Fallunterscheidung (siehe Delphi-Hilfe). case zustand of bereit: begin ... end; einsatzgezahlt: end; gewuerfelt:

57 Zustandsbasierte Modellierung
Beachte: Das gleiche Ereignis führt hier zu unterschiedlichen Aktionen. RGSpielfeld.onClick / Spielzahl festlegen BSpielen.onClick / Einsatz vom Konto abbuchen BSpielen.onClick/ Würfelwerfen simulieren einsatz gezahlt bereit gewürfelt BSpielen.onClick / Gewinn ermitteln und auf Konto verbuchen

58 Strukturierung der Lösung
procedure TFGUI.BSpielenClick(Sender: TObject); var treffer: integer; begin // Aktualisierung der Kontrolle case zustand of bereit: begin BSpielen.Caption := 'Würfel werfen'; ... end; einsatzgezahlt: gewuerfelt: ... end; // Aktualisierung des Datenmodells bereit: begin konto := konto-1; zustand := einsatzgezahlt; end; einsatzgezahlt: ... gewuerfelt: ... // Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); PWuerfel1.Caption := IntToStr(wuerfel1); PWuerfel2.Caption := IntToStr(wuerfel2); PWuerfel3.Caption := IntToStr(wuerfel3);

59 Teil 6 Zusammenfassung

60 Benutzungsoberfläche
Die Mensch-Maschine-Interaktion wird wesentlich durch die GUI-Objekte zur Gestaltung der Benutzungsoberfläche bestimmt. FGUI: TFGUI PWuerfel1: TPanel PWuerfel3: TPanel PWuerfel2: TPanel PWuerfel: TPanel PUeberschrift: TPanel Pspielfeld: TPanel PKonto: TPanel ESpielzahl: TEdit PKontostand: TPanel BGewinnVerbuchen: TButton BWuerfelWerfen: TButton BEinsatzZahlen: TButton

61 EVA - Systeme Einfache Eingabe-Verarbeitung-Ausgabe-Systeme lassen sich direkt mit Hilfe von GUI-Objekten realisieren. procedure TFGUI.BGewinnVerbuchenClick(Sender: TObject); var treffer: integer; wuerfel1, wuerfel2, wuerfel3, spielzahl, konto: integer; begin // Eingabe: Spieldaten übernehmen spielzahl := StrToInt(ESpielzahl.Text); konto := StrToInt(PKontostand.Caption); wuerfel1 := StrToInt(PWuerfel1.Caption); wuerfel2 := StrToInt(PWuerfel2.Caption); wuerfel3 := StrToInt(PWuerfel3.Caption); // Verarbeitung: Treffer und neuen Kontostand bestimmen treffer := 0; if spielzahl = wuerfel1 then inc(treffer); if spielzahl = wuerfel2 then inc(treffer); if spielzahl = wuerfel3 then inc(treffer); if treffer > 0 then konto := konto+treffer+1; // Ausgabe: Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end;

62 Trennung: GUI – Datenmodell
Bei komplexeren Systemen ist es günstig, ein von der GUI getrenntes Datenmodell zu entwickeln. type TFgui = class(TForm) Pueberschrift: TPanel; Pspielfeld: TPanel; Pwuerfel: TPanel; Pkonto: TPanel; ... BWuerfelWerfen: TButton; private { Private-Deklarationen } spielzahl: integer; wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; konto: integer; public { Public-Deklarationen } end; GUI-Objekte Datenmodell

63 Trennung: GUI – Datenmodell
Die Trennung zwischen GUI und Datenmodell sollte sich auch im Programmtext widerspiegeln. procedure TFGUI.BGewinnVerbuchenClick(Sender: TObject); var treffer: integer; begin // Eingabe: Datenmodell aktualisieren spielzahl := StrToInt(ESpielzahl.Text); konto := StrToInt(PKontostand.Caption); wuerfel1 := StrToInt(PWuerfel1.Caption); wuerfel2 := StrToInt(PWuerfel2.Caption); wuerfel3 := StrToInt(PWuerfel3.Caption); // Verarbeitung: Daten verarbeiten treffer := 0; if spielzahl = wuerfel1 then inc(treffer); if spielzahl = wuerfel2 then inc(treffer); if spielzahl = wuerfel3 then inc(treffer); if treffer > 0 then konto := konto+treffer+1; // Ausgabe: Anzeige aktualisieren PKontostand.Caption := IntToStr(konto); end;

64 Zustandsbasierte Modellierung
Zustandsbasierte Modellierung ist eine wichtige Technik, um komplexere (reaktive) Systeme zu entwerfen. RGSpielfeld.onClick / Spielzahl festlegen BEinsatzZahlen.onClick / Einsatz vom Konto abbuchen BWuerfelWerfen.onClick/ Würfelwerfen simulieren einsatz gezahlt bereit gewürfelt BGewinnVerbuchen.onClick / Gewinn ermitteln und auf Konto verbuchen

65 Teil 7 Vertiefende Übungen

66 Aufgabe Entwickeln Sie ein einfaches Eingabe-Ausgabe-System zur Berechnung des BMI-Indexes. Eingaben: Körpergröße, Gewicht Ausgaben: BMI-Index, ...

67 Aufgabe Die Entwicklung der Weltbevölkerung schreitet rasch voran: Im Jahr 2000 lebten etwa 6 Milliarden auf der Erde. Zur Zeit wächst die Weltbevölkerung jährlich um ca. 1,3 %. Kann das so weitergehen? Mit Hilfe eines interaktiven Simulationsprogramms soll der Benutzer die Konsequenzen eines solchen Wachstums austesten können. Das Programm kann wie folgt erweitert werden: Auslösendes Ereignis: Mausklick auf <-Button Mausklick auf >>-Button Ausgelöste Aktion(en): Die vorherige Population (jeweils vor einem Jahr) wird berechnet (und angezeigt), sofern das Jahr nicht vor 2000 ist. Die Population 10 Jahre später wird berechnet (und angezeigt). Die Population 10 Jahre vorher wird berechnet (und angezeigt). Man kann aber höchstens bis 2000 zurückspringen.

68 Aufgabe Entwickeln Sie ein einfaches zustandsbasiertes System zur Simulation einer Ampel. Hinweis: Die Ampel soll zunächst möglichst einfach dargestellt werden. Erst in einem zweiten Schritt können sie die Darstellung optimieren (wie z. B. in den Materialien zum Buch Damann, Wemßen: Objektorientierte Programmierung mit Delphi, Band 1, s. u.).

69 Aufgabe Entwickeln Sie ein Programm zur Simulation des Ziegenproblems.
Der Moderator einer Spielshow zeigt dem Kandidaten 3 Türen. "Hinter einer der 3 Türen steht der Hauptgewinn, ein Auto. Hinter den beiden anderen Türen sind Ziegen. Welche Tür wählen Sie ?" Nachdem sich der Kandidat entschieden hat (z.B. für Tür 1), öffnet der Moderator eine der beiden anderen mit einer Ziege (z.B. Tür 3). "Bleiben Sie nun bei Ihrer Wahl oder möchten Sie auf Tür 2 umwählen ?" Siehe auch:

70 Aufgabe Entwickeln Sie ein Programm zur Simulation eines einfachen Taschenrechners. Gehen Sie dabei schrittweise vor – von einem ersten einfachen System (das evtl. nur ganze Zahlen verarbeitet) bis hin zu komplexeren Systemen (die evtl. Speichertasten, Klammern, ... zulassen).

71 Literaturhinweise E. Modrow: Informatik mit Delphi, Band 1/2, Dümmler-Stam P. Damann, J. Wemßen: Objektorientierte Programmierung mit Delphi, Band 1. Klett-Verlag 2001. U. Bänisch: Praktische Informatik mit Delphi, Band 1/2. Cornelsen 2001. Frischalowski: Delphi 5.0, Band 1/2, Herdt-Verlag 1999. Pohl: Schülerübungen / Klausuren in Delphi, Heft 1/2, Verlag J. Pohl Noll, Mayr, Paulus, Selinger: K. Merkert: R. Mechling: K. Heidler: Hessischer Bildungsserver:

72 Literaturhinweise S. Spolwig: Weitere Hinweise unter: Einsteiger-Tutorial ...


Herunterladen ppt "Einführung in die Software-Entwicklung mit Delphi Teil 1"

Ähnliche Präsentationen


Google-Anzeigen