for n := 0 to 200 do

Computer sollen einem ständig sich wiederholende Aufgaben abnehmen. Das Berechnen einer Wertetabelle ist eine solcher Aufgaben. Wenn man dabei bloß einen programmierbaren TR hätte oder wüsste, wie man den PC dazu bringt, einem dabei zu helfen.

In PASCAL lässt sich so etwas sehr leicht verwirklichen:

procedure quadrat1;
var q1,q2,q3 : integer;
begin
    q1 :=1*1;
    q2 := 2*2;
    q3 := 3*3;
    zeigezahl(q1);
    zeigezahl(q2);
    zeigezahl(q3);
end;

Wenn man jetzt noch schafft, sich die Werte q1, q2, q3, q4 irgendwie ausgeben zu lassen, dann hat man's geschafft. allerdings nicht ganz. Einen Schönheitspreis bekommt man für das Programm nicht, denn inerhalb der Prozedur wird der gleiche Rechenschritt immer wiederholt. Die Entwickler von Programmiersprachen haben sich eine Schleifenanweisung ausgedacht, mit denen man die gleiche Operation mit anderen Parameter wiederholen kann:

procedure quadrat2;
var n : integer;
begin
    for n:= 1 to 100 do begin
        q := n*n;
        zeigezahl(q);
    end;
end;

Die sogenannte Laufvariable n muss bei Delphi eine lokale Variable sein, um Verwechselungen mit anderen, eventuell gleichnamigen Variablen, die in  andereren Prozeduren zu vermeiden.

For-Schleifen können auch verschachtelt werden: Man möchte die Augensummen beim Würfeln mit zwei Würfeln bestimmen und untersuchen, ob alle Augensummen (2.. 12) gleich häufig vorkommen. Es gibt 6*6 Möglichkeiten, die man mit folgender Prozedur alle berechnen kann:

procedure augensumme;
var n,m,s : integer;
begin
   for n := 1 to 6 do
      for m := 1 to 6 do begin
         s := n+m;
         zeigezahl(s);
      end;
end;

Das kompliziertere Problem bei Delphi ist, wie man eine Reihe von Zahlen oder im zweiten Fall ein zweidimensionales Feld von Zahlen anzeigt. Delphi stellt dazu spezielle Ausgabefelder (TListBox bzw. TStringGrid) zur Verfügung.  

Deswegen wollen wir diese neue Programmierungstechnik zunächst an anderen Beispielen verwenden. Die Komponente TImage hat die Eigenschaft Canvas und diese wiederum die Eigenschaft Pixels[x,y], d.h. Canvas stellt eine Zeichenfläche zur Verfügung, die man pixelweise einfärben kann. Die Koordinaten der Pixel werden wie üblich von links-oben nach rechts-unten numeriert. Die Farbe eines Pixels wird durch verschiedene RGB (Red / Green / Blue) Anteile definiert. Jede dieser Komponenten kann Werte von 0 .. 255 annehmen. Jede mögliche  Farbe wird also als eine 24-Bit-Zahl nach dem Muster: r*256*256 + g*256 + b, wodurch dann etwa 16,8 Mio  verschiedene Farbabstufungen zustande kommen. PASCAL stellt die Funktion rgb zur Verfügung, die nicht anderes tut, als die drei Farbkomponenten in die entsprechende 24-Bit-Zahl umzurechnen.

procedure TForm1.StartButtonClick(Sender: TObject);
var x, y : word;
begin
for x := 0 to 255 do begin
  for y := 0 to 255 do Bild.Canvas.Pixels[x, y] := rgb(x, 0, y);
  Application.ProcessMessages;
end;
end;

Etwas unverständlich erscheint zunächst die Anweisung : Application.ProcessMessages. Sie bewirkt, dass die bis dahin aufgelaufenen Systemanweisungen von Windows schließlich auch ausgeführt werden. Man kann die Wirkung dieser Anweisung studieren, wenn man obige kleine  Prozedur wie folgt abwandelt:

procedure TForm1.StartButtonClick(Sender: TObject);
var x, y : word;
begin
for x := 0 to 255 do 
  for y := 0 to 255 do begin
     Bild.Canvas.Pixels[x, y] := rgb(x, 0, y);
     Application.ProcessMessages;
  end;
end;

oder auch wie folgt.

procedure TForm1.StartButtonClick(Sender: TObject);
var x, y : word;
begin
for x := 0 to 255 do
  for y := 0 to 255 do Bild.Canvas.Pixels[x, y] := rgb(x, 0, y);
  Application.ProcessMessages;
end;

und was ist nun eigentlich der Unterschied zwischen diesen drei Prozeduren (programm-technisch gesehen) ???

 

Zurück zu Delphi

© Dietrich Praclik