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

Slides:



Advertisements
Ähnliche Präsentationen
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
Advertisements

LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Telefonnummer.
10. Grundlagen imperativer Programmiersprachen
Puck eine visuelle Programmiersprache für die Schule
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Java: Objektorientierte Programmierung
Rechneraufbau & Rechnerstrukturen, Folie 2.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 2.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Zusammenfassung Vorwoche
Differentielles Paar UIN rds gm UIN
Prof. Dr. Bernhard Wasmayr
Studienverlauf im Ausländerstudium
DVG Klassen und Objekte
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
1 Teil 4 Übung: Uhr. 2 Zielsetzung Ziel ist es, mit Hilfe objektorientierter Modellierung ein System zu entwickeln, mit dem eine einfache Uhr simuliert.
AWA 2007 Natur und Umwelt Natürlich Leben
Delphi Eine objektorientierte Programmiersprache © Beushausen 2000.
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
Objektorientierte Modellierung
Grundkonzepte Java - Klassendefinition
20:00.
© Gabriele Sowada © Gabriele Sowada 2 Manuell Beispiel 1 demonstriert die Vorgehensweise bei der manuellen Programm- Eingabe am.
„Küsse deine Freunde“ – FlexKom-App teilen
Zusatzfolien zu B-Bäumen
Eine Einführung in die Entwicklung ereignisgesteuerter Programme
Delphi II - OOP IFB Fortbildung
In der Schule.
Implementierung objektorientierter Modelle
Ereignisgesteuerte Programmierung
Eine Einführung in die CD-ROM
Dokumentation der Umfrage
Grundkonzepte der objektorientierten Programmierung Teil 3
für Weihnachten oder als Tischdekoration für das ganze Jahr
Wir üben die Malsätzchen
Syntaxanalyse Bottom-Up und LR(0)
Einführung in die objektbasierte Programmierung mit Delphi
Datenstrukturen Klaus Becker (2002).
Konzepte der objektorientierten Programmierung
Objektorientierte Software-Entwicklung
Erste Programme mit Delphi
Gui-Objekte und Datenmodellobjekte
Grundkonzepte der objektorientierten Programmierung Teil 2
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Ganzheitliches Projekt-, Ressourcen- und Qualitätsmanagement 1 Reports und AddOns Auf den folgenden Seiten wird Ihnen die Funktionsweise der Reports und.
Grundlagen von Objekt-Pascal Erstellt von J. Rudolf überarbeitet von H.Brehm.
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Geometrische Aufgaben
Symmetrische Blockchiffren DES – der Data Encryption Standard
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Erste Schritte in DELPHI
PHP: Operatoren und Kontrollstrukturen
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
Folie Beispiel für eine Einzelauswertung der Gemeindedaten (fiktive Daten)
Programmiervorkurs WS 2014 Referenzdatentypen
Unternehmensbewertung Thomas Hering ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List of Figures Tabellenübersicht.
Folie Einzelauswertung der Gemeindedaten
Datum:17. Dezember 2014 Thema:IFRS Update zum Jahresende – die Neuerungen im Überblick Referent:Eberhard Grötzner, EMA ® Anlass:12. Arbeitskreis Internationale.
Sehen, Hören, Schmecken: wenn uns unsere Sinne täuschen
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Programmieren mit Lazarus. Die Programmoberfläche das Hauptfenster der Objektinspektor das Formular der Quelltexteditor Komponenten hier einfügen...
Implementieren von Klassen
 Präsentation transkript:

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

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

Grafische Benutzungsoberfläche Teil 1 Grafische Benutzungsoberfläche

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

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“.

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

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.

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.

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.

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.

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

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/...>

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 http://hsg.region-kaiserslautern.de/faecher/inf/material/misc/d6_2_d4.php

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“ ... ...

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

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

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

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

Ereignisse und ihre Verarbeitung Teil 2 Ereignisse und ihre Verarbeitung

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.

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

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;

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;

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;

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: http://hsg.region-kaiserslautern.de/faecher/inf/material/ereignisse/index.php

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.

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.

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.

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.

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.

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.

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

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

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.

Teil 4 Datenmodellierung

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!

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;

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

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;

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.

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;

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.

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

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.

Zustandsbasierte Modellierung Teil 5 Zustandsbasierte Modellierung

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

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

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

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.

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

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.

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

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;

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

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.

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:

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

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);

Teil 6 Zusammenfassung

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

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;

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

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;

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

Teil 7 Vertiefende Übungen

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

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.

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.).

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

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).

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

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/ ...