Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


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

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

2 2 Miniprojekt chuck a luck 1$ Interaktive Systeme entwickeln Benutzungsoberfläche gestalten Ereignisverarbeitung konzipieren und implementieren Systeme modellieren und strukturieren

3 3 Teil 1 Grafische Benutzungsoberfläche

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

5 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 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 7 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. Benutzungsoberfläche Der erste Schritt besteht darin, eine Benutzungsoberfläche zu entwerfen und sie mit Hilfe der von Delphi vorgegebenen Komponentenpalette zu erstellen.

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

9 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 Im Objektinspektor werden Name und zugehörige Klasse eines Objekts in einem Fenster angezeigt. PKonto: TPanel

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

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

12 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: 2. Delphi starten 3. Datei Projekt speichern unter:

13 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.Charset = DEFAULT_CHARSET 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 end object PWuerfel: TPanel Left = 184 Top = end... end Achtung: Diese Datei wird in älteren Delphi-Versionen als Binärdatei abgespeichert. Siehe auch

14 14 verwaltet Objekthierarchie FGUI: TFGUI PUeberschrift: TPanel PSpielfeld: TPanel PWuerfel: TPanel PKonto: TPanel ESpielzahl: TEdit... 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.Charset = DEFAULT_CHARSET...

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

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

19 19 Teil 2 Ereignisse und ihre Verarbeitung

20 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 21 Realisierung in Delphi Doppel-Klick auf den Button erzeugt eine neue Prozedur. Doppel-Klick Prozedur zur Ereignisverarbeitung Ereignis

22 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 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 24 Initialisierung des Zufallsgenerators procedure TFGUI.FormCreate(Sender: TObject); begin randomize; end; 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.

25 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) Ereignisverarbeitung: Dieses Ereignis wird vom Betriebssystem an das Programm weitergegeben. Im Programm muss eine spezielle Prozedur BWuerfelWerfenClick zur Verarbeitung des Ereignisses implementiert sein. Zur Ereignisverarbeitung in Delphi siehe K. Merkert: Ereignis: Der Benutzer klickt auf den Button Würfel werfen und löst hierdurch das Ereignis BWuerfelWerfen.onClick aus. 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. Ereignis: Das Formular wird von Delphi erzeugt und löst dabei das Ereignis FGUI.onCreate aus.

26 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 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; Variablendeklaration PKontostand: TPanel Caption = ´99´... konto: 100 konto: 99 Datentyp Bezeichner PKontostand: TPanel Caption = ´100´... Variablen dienen dazu, Daten (eines festgelegten Datentyps) innerhalb eines Programms zwischenzuspeichern.

28 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; Wertzuweisung konto: 100 konto: 99 Variablenzustand vorher 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. Variablenzustand nachher

29 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; string Beachte: Bei einer Wertzuweisung müssen die Datentypen zusammenpassen. Datentyp integerTypumwandlung stringintegerTypumwandlung PKontostand: TPanel Caption = ´100´... PKontostand: TPanel Caption = ´99´... konto: 100 konto: 99

30 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; Deklarationsteil Anweisungsteil Prozedur-Deklaration Variablendeklaration Anweisung Kommentar Beachte: Erst deklarieren, dann benutzen Alle Variablen (Prozeduren etc.) müssen zuerst deklariert werden, bevor sie benutzt werden können.

31 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; Beachte: Syntaxregeln Damit der Delphi-Compiler das Programm in Maschinencode übersetzen kann, müssen die für die Programmiersprache Delphi geltenden Syntaxregeln eingehalten werden. Semikolon als Trennsymbol Schlüsselwort Vordefinierte Bezeichner

32 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; Sequenz Wertzuweisung Fallunterscheidung

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

34 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 35 Teil 4 Datenmodellierung

36 36 Initialisierung des Kontostands Die Initialisierung des Kontostands soll im Programm selbst erfolgen. 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; Version 1 Vorsicht: nicht korrekt!

37 37 Initialisierung des Kontostands Die Initialisierung des Kontostands soll im Programm selbst erfolgen. 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; Version 2 procedure TFGUI.FormCreate(Sender: TObject); var konto: integer; begin randomize; konto := 100; PKontostand.Caption := IntToStr(konto); end; Vorsicht: nicht korrekt!

38 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.FormCreate(Sender: TObject); begin randomize; konto := 100; PKontostand.Caption := IntToStr(konto); end; procedure TFGUI.BEinsatzZahlenClick (Sender: TObject); begin // Verarbeitung: Einsatz abbuchen konto := konto-1; // Ausgabe: Aktual. der Anzeige PKontostand.Caption := IntToStr(konto); end; Version 3 Korrekt!

39 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;... procedure TFGUI.FormCreate(Sender: TObject); begin randomize; konto := 100; PKontostand.Caption := IntToStr(konto); end; 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

40 40 Datenmodell zur Miniwelt 1$ 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 41 Datenmodell zur Miniwelt spielzahl: integer; wuerfel1: integer; wuerfel2: integer; wuerfel3: integer; konto: integer; 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.

42 42 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. Globale Variable type TFGUI = class(TForm)... private { Private-Deklarationen }... konto: integer; public { Public-Deklarationen } end;

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

44 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 45 Teil 5 Zustandsbasierte Modellierung

46 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 47 Zustandsbasierte Ablaufmodellierung 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 Aktueller Zustand bereit einsatzgezahlt gewürfelt Neuer Zustand einsatzgezahlt gewürfelt bereit Einsatz zahlen und Zahl tippen Würfel werfen Gewinn verbuchen

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

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

51 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 52 Aufgabe Modifizieren Sie das Chuck-A-Luck-System so, dass es das gewünschte Ablaufverhalten zeigt.

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

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

55 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 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: begin... end; gewuerfelt: begin... end;

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

58 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 case zustand of bereit: begin konto := konto-1; zustand := einsatzgezahlt; end; einsatzgezahlt:... gewuerfelt:... end; // Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); PWuerfel1.Caption := IntToStr(wuerfel1); PWuerfel2.Caption := IntToStr(wuerfel2); PWuerfel3.Caption := IntToStr(wuerfel3); end;

59 59 Teil 6 Zusammenfassung

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

61 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 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; Datenmodell GUI-Objekte

63 63 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; Trennung: GUI – Datenmodell Die Trennung zwischen GUI und Datenmodell sollte sich auch im Programmtext widerspiegeln.

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

65 65 Teil 7 Vertiefende Übungen

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

67 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 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 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 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 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 U. Bänisch: Praktische Informatik mit Delphi, Band 1/2. Cornelsen Frischalowski: Delphi 5.0, Band 1/2, Herdt-Verlag 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 72 Literaturhinweise S. Spolwig: Weitere Hinweise unter: Einsteiger-Tutorial


Herunterladen ppt "Einführung in die Software-Entwicklung mit Delphi Teil 1 Klaus Becker 2005."

Ähnliche Präsentationen


Google-Anzeigen