Joachim Mohr Mathematik Musik
17. Lektion: Ein neues Fenster erzeugen
und
18. Lektion:
Objektorientierte Programmierung
- Unterschied zwischen Prozedur und Methode
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.
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:
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").
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:
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