4 Die If-Then-Verzweigung - das Projekt "Textatr"

In den ersten Beispielen wurden die Programmbefehle einfach der Reihe nach angegeben und ausgeführt. Es liegt dabei die Struktur einer Sequenz vor. Um Programme steuern zu können, verwendet man häufig Verzweigungen, die beispielsweise mit Hilfe einer "JA-NEIN"-Frage entschieden werden. In Pascal ist dafür das If - then - else - Statement entwickelt worden:
If <Bedingung>
then ... Befehlsfolge 1
else ... Befehlsfolge 2

Wird die angegebene Bedingung mit JA beantwortet (wird die Bedingung erfüllt), dann wird die Befehlsfolge 1 (steht hinter dem then) ausgeführt. Andernfalls wird die Befehlsfolge 2 (nach else) ausgeführt.

Damit können wir das folgende Projekt realisieren, in dem einfach die Textattribute eines "Label-Textes" mit Hilfe von sogenannten "CheckBoxes" verändert werden sollen:

unit Textatr;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
CheckBoxFett: TCheckBox;
CheckBoxKursiv: TCheckBox;
CheckBoxUnterstrichen: TCheckBox;
Button1: TButton;
procedure CheckBoxUnterstrichenClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure CheckBoxFettClick(Sender: TObject);
procedure CheckBoxKursivClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.CheckBoxUnterstrichenClick(Sender: TObject);
begin
If CheckBoxUnterstrichen.Checked
then Label1.Font.Style:=Label1.Font.Style+[fsUnderline]
else Label1.Font.Style:=Label1.Font.Style-[fsUnderline];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.CheckBoxFettClick(Sender: TObject);
begin
If CheckBoxFett.Checked
then Label1.Font.Style:=Label1.Font.Style+[fsBold]
else Label1.Font.Style:=Label1.Font.Style-[fsBold];
end;
procedure TForm1.CheckBoxKursivClick(Sender: TObject);
begin
If CheckBoxKursiv.Checked
then Label1.Font.Style:=Label1.Font.Style+[fsItalic]
else Label1.Font.Style:=Label1.Font.Style-[fsItalic];
end;
end.


5 Die Zeichenfläche - das Projekt "Grafik"

Jedes EDV-Programm läuft nach dem Schema "INPUT - VERARBEITUNG - OUTPUT" ab. In den bereits behandelten Programmbeispielen haben wir Befehle vorwiegend mit der Maus und Daten über die Tastatur eingegeben. Nach der Verarbeitung wurde das Ergebnis entweder in einer "EDIT"-Komponente oder mit einer "LABEL"-Komponente ausgegeben. Nun werden wir die Ausgabe über eine Grafik-Komponente genauer kennenlernen.

Delphi stellt die Komponente "IMAGE" zur Verfügung. Diese verwendet die Eigenschaft "Canvas", mit der die Ausgabe von Grafikobjekten an den Bildschirm (Formular) und an den Drucker ermöglicht wird.

Zunächst wählen wir in der Komponentenpalette die Karteikarte "Zusätzlich" und wählen die Image-Komponente aus:

Die strichlierte Linie kennzeichnet die Größe des Zeichenfensters. Sein Koordinatensystem besteht aus dem Ursprung links oben, der horizontalen X-Achse nach rechts und der vertikalen Y-Achse nach unten. Positive Y-Koordinaten werden somit von oben nach unten aufgetragen (spiegelbildlich zum Koordinatensystem, das wir üblicherweise für geometrische Aufgabenstellungen in der Mathematik verwenden)!

Um Linien zeichnen zu können, werden wir beispielsweise die folgenden Methoden verwenden:

MoveTo(X,Y:Integer) 

Setzt die aktuelle Zeichenposition auf (X,Y)

LineTo(X,Y:Integer) 

Linie von der aktuellen Zeichenposition bis (X,Y)

Rectangle(X1,Y1,X2,Y2:Integer) 

Rechteck mit linker oberer Ecke (X1,Y1) und rechter unterer Ecke mit (X2,Y2).

Ellipse(X1,Y1,X2,Y2:Integer) 

Ellipse, deren Achsenrechteck links oben in (X1,Y1) und rechts unten in (X2,Y2) liegt.

Es ist natürlich sehr, sehr sinnvoll, über die Online-Hilfe von Delphi alle weiteren Grafik-Methoden genauer nachzuschlagen!

unit Grafik;
interface
uses
...
type
TForm1 = class(TForm)
Image1: TImage;
Rechteck: TButton;
procedure RechteckClick(Sender: TObject);
...
var
Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.RechteckClick(Sender: TObject);
begin
Image1.Canvas.Rectangle(10,10,100,100);
end;

6. Funktionen und Prozeduren - Das Projekt "Retrain"

Aufgabe: Ein Rechentrainer soll mit Hilfe von Zufallszahlen realisiert werden. Nach dem Wählen einer Rechen-art sollen in zwei Feldern zufällig gewählte Zahlen erscheinen. Das Ergebnis ist in ein weiteres Feld einzugeben. Falls die Rechnung stimmt, erhält der Benutzer eine diesbezügliche Mitteilung und einen Pluspunkt.

Andernfalls ...

Um Zufallszahlen zu erhalten, verwenden wir die Funktion random(X).

random(X) 

Erzeugt eine ganzzahlige Zufallszahl zwischen 0 und X.

Damit nicht bei jedem Programmlauf die gleichen Zufallszahlen generiert werden, ist es notwendig, mit Hilfe der Prozedur randomize eine neue Serie von Zufallszahlen zu starten.

randomize 

Initialisiert den eingebauten Zufallszahlengenerator mit einer Zufallszahl (erhalten von der Systemuhr).

Beachte den Unterschied zwischen einer Funktion und einer Prozedur: Eine Funktion ist ein Programmteil, der nach der Ausführung einen Wert zurückgibt. Dieser Wert muss beim Aufruf einer Variablen zugewiesen werden. Eine Prozedur wird ausgeführt, ohne dass ein Wert zurückgegeb en wird. Sollen Daten einer Prozedur in einer anderen Prozedur verwendet werden können, muss man diese Daten beispielsweise in einer globalen Variablenspeichern.

Die globale Variable "punkte" im vorliegenden Programmtext muss zu Beginn initialisiert werden. Hier wird in der Methode FormCreate, die immer beim Starten des Programmes ausgeführt wird, der Variablen der Wert null zugewiesen. Die Prozedur inc(punkte) erhöht den Wert der Variablen "punkte" um eins, die Prozedur dec(punkte) erniedrigt den Wert um eins.

Zeichenketten können mit dem Plussymbol miteinander verkettet werden:

'Haus' + 'Tor' ergibt die Zeichenkette 'HausTor'.

Im vorliegenden Projekt werden sogenannte "SpeedButtons" verwendet. Sie werden aus der Komponentenpalette von der Karteikarte "Zusätzlich" ausgewählt.

unit Retrain;
interface
uses
...
type
TForm1 = class(TForm)
Label1: TLabel;
EditZahl1: TEdit;
LabelRechenart: TLabel;
EditZahl2: TEdit;
EditErgebnis: TEdit;
LabelBeurt: TLabel;
LabelScore: TLabel;
ButtonPlus: TButton;
ButtonMinus: TButton;
ButtonMal: TButton;
ButtonDiv: TButton;
SpeedButton1: TSpeedButton;
Label2: TLabel;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
...
var
Form1: TForm1;
punkte:integer;
implementation
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
punkte:=0;
end;
procedure TForm1.ButtonPlusClick(...);
begin
labelrechenart.caption:='+';
end;
...
procedure TForm1.SpeedButton1Click(...);
begin
if LabelRechenart.Caption='+' then begin
if EditErgebnis.Text = 
IntToStr(StrToInt(EditZahl1.Text)
+StrToInt(EditZahl2.Text)) then begin
LabelBeurt.caption:='Richtig';
inc(punkte);
end else begin
LabelBeurt.caption:='Falsch';
dec(punkte);
end;
labelScore.caption:=
IntToStr(punkte)+ ' Punkte';
EditZahl1.Text:='0';
EditZahl2.Text:='0';
end;
end;
...
procedure TForm1.SpeedButton2Click(...);
begin
EditErgebnis.Text:='';
randomize;
EditZahl1.Text:=IntToStr(random(20));
EditZahl2.Text:=IntToStr(random(20));
end;

procedure TForm1.SpeedButton3Click(...);
begin
Form1.Close;
end;

end.