Upload
duongdiep
View
252
Download
2
Embed Size (px)
Citation preview
Erste Programme mit Lazarus
Helmut Paulus Speyer, 19.04.13
Einführung in die Entwicklungsumgebung (IDE)
Grundelemente der Programmiersprache Objekt-Pascal
Übungen
Teil 1
Einführung in die Lazarus-Entwicklungsumgebung
Grundelemente der Programmiersprache Objekt-Pascal
Was ist Lazarus
Lazarus
ist eine plattformunabhängige freie, Delphi-ähnliche Entwicklungsumgebung für die
Programmiersprache Objekt Pascal - eine Bezeichnung für mehrere Programmiersprachen-
Varianten, die Pascal um Objektorientierte Programmierung erweitern, am bekanntesten
davon ist die Programmiersprache der Entwicklungsumgebung Embarcadero Delphi, die
Delphi genannt wurde.
baut auf dem Free Pascal Compiler (FPC) auf,
seine Komponentenbibliothek (LCL) ist sehr ähnlich zu der von Delphi (VCL), ist daher höchst
kompatibel zu Delphi.
3
Lazarus-Projekt:
http://www.lazarus.freepascal.org/
Beschreibungen bei Wikipedia:
Lazarus: http://de.wikipedia.org/wiki/Lazarus_(Entwicklungsumgebung)
Objekt Pascal: http://de.wikipedia.org/wiki/Object_Pascal
Entwicklungsumgebung (IDE)
Komponenten-Palette
4
Objektinspektor
Formular (GUI)
Quelltextfenster
Lazarus-Projekt
Lazarus erzeugt eine ganze Reihe von Dateien zur Verwaltung eines Programmierprojektes. Diese Dateien sollte man immer in einem eigenen Ordner speichern. (Quellcodedateien werden als Units bezeichnet.)
Vorbereitende Schritte:
1. Ordner für das neue Projekt anlegen
2. Neues Projekt anlegen: Datei->Neu->Anwendung
3. Projektdateien sofort speichern:
(1) Datei - Alles speichern
(2) die vom System vorgeschlagen Namen unit1.pas und project1.lpr umbenennen (z. B.: ugui.pas und Rechner.lpr)
u – für Unit (Quelltextdatei)
Neben den oben genannten beiden Dateien werden automatisch im Projektordner viele weitere Dateien angelegt und laufend von Lazarus verwaltet und aktualisiert.
Beim Kompilieren wird aus den Projektdateien ein lauffähiges Programm Rechner.exe erzeugt, das anschließend ausgeführt werden kann.
5
Projektaufbau
Ein Projekt besteht einzelnen Units, die einer Projektdatei verwaltet werden.
6
Projekt Rechner
Speichern Sie den Ordner Rechner in ein eigenes Verzeichnis.
Laden und starten Sie dann das Projekt in Lazarus und testen Sie seine Funktionalität.
Analysieren Sie den Quelltext.
Führen Sie auf dem Formular einen Doppelklick auf ein Button-Objekt aus.
Was passiert?
Fügen Sie einen weiteren Button hinzu.
Lassen Sie sich über Projekt und .lpr Datei anzeigen den Quelltext der Projektdatei anzeigen.
Was geschieht dort?
Klicken Sie mit rechten Maustaste ins Formular und öffnen Sie mit Quelltext (.lfm) anzeigen
die Formulardatei. Analysieren Sie den Inhalt.
7
Entwicklung der GUI 8
Label1 : TLabel
PAnzeige : TPanel
EErgebnis: TEdit
Bplus : TButton
form1 : TForm1 (Formular)
GUI-Objekte (Komponenten der Komponentenpalette) werden auf dem Formular platziert und mit Hilfe des Objektinspektors (Register Eigenschaften) editiert.
GUI-Objekte haben einen Namen und gehören ein Klasse an.
Formular im Entwurfsmodus
Komponenten
Das Formular enthält Komponenten (GUI-Objekte) vom Typ:
• TForm, TEdit, TButton, TLabel, TPanel
Name Funktionalität
Bplus B für Button Schaltfläche
EZahl1 E für Edit Text-Eingabefeld einzeilig
PHinweis P für Panel Container für Komponenten
Lergebnis L für Label Beschriftungsfeld
Standardattribute (Eigenschaften) der GUI-Objekte:
• Caption Beschriftung einer Komponente (Aufschrift eines Buttons, Labels, Panels,…)
• Text Inhalt eines Textfeldes (Edit)
• Name Name, mit dem das Objekt im Programm angesprochen wird
Der Editor gibt den GUI-Objekten automatisch Namen, z. B. TForm1, Label1, Button1, Button2
Die Objekte sollten im Objektinspektor mit sinnvollen Namen (nach Konventionen) belegt werden; z. B.: je nach Typ des Objekts einen Präfix:
9
Sinnvolle Namenskonvention
Objekthierarchie
object Form1: TForm1
Left = 354
Height = 176
Top = 248
Width = 229
Caption = 'Rechner'
ClientHeight = 176
ClientWidth = 229
LCLVersion = '1.0.8.0‚
...
object EZahl1: TEdit
Left = 8
Height = 23
Top = 64
Width = 90
TabOrder = 0
end
object Bplus: TButton
Left = 32
Height = 25
Top = 136
Width = 25
Caption = '+'
OnClick = BplusClick
TabOrder = 2
end
end
Das Formularobjekt Form1 verwaltet alle anderen Objekte als Unterobjekte.
10
Die zur Entwurfszeit definierten Attributwerte werden in der so genannten Formulardatei ugui.lfm gespeichert.
Die Formulardatei wird automatisch erzeugt und
gepflegt und hat immer den gleichen Namen wie
die Quelltextdatei ugui.pas.
Quelltext-Interface 11
unit ugui;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms,
Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Bplus: TButton;
EZahl1: TEdit; EErgebnis: TEdit;
Label2: TLabel; Label4: TLabel;
Panel1: TPanel;
procedure BplusClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var Form1: TForm1;
...
end.
Formularklasse TForm1
Basisklasse: Tform (automatisch)
Einbinden von Systemunits (automatisch)
Variablendeklaration (Formularobjekt)
Attribute
Ereignismethoden
Unit-Name - beim Speichern vom System geschrieben
unit ugui;
...
var Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.BplusClick(Sender: TObject);
var z1: Extended; z2: Extended; sum: Extended;
begin
// Eingabe der Daten aus GUI-Objekten
z1 := StrToFloat(EZahl1.Text);
z2 := StrToFloat(EZahl2.Text);
//Verarbeitung
sum := z1 + z2;
//Ausgabe
EErgebnis.Text := FloatToStr(sum);
end;
end.
Quelltext-Implementation 12
Zugriff auf Attribute der GUI-Objekte
Ereignisbearbeitung
*.lfm Formulardatei einbinden (automatisch)
Projektverwaltung
program Rechner;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, ugui
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Hier findet sich u. a.
die Einbindung von Units und Ressourcen
die Erzeugung des Fensterobjektes
den Start des Programms (Hauptprogramm)
13
Ein Lazarus-Projekt besteht im aus mehreren Dateien, die im einfachsten Fall alle im gleichen "Projekt-Ordner" liegen.
Die Verbindung wird durch die Projekt-Datei *.lpr hergestellt.
Diese Datei wird automatisch vom System gepflegt!
Überblick: Dateien des Projekts 14
Datei Inhalt
*.pas Pascal-Quellcode Datei (Unit)
*.lfm Lazarus Formulardatei – wird zu jeder Unit, in der ein Formularobjekt definiert ist, automatisch
angelegt, enthält die Formulareinstellungen einschließlich aller Komponenten
*.lpr (Lazarus Projektdatei) - das Hauptmodul (Verwaltung) des Projektes
*.exe Das lauffähige Programm, zur Benutzung ist nur diese „EXE-Datei“ erforderlich
*.lpi Lazarus Project Information - alle wichtigen Informationen des Lazarus-Projektes im XML-Format
*.lrs Resourcendatei des Lazarus-Projektes
*.ppu Compilierter Code der einer Unit, wird mit der Uses-Anweisung im Quellprogramm eingebunden
Dateien des Projektordners
(zum Teil automatisch angelegt)
Bedeutung:
Ereignisverarbeitung
Durch Doppelklick auf den Button Bplus wird eine Ereignismethode erzeugt und dem Methodenzeiger OnClick des Buttonobjekts zugewiesen.
Sie ist eine Methode des Formularobjekts und wird vom Buttonobjekt durch Click ausgelöst.
procedure TForm1.BplusClick(Sender: TObject);
begin
...
end;
15
• Der vom System gebildete Name enthält die Namen der auslösenden Komponente und des Methodenzeigers als Bestandteile.
• Der vorangestellte Klassenname TForm1 bindet die Prozedur an das Formularobjekt.
Ereignisse werden in Object Pascal mit Hilfe von Methodenzeigern realisiert, das sind Attribute, die Referenzen auf Methoden anderer Objekte enthalten (Callback).
Ereignismethode des OnClick - Ereignisses
Die Ereignisse des Button-Objekts sind Methodenzeiger, die mit Ereignismethoden verknüpft werden können.
Ereignisverarbeitung
procedure TForm1.BplusClick(Sender: TObject);
Var
z1, z2, z3, sum: double;
begin
// Einlesen der Daten aus GUI-Objekten
z1:= StrToFloat(EZahl1.Text);
z2:= StrToFloat(EZahl2.Text);
//Verarbeitung
sum := z1 + z2;
//Ausgabe
EErgebnis.Text := FloatToStr(sum);
end;
Implementierung
Ein-/ Ausgabesystem mit lokalen Variablen als temporären Zwischenspeichern!
Deklaration der lokalen
Variablen
16
Hilfesystem
Kontextsensitive Hilfe mit F1
LCL - Lazarus Component Library
FCL - Free Component Library
RTL - Runtime Library
Laufzeit Debugger
Haltepunkte im Quelltext setzen, an Stellen, wo das Programm halten soll, in den Rahmen neben der Quelltextzeile klicken
ab dieser Stelle können die Anweisungen schrittweise ausgeführt und mit Hilfe der Maus der Wert der Variablen angezeigt werden
17
Einzelschritt
Klasse Beschreibung Wichtige Eigenschaften/ Methoden
TButton Schaltfläche Caption, Color, Font, Enabled
FLabel Anzeige von Text Caption, Color, Font
Edit Einzeiliges Eingabefeld Text, Color, Font, MaxLength, Clear
TMemo Mehrzeiliges Eingabefeld Text, Lines, Append, Clear
TListBox Auswahlliste mit mehreren Textzeilen ein Items, Append, Clear
TGroupBox Rahmen zur Anordnung von Objekten mit
Gruppenbezeichnung. Caption, Color, Font
TPanel Rahmen zur Anordnung von Objekten Caption, Color, Font
TImage Anzeige von Grafiken Picture, Canvas, loadfromfile
TShape Grafische Form Brush, Pen, Shape
Standardkomponenten 18
Teil 2
Grundelemente Objekt-Pascal
19
procedure TForm1.BplusClick(Sender: TObject);
var
z1,z2,
z3, sum : double;
begin
// Einlesen der Daten aus GUI-Objekten
z1 := StrToFloat(EZahl1.Text);
z2 := StrToFloat(EZahl2.Text);
//Verarbeitung
sum := z1 / z2;
//Ausgabe
EErgebnis.Text:=FloatToStrF(sum,ffFixed,0,2);
end;
Einstieg
Datentyp
Variablen- deklaration
Wertzuweisung
Typumwandlung double string
Bezeichner
Trennzeichen Anweisungen
Variablendeklaration
var Bezeichner : Datentyp;
Wertzuweisung
a := b ;
Die Variablen müssen zuweisungskompatibel sein!
Kommentar
20
Grundelemente 21
Konventionen für Bezeichner
Es dürfen nur folgende Zeichen verwendet werden
Buchstaben (aber keine Umlaute)
Zahlen, diese aber erst nach mindestens einem Buchstaben
Unterstrich (auch am Anfang)
ansonsten keine Sonderzeichen wie „,“, „;“ …
Objekt-Pascal ist nicht kontextsensitiv!
Wertzuweisungen :=
Beispiel: x := x + 1;
Vergleich: =
Anweisungsblöcke begin … end;
Kommentare //…. Bis Zeilenende
{ … } mehrzeilig
Blöcke und Kommentare Gleichheitszeichen
Variablen und Konstanten 22
Programmabschnitt: var
Syntax: var Bezeichner : Datentyp;
Beispiel: var
anzahl : integer;
z1, z1 : double;
Variablendeklaration Konstanten
Syntax: const Bezeichner= wert;
Beispiel: const pi = 3.14;
Konstanten haben einen unveränderlichen Wert.
Delphi-Variablen sind Platzhalter (Container) für Daten. Diese werden im Computer durch einen Speicherbereich repräsentiert und mit Hilfe eines Namens angesprochen.
Variablen haben einen Namen, einen Datentyp, einen Gültigkeitsbereich und eine Lebensdauer.
Bevor eine Variable benutzt werden kann, muss sie deklariert werden. Dabei werden der Name und der Datentyp festgelegt. Gleichzeitig wird ein Speicherbereich für den speziellen Datentyp reserviert.
Bei Wertzuweisungen muss die Zuweisungs-Kompatibiliät gewährleistet sein.
Elementare Datentypen
Einfache Datentypen
integer : Ganze Zahlen {17, -12}
double : Fließkommazahlen {2.675. 1.5e-10}
boolean : Wahrheitswerte {true, false}
string : Zeichenkette {‘Hallo‘}
Char : ASCII-Zeichen {‘A‘, #65, chr(65)}
23
var
Bezeichner : array[StartInd..EndInd] of Datentyp;
Arrays / Reihungen (statisch)
So definierte Array ist statisch, die Anzahl der Elemente kann nicht mehr verändert werden.
Start- und Endindex vom Typ Integer oder Aufzählungstyp
Datentyp muss ein einfacher Typ sein!
Aufzählungstypen (ordinale Typen)
Statt Zahlen konstante Bezeichner verwenden:
var
farben : (blau, gelb, gruen, rot);
Die Typen Integer und Char gehören ebenfalls zu den ordinalen Typen.
Typumwandlungen 24
Bei der Ein- und Ausgabe von Daten mit Hilfe von GUI-Objekten müssen häufig Datentypen konvertiert werden.
Objekt-Pascal Funktionen:
Funktion : Ergebnistyp Beispiel
StrToInt(Para) : integer
IntToStr(Para) : string
StrToFloat(Para) : real
FloatToStr(Para) : string
Formatierte Ausgabe:
FloatToStrF() : string
Char – ASCII-Zeichen
Chr(0..255) : Char
Ord(ch) : integer
groesse := StrToInt(EGroesse.Text);
PAusgabe.Caption := FloatToStr(BMI);
Siehe Kontexthilfe
PAusgabe.Caption := FloatToStrF(BMI, ffnumber, 8, 2);
Ch := Chr(65);
code := Ord(‘A‘);
Operatoren
Arbeiten mit Zeichenketten
Zeichenkettentexte werden in einfachen Anführungszeichen geschrieben.
Beispiel:
var Ausgabe : string;
Ausgabe := ‘Du hast ‘;
Zeichenketten kann man mit ‚+‘ aneinander hängen.
Ausgabe := Ausgabe + ‘leider verloren‘;
Die Länge einer Zeichenkette bestimmt man mit der System-Funktion „length()“.
Zugriff auf die einzelnen Zeichen einer Zeichenkette über den Index
Ausgabe[2] ‘u‘
integer / real
+, -, *, / Division ( liefert einen Realtyp bei Anwendung auf Integer z. B. 12/4)
integer
div Ganzzahldivision Beispiel: 7 div 5 1
mod Modulo Beispiel: 4 mod 3 1
Arithmetische Operatoren
25
Operatoren
= gleich
<> ungleich
< Kleiner
<= kleiner gleich
> Größer
>= größer gleich
Vergleichsoperatoren Logische Operatoren
AND true : wenn beide Operanden wahr
OR true : wenn einer oder beide Operanden wahr
NOT Negation des Operanden ( NOT a)
Beispiel:
var x : integer;
teilbar : boolean;
teilbar := (x mod 3 = 0) AND (x mod 5 = 0);
26
Ord() gibt die Position des Bezeichners zurück
Pred() gibt den Vorgänger zurück
Succ() gibt den Nachfolger zurück
Low() gibt den niedrigsten Wert zurück
High() gibt den höchsten Wert zurück
Funktionen zum Arbeiten mit Aufzählungstypen
Laufzeitfehler 27
Laufzeitfehler abfangen mit einem try-except Block
Syntax
try
Anweisungen
Except
Fehlerbehandlung
end;
except
on EZeroDivide do ...;
on EMathError do ...;
on EConvertError do ...;
else
...;
end;
Im except - Abschnitt kann die Art des Fehlers (der Exception) geprüft und individuell bearbeitet werden.
Beispiel:
try
z := StrToInt(Ezahl.Text);
Except
ShowMessage(‘Falsche Eingabe!‘);
end;
Fallunterscheidungen 28
Einseitig
If Ausdruck then
begin
Anweisung;
end;
zweiseitig
If Bedingung then
begin
Anweisung;
end
else
begin
Anweisung;
end;
If … then … else
kein Semikolon vor else
Mehrfachverzweigung
case OrdWert of
1 : ... ;
2 : ... ;
3 : ... ;
else ... ;
end;
Case … of
Schleifen
while Schleife
while Bedingung do
begin
Anweisung;
end;
Anfangsbedingung
Repeat – Schleife
repeat
Anweisung;
until Bedingung;
For –Schleife
for i := 1 to n do
begin
Anweisung;
end;
Endbedingung
var
augen : array[1..6] of integer;
for i := 1 to 6 do
augen[i] := i;
29
Schleifen über Arrays:
Zählschleife
Prozeduren und Funktionen
procedure Bezeichner(Parameter);
var lokale Variablen;
begin
Anweisungen;
end;
Deklarationsteil
Anweisungsteil
Die Parameterliste kann auch fehlen
30
Prozeduren
function Bezeichner(Parameter): Datentyp;
var lokale Variablen;
begin
Anweisung;
result := Ergebnis;
end;
Rückgabentyp
Funktionen
Das Ergebnis muss einen einfachen Datentyp besitzen.
Das Funktionsergebnis wird der Funkionsvariablen result zugewiesen.
Rückgabewert
TForm1 = class(TForm)
private
{ Private-Deklarationen}
function Max(z1, z2 : integer): integer;
public
{ Public-Deklarationen}
end;
Methoden 31
Prozeduren und Funktionen als Methoden
function TForm1.Max(z1,z2: integer): integer;
begin
if (z1 < z2) then
result := z2
else
result := z1;
end;
Bei Methoden steht vor dem Methodennamen der Name der Bezugsklasse setzt.
Deklaration der Funktion
als private Methode von TForm1
Beispiel: Die Funktion Max als Funktion des Formular-Objekts vom Typ TForm1
Implementierung der Funktion
Als Methode von TForm1
Struktur einer Unit 32
unit name;
{$mode objfpc}{$H+}
interface
uses ...
Type ...
var ...
implementation
uses ...
type ...
var ...
procedure …
end.
Interface (Schnittstelle)
• Auf Alles, was hier deklariert ist, kann von außen (anderen Units) zugriffen werden.
• Typ – Vereinbarungen
• gobale Variablen und Konstanten
Implementation
• Lokale Deklarationen (nur innerhalb der Unit)
• Implementierung von Prozeduren, Funktionen (Methoden)
Kopf Schlüsselwort unit
Das System schriebt den Namen beim Speichern!
Projekt BMI
Mit einem Programm soll der BodyMass-Index BMI berechnet werden.
Eingaben: Gewicht in Kg, Körpergröße in m
Ausgabe: BMI-Index
Ablauf: Ereignisgesteuert
33
Schreiben Sie ein Programm, das den Body-Mass-Index einer Person ausgibt.
Projekt BMI
Ergänzen Sie das Programm mit einer Bewertung des BMI nach Alter. Benutzen Sie dazu die folgenden Grundlagen und die Kontexthilfe.
Alter BMI
19-24 Jahre 19-24
25-34 Jahre 20-25
35-44 Jahre 21-26
45-54 Jahre 22-27
55-64 Jahre 23-28
>64 Jahre 24-29
Die Tabelle zeigt die „wünschenswerte“ BMI-Werte für verschiedene Altersgruppen:
Weitere Informationen unter: https://www.uni-hohenheim.de/wwwin140/info/interaktives/bmi.htm
34
Lösung 35
procedure TGUI.BtberechnenClick(Sender: TObject);
var
gewicht,
groesse,
BMI : real;
begin
//Eingabe
gewicht := StrToFloat(EdGewicht.Text);
groesse := StrToFloat(EdGroesse.Text);
//Verarbeitung
BMI := gewicht/groesse/groesse;
//Ausgabe
PAusgabe.Caption := FloatToStr(BMI);
end;
Projekt Zahlenraten
Aufgabe:
Es ist ein Programm zu entwickeln, das ein Zahlenratespiel simuliert.
Anforderungen:
1. Der Computer bestimmt eine Zufallszahl (1..100), die der Spieler zu erraten hat.
2. Der Spieler hat er beliebig viele Versuche.
3. Nach jeder Zahleneingabe wird angegeben, ob die Zahl zu groß oder zu klein ist.
4. Hat der Spieler die Zahl erraten, so wird die Anzahl der Versuche und eine Bewertung ausgegeben.
5. Alle Ausgaben werden gelöscht, wenn ein neues Spiel begonnen wird.
6. Sicherheitsprüfung bei der Eingabe der Ratezahll.
7. Feldgröße über ein Edit-Feld eingelesen
Datenmodell
Anzahl der Versuche: Versuche : integer
Zu erratende Zahl: Ratezahl : integer
36
Funktion: random
z := random(N); ganzzahlige Zufallszahl z mit 0 z < N
r := random; Gleitkommazahl 0 r < 1
Zufallszahlen
GUI und Datenmodell
Lösung (vorläufig)
• Realisierung eines "internen Datenmodell“ mit globalen Variablen als private Atribute des Formulars.
• Diese Variablen sind innerhalb des Formularobjekts global.
Problem
• Speicherung der Daten in den GUI-Objekten ist ineffektiv!!!
• Besser ist eine Trennung von GUI und Datenmodell
TGUI = class(TForm)
{Steuerelemente}
procedure FormCreate(Sender: TObject);
procedure BtEingabeClick(...);
private
{ Private-Deklarationen}
RateZahl : integer;
Versuche : integer;
public
{ Public-Deklarationen}
end;
Spieldaten als private Attribute des Formulars
37
procedure TGUI.BpruefenClick(...);
var
Zahl : integer;
kommentar : string;
begin
//Eingabe
Zahl := StrToInt(ETippZahl.text);
// Verarbeitung
Versuche := Versuche + 1;
if Zahl = Ratezahl then
...
end;
Lokale Variablen (temporäre Daten) Internes Datenmodell
Initialisierung bei Programmstart
procedure TGUI.FormCreate(Sender: TObject);
begin
randomize;
end;
38
Ereignis OnCreate des Formulars
Die zugehörige Ereignisprozedur FormCreate wird automatisch beim Start des Programms aufgerufen.
Anwendungsbeispiel:
Initialisierung des Zufallszahlengenerators des Systems durch randomize.
Dadurch wird bei jedem Programmstart eine andere Zufallszahlenfolge
erzeugt.
Teil 3
Übungen
Helmut Paulus Speyer, 19.04.13
Aufgabe 1 40
Das Schaltjahr-Problem
Die Schaltjahresregelung unseres Kalenders (Gregorianischer Kalender) lautet:
Ein Schaltjahr ist ein Jahr, dessen Jahreszahl durch 4 ohne Rest teilbar ist. Ausgenommen davon sind die Jahrhundertwechsel, es sei denn, deren Jahreszahl ist durch 400 ohne Rest teilbar.
Es kommt also alle 400 Jahre vor, dass ein Jahrhundertwechsel ein Schaltjahr erzeugt. Das Jahr 2000 ist ein solches Jahr.
Zu entwickeln ist ein Programm, das nach Eingabe einer gültigen Jahreszahl prüft, ob dieses Jahr ein Schaltjahr ist.
Aufgabe 2
Die Entwicklung der Weltbevölkerung schreitet rasch voran:
Im Jahr 2012 wurde die 7 Milliardengrenze überschritten. Zur Zeit wächst die Weltbevölkerung jährlich um ca. 1,2 %.
Mit Hilfe eines kleinen Programms soll die jährliche Entwicklung verfolgt werden.
Jahr : integer;
Population : double;
WFaktor : double;
Datenmodell: Interaktionen:
Aktuelle Werte eingeben und die Population des nächsten Jahres berechnen und anzeigen Aktuelle Werte eingeben und die Population des vorherigen Jahres berechnen und angezeigen
Population in 10-Jahresschritten voraus- oder zurückberechnen
41
Prototyp:
Aufgabe 3
Projekt 17 und 4:
Es ist ein Programm zu entwickeln, das das bekannte Kartenspiel simuliert.
Anforderungen
1. Spielkarten werden durch einen Würfel ersetzt (Wertbereich [1;...;6]).
2. Es werden Zahlen gewürfelt und aufsummiert. Der Spieler kann nach jedem Spielzug entscheiden, ob er aufhört oder weiter spielen will.
3. Ist die Summe größer als 21, so hat der Spieler verloren. Hört der Spieler bei einer Summe kleiner oder gleich 21 auf, wird noch eine Zahl gewürfelt. Ist die neue Summe immer noch kleiner oder gleich 21, so hat der Spieler verloren, andernfalls gewonnen.
4. Alle Ausgaben werden gelöscht, wenn ein neues Spiel begonnen wird.
42
Teil 4
• Objektorientierte Programmierung mit Objekt-Pascal
• Übungen
Projekt Farbenmischer 44
RGB-Farben bestehen aus einer Mischung von jeweils 3 Farben (rot - grün - blau).
Jeder Farbkanal hat 256 Abstufungen: 0 …255.
Ziel:
Zu entwickeln ist ein Programm, das beliebige RGB-Farben, sowie deren Komplementärfarbe nebeneinander angezeigt .
Beispiele:
Modellklasse TFarbe 45
TFarbe
- rot : integer
- gruen :integer
- blau : integer;
+ constructor create
+ getFarbe : integer;
+ setFarbe(r, g, b : integer)
+ getrot : integer
+ getgruen: integer
+ getblau : integer
private Attribute
Konstruktor
create
Objekte werden mit Hilfe von Konstruktoren erzeugt.
Dabei …
• wird der Speicherbereich eines Objekts anlegt,
• werden die Attribute mit Standardwerten belegt,
• wird eine Referenz auf das Objekt zurückgeben.
Farbmodell
öffentliche Methoden
Festlegung von:
• Zugriffsrechten (- private; + public)
• Datentypen
• Signaturen (Parameter der Methoden)
Konvention
- vorangestelltes T bei Datentypen
Konstruktoren
- constructor (Schlüsselwort)
46
TFarbe
- Frot : integer
- Fgruen :integer
- Fblau : integer;
+ constructor create
+ getFarbe : integer;
+ setFarbe(r, g, b : integer)
+ getrot : integer
+ getgruen: integer
+ getblau : integer
Implementierung
unit uFarbe;
Interface
uses ...
type
TFarbe = Class
private
rot, blau, gruen : integer;
public
constructor create;
procedure setFarbe(r,g,b : integer);
function getFarbe : integer;
function getrot : integer;
function getgruen: integer;
function getblau : integer;
end; Implementation ...
1. Deklaration der Klasse im Interface
Eigene Unit für die Modellklasse: uFarbe.pas
Implementierung 47
...
implementation
constructor TFarbe.create;
begin
rot := 255;
gruen := 255;
blau := 255;
end;
function TFarbe.getFarbe : Integer;
begin
result := blau*256*256+Gruen*256+rot;
end;
procedure TFarbe.setFarbe(r,g,b : integer);
begin
rot := r mod 256;
gruen := g mod 256;
blau := b mod 256;
end;
...
2. Implementierung der Methoden im Implementation - Bereich der Unit
GUI 48
GUI-Objekte:
TLabel
TEdit
TButton
TShape
TButton
Formular-Unit:
Modellobjekt verwalten 49
uses
Windows, Messages, SysUtils, Classes, uFarbe;
type
Tgui = class(TForm)
Farbmischer: TGroupBox;
Label1: TLabel;
. . .
private
{ Private-Deklarationen }
Farbe : TFarbe;
procedure aktualisiere; //Anzeigen
public
{ Public-Deklarationen }
. . .
Unit einbinden
Referenzvariable
für das Farbobjekt deklarieren
(Hat- Beziehung)
Das Formular verwaltet die GUI-Objekte und das Modellobjekt.
Objekte erzeugen und freigeben 50
procedure TGUI.FormCreate(...);
begin
Farbe := TFarbe.create;
...
end;
Z. B.: Erzeugung mit dem OnCreate-Ereignis
Zeiger auf ein Farbobjekt
hat-Beziehung
Zerstörung mit dem OnDestroy-Ereignis
Procedure TGUI.FormDestroy(...);
begin
Farbe.Free;
end;
Speicherbereich freigeben
geerbter Destruktor
Die GUI-Objekte, die zur Entwurfszeit ins Formular eingefügt wurden, werden automatisch erzeugt und zerstört.
Das Farbobjekt wird zur Laufzeit erzeugt und zerstört werden.
Schema:
obj := Klasse.create;
Aktualisierung von Model und View 51
//Datenfluss: Modell View
procedure TGUI.aktualisiere;
//Modelldaten abfragen
begin
FarbBox.brush.color := Farbe.getFarbe;
KFarbBox.brush.color := clwhite - Farbe.getFarbe;
end;
//Datenfluss: Controller Modell
procedure TGUI.okBtnClick(Sender: TObject);
//Modelldaten schreiben var r, g, b : integer; begin
r := StrToInt(Erot.text);
g := strtoint(Egruen.text);
b := strtoint(Eblau.text);
Farbe.setFarbe(r,g,b); //Werte im Modellobjekt speichern
aktualisiere; //Aktualisierung der Anzeige durch Abfragen
end;
Ereignismethode
MVC-Muster 52
Ziel: Trennung von Datenhaltung und -verarbeitung, Darstellung und Steuerung.
Modell Interne Repräsentation der Daten mit Methoden zum Ändern und Abfragen
View Ansicht, Darstellung: Ein Modell kann durch mehrere Views angezeigt
werden, welche unterschiedliche Sichtweisen des Models darstellen.
Controller Steuerung: Verarbeitung der Benutzereingaben
View und Controller bilden zusammen die Benutzeroberfläche (GUI).
GUI
Fachkonzept
Model
Controller
Steuerung
View Ansicht
liest
schreibt
informiert
Aufgabe 1 53
1. Testen Sie das Programm ‚Farben0’ und verfolgen Sie den Ablauf mit Hilfe des Einzelschritt-
Modus.
2. Erweitern Sie das Farbemodell um folgende Methoden
a) TFarbe.getKomplement (Komplementärfarbe)
b) TFarbe.toHTML (HTML- Code)
Bsp.: #AFB055, verwenden Sie die Funktion InttoHex()
c) Binden Sie beide Methoden in die Anwendung ein.
3. Entwickeln Sie eine zweite Benutzungsoberfläche, die die RGB-Farben einzeln anzeigt. (z. B.:
in drei Shape-Komponenten)
Binden Sie das Farbmodell an die entwickelte Benutzeroberfläche an.
Links
Lazarus Tools, Tutorials …
• http://wiki.lazarus.freepascal.org/Lazarus_Documentation/de
• http://wiki.lazarus.freepascal.org/Lazarus_IDE_Tools/de#Find_Declaration
• http://wiki.lazarus.freepascal.org/Lazarus_Tutorial/de
Grundlagen ObjektPascal
• http://www.delphi-treff.de/
Unterrichtsmaterialien
Bildungsserver Informatik RP
• http://informatik.bildung-rp.de
K. Merkert: http://www.hsg-kl.de/faecher/inf/delphi/index.php
Siegfried Spolwig / Johann Penon
• http://oszhdl.be.schule.de/gymnasium/faecher/informatik/lazarus/index.html
Martin Jakobs
• http://www.martinjakobs.de/pages/objektorientierte-programmierung.php
Joachim Mohr
• http://www.kilchb.de/lektionen.html
UML-Werkzeug:
• UML-Editor : UMLed.exe http://www.kubitz-online.de
54