Post on 06-Apr-2015
transcript
Einführung in dieSoftware-Entwicklung mit
Delphi Teil 1
Klaus Becker
2005
2 Miniprojekt „chuck a luck“
1$ 1$ 1$ 1$1$ 1$ 1$
1$ 1$1
2
3
4
5
631$31$
Interaktive Systeme entwickeln Benutzungsoberfläche gestalten Ereignisverarbeitung konzipieren und implementieren Systeme modellieren und strukturieren
3 Teil 1
Grafische Benutzungsoberfläche
4 Das Würfelspiel „chuck a luck“
1$ 1$ 1$ 1$1$ 1$ 1$
1$1$ 1$
1
2
3
4
5
6
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$
1$
1$1$
3
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
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 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
GUI-Objekt
GUI-Objekt
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 Aufbau und Zustand eines Objekts
PKonto: TPanel
Caption = ´Konto´Left = 223...
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 Aufgabe
Erstellen Sie eine Benutzungsoberfläche, die aus folgendenden GUI-Objekten aufgebaut ist. Beachten Sie unbedingt den Hinweis auf der nächsten Folie.
PUeberschrift:
TPanelPKonto: TPanel
PWuerfel: TPanel
Pspielfeld: TPanel
PWuerfel1: TPanel PWuerfel2:
TPanel
PKontostand:
TPanel
PWuerfel3:TPanel
BWuerfelWerfen:
TButton
ESpielzahl: TEdit
FGUI: TFGUI
BEinsatzZahlen:TButton
BGewinnVerbuchen:
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.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 = 104 ... end ...end
Achtung: Diese Datei wird in älteren Delphi-Versionen als Binärdatei abgespeichert.Siehe auch http://hsg.region-kaiserslautern.de/faecher/inf/material/misc/d6_2_d4.php
14
„verwaltet“
Objekthierarchie
FGUI:TFGUI
PUeberschrift:TPanelPSpielfeld: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 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;interfaceuses ...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
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 Aufgabe
Testen Sie die Funktionalitäten des bisher entwickelten Programms. Was fällt auf?
19 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.
Doppel-Klick
Prozedur zur Ereignisverarbeitung
Ereignis
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 simulierenwuerfel1 := random(6)+1;wuerfel2 := random(6)+1;wuerfel3 := random(6)+1;// Ausgabe: Aktualisierung der AnzeigePWuerfel1.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 übernehmenkonto := StrToInt(PKontostand.Caption);// Verarbeitung: Einsatz vom Konto abbuchenkonto := konto-1;// Ausgabe: Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);end;
24
Initialisierung des Zufallsgenerators
procedure TFGUI.FormCreate(Sender: TObject);beginrandomize;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 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: http://hsg.region-kaiserslautern.de/faecher/inf/material/ereignisse/index.php
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 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 übernehmenkonto := StrToInt(PKontostand.Caption);
// Verarbeitung: Einsatz vom Konto abbuchenkonto := konto-1;
// Ausgabe: Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);
end;
Variablendeklaration
PKontostand: TPanel
Caption = ´99´...
konto:
konto: 100
konto: 99
DatentypBezeichner
PKontostand: TPanel
Caption = ´100´...
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 übernehmenkonto := StrToInt(PKontostand.Caption);
// Verarbeitung: Einsatz vom Konto abbuchenkonto := konto-1;
// Ausgabe: Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);end;
Wertzuweisung
konto:
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 Exkurs: Delphi-Grundlagen
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer;begin
// Eingabe: Kontostand übernehmenkonto := StrToInt(PKontostand.Caption);
// Verarbeitung: Einsatz vom Konto abbuchenkonto := konto-1;
// Ausgabe: Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);
end;
string
Beachte: Bei einer Wertzuweisung müssen die Datentypen zusammenpassen.
Datentyp
integer
Typumwandlung
string integer
Typumwandlung
PKontostand: TPanel
Caption = ´100´...
PKontostand: TPanel
Caption = ´99´...
konto:
konto: 100
konto: 99
30 Exkurs: Delphi-Grundlagen
procedure TFGUI.BWuerfelWerfenClick(Sender: TObject); var wuerfel1: integer; wuerfel2: integer; wuerfel3: integer;begin// Verarbeitung: Würfeln simulierenwuerfel1 := random(6)+1;wuerfel2 := random(6)+1;wuerfel3 := random(6)+1;// Ausgabe: Aktualisierung der AnzeigePWuerfel1.Caption := IntToStr(wuerfel1);PWuerfel2.Caption := IntToStr(wuerfel2);PWuerfel3.Caption := IntToStr(wuerfel3);end;
Deklarationsteil
Anweisungsteil
Prozedur-Deklaration
Variablendeklaration
Anweisung
Kommentar
Beachte: Erst deklarieren, dann benutzenAlle 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 simulierenwuerfel1 := random(6)+1;wuerfel2 := random(6)+1;wuerfel3 := random(6)+1;// Ausgabe: Aktualisierung der AnzeigePWuerfel1.Caption := IntToStr(wuerfel1);PWuerfel2.Caption := IntToStr(wuerfel2);PWuerfel3.Caption := IntToStr(wuerfel3);end;
Beachte: SyntaxregelnDamit 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 Exkurs: Delphi-Grundlagen
procedure TFGUI.BGewinnVerbuchenClick(Sender: TObject); var wuerfel1, wuerfel2, wuerfel3: integer; spielzahl: integer; konto: integer; treffer: integer;begin// Eingabe: spieldaten übernehmenspielzahl := StrToInt(ESpielzahl.Text);konto := StrToInt(PKontostand.Caption);wuerfel1 := StrToInt(PWuerfel1.Caption);wuerfel2 := StrToInt(PWuerfel2.Caption);wuerfel3 := StrToInt(PWuerfel3.Caption);// Verarbeitung: Treffer und neuen Kontostand bestimmentreffer := 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 AnzeigePKontostand.Caption := IntToStr(konto);end;
Sequenz
Wertzuweisung
Fallunterscheidung
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 ... endelse begin ... end;
while ... do begin ... end;
Wiederholung mit
Anfangsbedingung
repeat ...until ...;
Zweiseitige Fallunterscheidung
ZählschleifeWiederholung
mitEndbedingung
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.
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject); var konto: integer;beginkonto := 100;// Eingabe: Kontostand übernehmenkonto := StrToInt(PKontostand.Caption);// Verarbeitung: Einsatz vom Konto abbuchenkonto := konto-1;// Ausgabe: Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);end;
Version 1
Vorsicht: nicht korrekt!
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 abbuchenkonto := konto-1;// Ausgabe: Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);end;
Version 2
procedure TFGUI.FormCreate(Sender: TObject); var konto: integer;beginrandomize;konto := 100;PKontostand.Caption := IntToStr(konto);end;
Vorsicht: nicht korrekt!
38 Initialisierung des Kontostands
unit Unit1;interfaceuses ...type TFGUI = class(TForm) PUeberschrift: TPanel; ... private { Private-Deklarationen } konto: integer; public { Public-Deklarationen } end;var FGUI: TFGUI;...
procedure TFGUI.FormCreate(Sender: TObject);beginrandomize;konto := 100;PKontostand.Caption := IntToStr(konto);end;
procedure TFGUI.BEinsatzZahlenClick (Sender: TObject);begin// Verarbeitung: Einsatz abbuchenkonto := konto-1;// Ausgabe: Aktual. der AnzeigePKontostand.Caption := IntToStr(konto);end;
Version 3
Korrekt!
39 Attribut als globale Variable
unit Unit1;interfaceuses ...type TFGUI = class(TForm) PUeberschrift: TPanel; ... private { Private-Deklarationen } konto: integer; public { Public-Deklarationen } end;var FGUI: TFGUI;...
procedure TFGUI.FormCreate(Sender: TObject);beginrandomize;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 Datenmodell zur Miniwelt
1$ 1$ 1$ 1$1$ 1$ 1$
1$ 1$1
2
3
4
5
631$31$
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
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
procedure TFGUI.BGewinnVerbuchenClick(Sender: TObject); var treffer: integer;begin...if treffer > 0 then konto := konto+treffer+1;...end;
Lokale Variable
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 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 BetragErweitern Sie schrittweise das bestehende Chuck-A-Luck-System.
45 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 zahlenZahl tippen (z. B. 1)Solange Würfel werfen, bis die getippte Zahl fälltGewinn verbuchen
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
AktuellerZustand
bereit
einsatzgezahlt
gewürfelt
NeuerZustand
einsatzgezahlt
einsatzgezahlt
gewürfelt
bereit
Einsatz zahlen und Zahl tippen
Würfel werfen
Gewinn verbuchen
48
Zustandsbasierte Ablaufmodellierung
Einsatz zahlen und Zahl tippen
Würfel werfen
Gewinn verbuchen
BEinsatzZahlen.onClick / Einsatz vom Konto
abbuchen
bereiteinsatzgezahlt
RGSpielfeld.onClick / Spielzahl festlegen
BGewinnVerbuchen.onClick /Gewinn ermitteln und auf dem Konto
verbuchen
BWuerfelWerfen.onClick/Würfelwerfen simulieren
gewürfelt
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
AktuellerZustand
bereit
einsatzgezahlt
gewürfelt
NeuerZustand
einsatzgezahlt
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
BEinsatzZahlen.onClick / Einsatz vom Konto
abbuchen
bereiteinsatzgezahlt
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 Ansatz: GUI-Objekte (de)aktivieren
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject);begin// Aktualisierung des Datenmodellskonto := konto-1;// Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);// Aktualisierung der KontrolleBEinsatzZahlen.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
procedure TFGUI.BEinsatzZahlenClick(Sender: TObject);beginif zustand = bereit then begin // Aktualisierung des Datenmodells konto := konto-1; zustand := einsatzgezahlt; // Aktualisierung der Anzeige PKontostand.Caption := IntToStr(konto); end;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 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: begin ... end; gewuerfelt: begin ... end; end;
57 Zustandsbasierte Modellierung
BSpielen.onClick / Einsatz vom Konto
abbuchen
bereiteinsatzgezahlt
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 Strukturierung der Lösung
procedure TFGUI.BSpielenClick(Sender: TObject); var treffer: integer;begin// Aktualisierung der Kontrollecase zustand of bereit: begin BSpielen.Caption := 'Würfel werfen'; ... end; einsatzgezahlt: ... gewuerfelt: ... end;// Aktualisierung des Datenmodellscase zustand of bereit: begin konto := konto-1; zustand := einsatzgezahlt; end; einsatzgezahlt: ... gewuerfelt: ... end;// Aktualisierung der AnzeigePKontostand.Caption := IntToStr(konto);PWuerfel1.Caption := IntToStr(wuerfel1);PWuerfel2.Caption := IntToStr(wuerfel2);PWuerfel3.Caption := IntToStr(wuerfel3);end;
59 Teil 6
Zusammenfassung
60 Benutzungsoberfläche
Die Mensch-Maschine-Interaktion wird wesentlich durch die GUI-Objekte zur Gestaltung der Benutzungsoberfläche bestimmt.
PUeberschrift:
TPanelPKonto: TPanel
PWuerfel: TPanel
Pspielfeld: TPanel
PWuerfel1: TPanel PWuerfel2:
TPanel
PKontostand:
TPanel
PWuerfel3:TPanel
BWuerfelWerfen:
TButton
ESpielzahl: TEdit
FGUI: TFGUI
BEinsatzZahlen:TButton
BGewinnVerbuchen:
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 übernehmenspielzahl := StrToInt(ESpielzahl.Text);konto := StrToInt(PKontostand.Caption);wuerfel1 := StrToInt(PWuerfel1.Caption);wuerfel2 := StrToInt(PWuerfel2.Caption);wuerfel3 := StrToInt(PWuerfel3.Caption);// Verarbeitung: Treffer und neuen Kontostand bestimmentreffer := 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 AnzeigePKontostand.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;
Datenmodell
GUI-Objekte
63
procedure TFGUI.BGewinnVerbuchenClick(Sender: TObject); var treffer: integer;begin// Eingabe: Datenmodell aktualisierenspielzahl := StrToInt(ESpielzahl.Text);konto := StrToInt(PKontostand.Caption);wuerfel1 := StrToInt(PWuerfel1.Caption);wuerfel2 := StrToInt(PWuerfel2.Caption);wuerfel3 := StrToInt(PWuerfel3.Caption);// Verarbeitung: Daten verarbeitentreffer := 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 aktualisierenPKontostand.Caption := IntToStr(konto);end;
Trennung: GUI – Datenmodell
Die Trennung zwischen GUI und Datenmodell sollte sich auch im Programmtext widerspiegeln.
64 Zustandsbasierte Modellierung
Zustandsbasierte Modellierung ist eine wichtige Technik, um komplexere (reaktive) Systeme zu entwerfen.
BEinsatzZahlen.onClick / Einsatz vom Konto
abbuchen
bereiteinsatzgezahlt
RGSpielfeld.onClick / Spielzahl festlegen
BGewinnVerbuchen.onClick /Gewinn ermitteln und auf Konto
verbuchen
BWuerfelWerfen.onClick/Würfelwerfen simulieren
gewürfelt
65 Teil 7
Vertiefende Übungen
66 Aufgabe
Entwickeln Sie ein einfaches Eingabe-Ausgabe-System zur Berechnung des BMI-Indexes.Eingaben: Körpergröße, GewichtAusgaben: 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
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: http://www.jgiesen.de/Quiz/Ziegenproblem/Ziegen.html
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 1998-2000.
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 1997-2001.
Noll, Mayr, Paulus, Selinger: http://informatikag.bildung-rp.de/html/delphi_teil_1.html
K. Merkert:http://hsg.region-kaiserslautern.de/faecher/inf/material/delphi/index.php
R. Mechling:http://www.gk-informatik.de/
K. Heidler:http://www.friedrich.fr.schule-bw.de/delphi/delphi.htm
Hessischer Bildungsserver:http://www.bildung.hessen.de/abereich/inform/skii/material/delphi/index.htm
72 Literaturhinweise
S. Spolwig: http://oszhdl.be.schule.de/gymnasium/faecher/informatik/delphi/index.htm
Weitere Hinweise unter:
http://www.delphi-source.de
Einsteiger-Tutorial
http://www.delphi-treff.de/content/tutorials/einsteigerkurs/
...