Joachim Mohr   Mathematik Musik Delphi

17. Lektion: Ein neues Fenster erzeugen


und

18. Lektion: Objektorientierte Programmierung

Beispiel 17.1/18.1 Eröffne ein neues Delphiprojekt über das Delphi-Menü "Datei|Neue Anwendung".
Dann ist das Formular "Form1" sichtbar.

Füge diesem Projekt ein zweites Formular über das Delphi-Menü "Datei|Neues Formular" zu.
Dann ist das Formular "Form2" sichtbar.

1oop01.gif

Im Normalfall wird Form2 automatisch erzeugt.
(Zeige unter dem Delphi-Menü "Projekt|Optionen..." den Reiter Formulare.)

Setze nun auf Form1 ein button1 mit dem OnClickereignis:

procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.show;
  form2.caption := 'Meine erste Instanz von Tform2'
end;
(Bitte nur "form2.show" und form2.caption := 'Meine erste Instanz von Tform2'" eintippen. Den Rest muss Delphi schreiben, wenn Du im Objektinspektor im Reiter Ereignisse auf "onclick" klickst.)

Jetzt können wir nach dem Start des Projektes Form2 sichtbar werden lassen.

Delphi fügt - nach Rückfrage- automatisch in unit1 in die uses-Clausel von unit2 ein.

Der Implementationteil von Unit 1 ist dann folgender:
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.show;
  form2.caption := 'Meine erste Instanz von Tform2'
end;
end.

Damit ist die kurze einfache Lektion 17 beendet.
Du kannst somit ein "Info"-Fenster für Dein Programm schreiben und darüber informieren, dass Du das Copyright besitzt.

Beliebig viele weitere Fenster Form3, Form4, ... kann man auf dieselbe Weise aufbauen. Wenn dein Programm verschiedenste Aufgaben erledigen kann, kannst Du diese übersichtlich anordnen.

Jetzt wird es komplizierter:
Für Lektion 18 wird Beispiel 17.1 zu Beispiel 18.1 weitergeführt.
Fortsetzung von 17.1:
Wir erzeugen nun ein Formular von Tform2 zum 2. Mal und nennen es form2a.
Diese Form2a wird von Delphi nicht mehr automatisch erzeugt, wir müssen das nun selbst besorgen.

1. Schritt: Füge in Form2 noch die Variable Form2a ein:
Unit 2 hat dann folgendes Aussehen:
unit Unit2;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
  //je nach Delphi-Version etwas verschieden
type TForm2 = class(TForm)
     private
     { Private-Deklarationen }
    public
     { Public-Deklarationen }
    end;
var
  Form2, Form2a: TForm2; //Hier wurde Form2a eingefügt
implementation
{$R *.DFM}
end.
2. Schritt: Setze nun auf Form1 ein button2 mit dem OnClickereignis:

procedure TForm1.Button2Click(Sender: TObject);
begin
   if form2a = nil then form2a := Tform2.Create(application);
   form2a.show;
   form2a.caption := 'Meine zweite Instanz von Tform2'
end;
Wichtig: Bei jedem Erzeugen eines Objekt mit Create wird Speicherplatz reserviert. Deshalb muss der Speicherplatz mit destroy, besser mit free, freigegeben werden. Hier wird jedoch form2a freigegeben, wenn die Anwendung (Application) beendet wird. Du musst es in diesem Fall nicht mehr selbst freigeben.

Bemerkung: Für Form2a ist am Anfang kein Speicherplatz reserviert. Der "Zeiger", wo der Speicherplatz reserviert wird, zeigt ins "Nichts" (nil). Damit der Anwender nicht mehrmals Speicherplatz reserviert, indem er mehrmals auf Button2 klickt, wird zunächst abgefragt, ob Form2 = nil ist.

(Wenn Du diese Abfrage wegläßt, kannst Du unendlich viele Instanzen erzeugen. Aber: Verlieren diese den Fokus, können sie nicht mehr sichtbar gemacht werden. Teste es. Es macht Spaß!)

Wenn Du nun Dein Projekt startest und die beiden Buttons anklickst, siehst Du zwei Versionen von Tform2:
1oop02.gif

Jetzt fügen wir zwei Methoden in unit2 ein. Diese wirken sich auf jede Instanz von TForm2 aus.

Damit wir ordentlich zeichnen können, platzieren wir image1 auf Form2 (image findest Du bei der Komponentenleiste unter "Zusätzlich").
1oop03.gif

image1 liefert uns eine stabile Zeichenfläche image1.canvas, auf der wir Rechtecke und Ellipsen zeichnen werden, indem wir den "Zeichenpinsel" image1.canvas.brush rot oder blau färben lassen.

Als nächstes fügen wir zwei Buttons auf Form2 und ergänzen die Onclick- Methoden folgendermaßen:
procedure TForm2.Button1Click(Sender: TObject);
begin
  image1.Canvas.Brush.Color := clred;
  image1.Canvas.Ellipse(0,0,50,50);
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
  image1.Canvas.Brush.Color := clblue;
  image1.Canvas.rectangle(50,5,100,100);
end;


Jetzt kannst Du erkennen, was der Unterschied von Prozeduren und Methoden ist:

Wir hätten auf Form1 Prozeduren schreiben können, die entweder auf Form2 oder auf Form2a zeichnen.

Solange wir nur eine Instanz von TForm2 haben, bemerkt man den Unterschied zwischen Prozedur und Methode nicht.

Wir haben jedoch die Zeichenoperation als Methode von Tform2 implementiert.

Je nachdem, auf welcher Instanz von Tform2 auf die Buttons geklickt wird, wird auf die erste oder auf die zweite gezeichnet.

Das könnte zum Beispiel folgendermaßen aussehen:
1oop04.gif

Bei der ersten Instanz von Tform2 wurde auf Button1 geklickt und ein roter Kreis gezeichnet, bei der zweiten Instanz auf Button2 und ein blaues Rechteck gezeichnet.

Bei vielen Programmen wie Word, Internetexplorer u.s.w. können viele Instanzen gleichzeitig aktiv sein. Die benötigten Prozeduren müssen jedoch nur einmal als Methode implementiert werden.

Im Grunde arbeiten wir schon laufend mit Methoden:

Zum Beispiel ist Ellipse ("Zeichne eine Ellipse") eine Methode von Canvas. Wir schreiben deshalb Canvas.ellipse(0,0,50,50) (siehe Pixelkoordinaten), wenn auf Canvas im obersten linken Quadrat der Seitenlänge 50 Pixel ein Kreis gezeichnet werden soll.

Lektion 19 und 20 sind für Ergänzungen freigehalten. Es gehr weiter mit Lektion 21