Sign in Join
Wiki copytemporary

Form Tutorial/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-\
21Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].\
3-\
2+
43Eine kleine Einführung, wie man Formulare in Lazarus nutzt.
54
65## Was ist ein Formular
76
87Das Formular (engl. Form, Klasse [[TForm/de|TForm]]) wird auch im Deutschen öfters (fälschlicherweise) als Form bezeichnet. Es stellt ein Fenster oder ein Dialogfeld dar, welches die Benutzeroberfläche einer Anwendung bildet. Es ist der Container, auf dem alle weiteren Komponenten (z.B. Buttons, Labels, Edit-Felder, Images etc.) eingefügt werden.
98
109## Einstieg, die erste GUI-Anwendung
1110
1211Schon nachdem Sie Lazarus erfolgreich installiert haben, wird nach dem Start von Lazarus ein neues Projekt mit einem leeren Formular *Form1* erstellt. Ansonsten können Sie, unter dem Hauptmenueintrag Projekt -\> Neues Projekt -\> Anwendung, eine neue [[Overview of Free Pascal and Lazarus/de|GUI Anwendung]] erstellen.
1312
14-<figure>
15-<img src="NeuesProjekt.png" title="NeuesProjekt.png" />
16-<figcaption>NeuesProjekt.png</figcaption>
17-</figure>
13+![](/wiki-images/2/2f/NeuesProjekt.png)
1814
19-<figure>
20-<img src="NeuesProjekt1.png" title="NeuesProjekt1.png" />
21-<figcaption>NeuesProjekt1.png</figcaption>
22-</figure>
15+![](/wiki-images/8/81/NeuesProjekt1.png)
2316
2417Jetzt haben Sie schon ein neues, funktionstüchtiges Projekt mit einem Formular erstellt:
2518
26-<figure>
27-<img src="Form1_Designmodus.png" title="Form1_Designmodus.png" />
28-<figcaption>Form1_Designmodus.png</figcaption>
29-</figure>
19+![](/wiki-images/7/73/Form1_Designmodus.png)
3020
3121Um das neu erstellte Projekt zu starten, können Sie einfach die Taste \[F9\] drücken oder mit der Maus auf das Hauptmenu-Symbol ![](/wiki-images/b/b8/Start.png) klicken (oder Hauptmenü: Start -\> Start). Das Projekt wird nun im Normalfall kompiliert und gestartet.
3222
3323Es passiert nichts wirklich aufregendes, das Formular *Form1* verändert jedoch geringfügig sein Aussehen und wird die Punkte vom Raster-Gitter (Hilfe für Positionierung einzelner Komponenten) verlieren (solange die Gitterpunkte sichtbar sind, wissen Sie auch, dass Sie sich noch im Entwurfsmodus befinden):
3424
3525![](/wiki-images/7/73/Form1_Designmodus.png) -\> ![](/wiki-images/d/dc/Form1_Runmodus.png)
3626
3727Kehren Sie wieder in den Entwurfsmodus zurück und legen als nächstes ein [[TButton/de|TButton]] (Schaltknopf) auf dem Formular ab. Dieser soll später das Öffnen eines zweiten Formulars ermöglichen:
3828
3929- Unter der Standard-Komponentenpalette den TButton auswählen
4030
41-<figure>
42-<img src="TButtonStandardpalette.png" title="TButtonStandardpalette.png" />
43-<figcaption>TButtonStandardpalette.png</figcaption>
44-</figure>
31+![](/wiki-images/4/49/TButtonStandardpalette.png)
4532
4633- auf das Formular klicken: Es wird ein Button auf *Form1* abgelegt mit dem Namen und Bezeichnung (Caption) *Button1*.
4734
4835Damit dieser Button auch einen Sinn bekommt, müssen Sie diesem mitteilen, dass er etwas tun soll, wenn auf ihn geklickt wird. Dieses Klicken kann man vereinfacht als ein [Ereignis](http://de.wikipedia.org/wiki/Ereignis_%28Programmierung%29) (engl. Event) betrachten. Dafür benötigt man [[Event order/de|Ereignisbehandlungsroutinen]] (engl. listener, observer, event handler), die nach dem Klick aufgerufen werden. Der Eventhandler für ein Mausklick kann recht einfach erreicht werden, indem Sie auf den einfügten *Button1* doppelklicken (oder im Objektinspektor -\> Button1 -\> Reiter Ereignisse -\> OnClick auf den Button \[...\] klicken). Es wird nun im Quelltexteditor eine Procedure **`TForm1.Button1Click`** erstellt, die immer aufgerufen wird (zur Laufzeit, nicht im Desingnmodus), wenn *Button1* geklickt wird:
4936
50-<figure>
51-<img src="NeuesProjekt2.png" title="NeuesProjekt2.png" />
52-<figcaption>NeuesProjekt2.png</figcaption>
53-</figure>
37+![](/wiki-images/9/9b/NeuesProjekt2.png)
5438
5539Damit die Anwendung nach dem Klick von *Button1* etwas zu tun bekommt, fügen Sie einfach zwischen **begin** und **end** der Procedure *TForm1.Button1Click* etwas Code, wie
5640
5741``` pascal
5842procedure TForm1.Button1Click(Sender: TObject);
5943begin
6044 Caption:='Mein erstes Formular'; //Caption von Form1 wird geändert (Text im Formularkopf)
6145 //oder
6246 Button1.Caption:='Hallo'; //Caption vom Button1 wird geändert (angezeigter Text des Buttons)
6347end;
6448```
6549
6650ein. Jetzt können Sie Ihre Anwendung starten (mit Taste \[F9\]) und sich freuen...
6751
6852Nachdem Sie nun Ihre erste GUI-Anwendung erstellt haben, können Sie nun ein wenig experimentieren und die Standardkomponenten kennen lernen. Für den Einstieg würde ich Ihnen empfehlen, Beispiele folgender Komponenten auszuprobieren:
6953
7054- [[TButton/de|TButton]]
7155- [[TLabel/de|TLabel]]
7256- [[TEdit/de|TEdit]]
7357- [[TMemo/de|TMemo]]
7458- [[TToggleBox/de|TToggleBox]]
7559- [[TRadioButton/de|TRadioButton]]
7660- [[TListBox/de|TListBox]]
7761- [[TComboBox/de|TComboBox]]
7862- [[TScrollBar/de|TScrollBar]]
7963
8064hilfreiche Informationen finden Sie auch im [[Lazarus Tutorial/de|Lazarus Tutorial]]
8165
8266## Verwendung eines zweiten Formulars
8367
8468Das Tutorial zeigt, wie Sie mehrere Formulare in einem Projekt nutzen können. Im Beispiel werden nur zwei Formulare (Hauptformular *Form1* und *Form2*) erstellt, für weitere Formulare können Sie analog verfahren.
8569
8670Kongret erstellen Sie eine Hauptformular mit einem Button (Knopf), durch dessen Klicken sich die neues Formular öffnet. Das neue Formular erhält ebenfalls einen Button, durch dessen Klicken sich das neue Formular wieder schließt und Sie zum Hauptformular zurück gelangen.
8771
8872Wenn Sie das Tutorial [[Form Tutorial/de|Einstieg, die erste GUI-Anwendung]] durchgearbeitet haben, müssten Sie den Code zwischen **begin** und **end** der Procedure *TForm1.Button1Click* löschen. Ansonsten müssten Sie ein neues Projekt (Anwendung) erstellen, einen Button auf dem Formular ablegen und den OnClick-Eventhandler von diesem Button1 erstellen.\
8973Diesem Button geben Sie noch eine andere Caption (sichtbarer Text auf dem Button). Dazu den Button anwählen (einfach einmal anklicken) und im Objektinspektor unter Eigenschaften -\> Caption den Text "Form2 öffnen" eingeben.
9074
91-<figure>
92-<img src="Objektinspektor.png" title="Objektinspektor.png" />
93-<figcaption>Objektinspektor.png</figcaption>
94-</figure>
75+![](/wiki-images/5/52/Objektinspektor.png)
9576
9677Unter dem Hauptmenupunkt Datei -\> neues Formular können Sie nun ein zweites Formular (Form2) dem Projekt hinzufügen. Auf diesem legen Sie ebenfalls einen Button (Button1) ab und erstellen den OnClick-Eventhandler von diesem. Die Caption von diesem Button ändern Sie analog oben zu *Schließen*.\
97-\
78+
9879Jetzt hat das Projekt zwei Formulare, welche jeweils mit dem Hauptmenueintrag Projekt -\> Formulare (oder Tastenkombination \[Shift\]+\[F12\]) ausgewählt und angezeigt werden können. Hilfsweise können Sie auch im Quelltexteditor den Reiter der jeweiligen zum Formular zugehörigen [[Unit/de|Unit]] auswählen und mit \[F12\] das entsprechende Formular anzeigen (mit \[F12\] wechselt man zwischen Quelltexteditor und Formular).
9980
10081Im Quelltexteditor gehen Sie jetzt auf die zu *Form1* gehörende [[Unit/de|Unit]] (Unit1) und fügen der Uses-Klausel **Unit2** hinzu:
10182
10283``` pascal
10384uses
10485 Classes, SysUtils, ... , Unit2; //wichtig ist dass die einzelnen Units mit einem Komma voneinander getrennt sind
10586 //und die Uses-Klausel mit einem Semikolon beendet wird
10687```
10788
10889Nun ist *Unit2* und damit *Form2* von der *Unit1* aus aufrufbar.
10990
11091Als nächstes bearbeiten Sie noch die OnClick-Events der Buttons der jeweiligen Formulare:
11192
11293``` pascal
11394unit Unit1;
11495...
11596procedure TForm1.Button1Click(Sender: TObject);
11697begin
11798 Form2.ShowModal; //Zeigt Form2 an, der Focus wird auf Form2 gesetzt
11899end;
119100```
120101
121102``` pascal
122103unit Unit2;
123104...
124105procedure TForm2.Button1Click(Sender: TObject);
125106begin
126107 Close; //Schließt Form2
127108end;
128109```
129110
130111Jetzt können Sie das Projekt starten und von *Form1* mittels Buttonklick *Form2* öffnen.
131112
132113### Unterschied zwischen Show und ShowModal
133114
134115Beide Methoden *Show* und *ShowModal* machen ein Formular sichtbar. An einem kleinen Beispiel können Sie erfahren, was der Unterschied dieser ist:
135116
136117- Fügen Sie zu dem vorherigen Beispiel [[Form Tutorial/de|Verwendung eines zweiten Formulars]] der *Form1* noch einen zweiten TButton hinzu.
137118- Ändern Sie von *Button1* die Eigenschaften *Name* zu *btnShow* und *Caption* zu *Show*.
138119- Ändern Sie von *Button2* die Eigenschaften *Name* zu *btnShowModal* und *Caption* zu *ShowModal*.
139120- Erstellen Sie (bzw. ändern Sie) die *OnClick*-Eventhandler der beiden Buttons wie folgt:
140121
141122``` pascal
142123procedure TForm1.btnShowClick(Sender: TObject);
143124begin
144125 Form2.Show;
145126 ShowMessage('Form2 wurde geöffnet!');
146127end;
147128
148129procedure TForm1.btnShowModalClick(Sender: TObject);
149130begin
150131 Form2.ShowModal;
151132 ShowMessage('Form2 wurde geöffnet und schon wieder geschlossen!');
152133end;
153134```
154135
155136- Starten und beobachten Sie den Unterschied!\
156137
157-\
158138**Show:**\
159139Diese Procedure macht ein Formular sichtbar und arbeitet den Code des aufrufenden Controls (bei uns *Form1*) weiter ab. In unserem Beispiel wird die Mitteilung (ShowMessage) fast gleichzeitig zur *Form2* angezeigt. Sie können auch weiterhin das aufrufende Formular *Form1* nutzen, dieses zum Beispiel verschieben oder den Button *Show* nochmals klicken (jedoch nicht bei *ShowModal*).\
160140Sie könnten statt **`<myForm>.Show;`** auch **`<myForm>.Visible:=True;`** schreiben. Die Procedure *Show* macht nichts anderes:
161141
162142``` pascal
163143procedure TCustomForm.Show;
164144begin
165145 Visible := True;
166146 BringToFront;
167147end;
168148```
169149
170150Der einzigste Unterschied wäre, falls das Formular von einem anderen überdeckt würde, dieses weiter davor bleiben würde.\
171-\
151+
172152**ShowModal:**\
173153Durch diese Methode wird die Codeverarbeitung des aufrufende Controls (bei uns *Form1*) unterbrochen und erst weiter abgearbeitet, wenn das neu geöffnete Formular wieder geschlossen wurde. In unserem Beispiel wird die Mitteilung (ShowMessage) erst ausgegeben, wenn das Formular *Form2* wieder geschlossen wurde. Das aufrufende Formular *Form1* ist wie eingefroren. Sie können es weder verschieben noch Buttons klicken.\
174154ShowModal ist eine Funktion und gibt als Ergebnis einen Integer zurück, siehe [[doc:lcl/forms/tmodalresult.html|TModalResult]]. Damit können Sie, je nachdem, wie das Formular geschlossen wurde, unterschiedlichen weiteren Code ausführen lassen.\
175155
176156## Zwei Formulare, die sich gegenseitig aufrufen können
177157
178158Generell ist es günstig (gutes Programmdesign), wenn von einem Formular nicht dessen Hauptformular aufgerufen wird. Besser ist es, entsprechend vorherigem Beispiel, von einem Hauptformular aus, immer nachfolgende Formulare aufzurufen und durch das Schließen dieser, wieder zum Hauptformular zurückzukehren. Somit entgeht man dem Problem einer [zirkulären Unit - Referenz](http://de.wikipedia.org/wiki/Zirkul%C3%A4re_Abh%C3%A4ngigkeit). Dass es theoretisch trotzdem geht, sehen Sie hier.
179159
180160Entweder Sie modifizieren die Formulare vom Beispiel [[Form Tutorial/de|Verwendung eines zweiten Formulars]] oder Sie müssen ein neues Projekt erstellen, mit zwei Formulare und jeweils einem Button (Knopf). Caption von Form1.Button1 sollte *Form2 öffnen* lauten, die von Form2.Button1 müssten Sie nach *Form1 öffnen* umändern.
181161
182162Diesmal können Sie nicht einfach in die vorhandene Uses-Clause von *Unit2* (wie im vorherigen Beispiel - im Interfaceteil der [[Unit/de|Unit]]) "Unit1" einfügen, da sonst eine zirkuläre Unit-Referenz entstehen würde. "Unit2" müssten Sie somit auch wieder aus der Interface-Uses-Klausel von *Unit1* entfernen.
183163
184164Statt dessen fügen Sie eine Uses-Klausel in den Implementation-Teilen der Units ein:
185165
186166``` pascal
187167unit Unit1;
188168...
189169implementation
190170
191171uses
192172 Unit2;
193173...
194174```
195175
196176``` pascal
197177unit Unit2;
198178...
199179implementation
200180
201181uses
202182 Unit1;
203183...
204184```
205185
206186Jetzt ändern Sie noch die hinter den OnClick-Events der Buttons befindlichen Eventhandler zu:
207187
208188``` pascal
209189unit Unit1;
210190...
211191procedure TForm1.Button1Click(Sender: TObject);
212192begin
213193 Form2.Show; //Zeigt Form2
214194end;
215195```
216196
217197``` pascal
218198unit Unit2;
219199...
220200procedure TForm2.Button1Click(Sender: TObject);
221201begin
222202 Form1.Show; //Zeigt Form1
223203end;
224204```
225205
226206## Übergabe von Variablen in andere Formulare
227207
228208Entsprechend Beispiel [[Form Tutorial/de|Verwendung eines zweiten Formulars]] könnte man im Interface-Teil der [[Unit/de|Unit]] *Unit2* eine [[Global variables|globale Variable]] deklarieren. Damit hätte man Zugriff in der *Unit1* und *Unit2* auf ein und die selbe [[Variable]] (da in der *Unit1* unter `uses` die *Unit2* mit einbunden wurde, werden alle im Interface-Teil der *Unit2* deklarierten Variablen auch in *Unit1* nutzbar). Dieses Vorgehen sollten Sie aber auf ein Minimum beschränken, da man bei größeren Projekten schnell nicht mehr weiss, was die einzelnen Variablen für eine Bedeutung haben bzw. wo man überall darauf zugreift (Fehlerquote erhöht sich).
229209
230210Besser ist es lokale Variablen zu nutzen, diese als [[Object Oriented Programming with Free Pascal and Lazarus|Property]] in einer [[Class/de|Klasse]] oder hilfsweise als Variable in einer Klasse zu definieren und auf diese zuzugreifen.\
231-\
211+
232212Im nachfolgenden Projekt wird per Buttonklick ein zweites Formular geöffnet. Dabei wird in der Unit des Hauptformulars gezählt, wie oft dieses angezeigt wurde. In diesem zweiten Formular können Sie sich per Buttonklick zeigen lassen, wie oft es geöffnet wurde:
233213
234214- erstellen Sie ein neues Projekt mit zwei Formularen, jeweils ein Button darauf und die Eventhandler zu deren OnClick-Events
235215
236216- nun erstellen Sie im [[Class/de|Public-Teil]] der [[Class/de|Klasse]] *TForm2* (Unit2) eine Variable (in diesem Fall eine [[Const/de|Konstante]], die Sie als definierte Variable missbrauchen) vom Typ Integer mit dem Namen *Zaehler*:
237217
238218``` pascal
239219unit Unit2;
240220...
241221 TForm2 = class(TForm)
242222 Button1: TButton;
243223 procedure Button1Click(Sender: TObject);
244224 private
245225 { private declarations }
246226 public
247227 { public declarations }
248228 const Zaehler: Integer = 0; //hier Zaehler definieren
249229 end;
250230```
251231
252232- jetzt müssen noch die Button-Eventhandler entsprechend anpassen:
253233
254234``` pascal
255235unit Unit1;
256236...
257237procedure TForm1.Button1Click(Sender: TObject);
258238begin
259239 inc(Form2.Zaehler); //Bei jedem Aufruf von Form2 den Zähler um 1 erhöhen
260240 Form2.ShowModal; //Form2 anzeigen
261241end;
262242```
263243
264244``` pascal
265245unit Unit2;
266246...
267247procedure TForm2.Button1Click(Sender: TObject);
268248begin
269249 ShowMessage('Form2 wurde insgesamt '+IntToStr(Zaehler)+' mal aufgerufen');
270250end;
271251```
272252
273253Auf diese Weise können Sie in *Unit1* auf alle in *Unit2* öffentlichen (public) Variablen/Properties/Funktionen/Proceduren (allgemein Methoden) zugreifen.
274254
275255## Sonstiges im Umgang mit Formularen
276256
277257### Anderes Formular als HauptFormular verwenden
278258
279259Stellen Sie nach einer Weile fest, dass Sie lieber ein anderes oder ein neues Formular zur Ansicht beim Programmstart angezeigt haben wollen, können Sie, unter dem Mainmenu Projekt -\> Projekteinstellungen -\> Formulare, die Reihenfolge der Formulare ändern:
280260
281-<figure>
282-<img src="Projekteinstellungen_Formulare.png" title="Projekteinstellungen_Formulare.png" />
283-<figcaption>Projekteinstellungen_Formulare.png</figcaption>
284-</figure>
261+![](/wiki-images/7/76/Projekteinstellungen_Formulare.png)
285262
286263Alternativ können Sie sich, unter Hauptmenu Projekt -\> .lpr-Datei anzeigen, die Projekt.lpr (Pascal-Quelltext des Hauptprogramms) anzeigen lassen und dort das zuerst anzuzeigende Formular als erstes erstellen lassen:
287264
288265``` pascal
289266program Project1;
290267...
291268 Application.CreateForm(TForm2, Form2); //Form2 wird als erstes erstellt und damit beim Start der Anwendung gezeigt
292269 Application.CreateForm(TForm1, Form1);
293270```
294271
295272### Eigenschaft eines Formulars bei Programmende speichern
296273
297274Bei manchen Anwendungen ist es schön, wenn die vom User geänderte Einstellungen bezüglich Position und Größe des Formulars bei Programmende gespeichert werden und bei Programmstart wieder so hergestellt werden. Dafür stellt Ihnen Lazarus von Haus aus eine recht einfache Möglichkeit mittels [[TXMLPropStorage/de|TXMLPropStorage]] oder [[TINIPropStorage/de|TIniPropStorage]] zur Verfügung.
298275
299276Ein einfaches Beispiel soll die Funktionsweise verdeutlichen:
300277
301278- neue Anwendung erstellen (Hauptmenu Projekt -\> Neues Projekt -\> Anwendung)
302279- eine TXMLPropStorage Komponente auf das Formular ablegen (Zu finden ist sie auf dem Tab Misc in der Komponentenpalette)
303280
304-<figure>
305-<img src="KomponentenpaletteTXMLPropStorage.png" title="KomponentenpaletteTXMLPropStorage.png" />
306-<figcaption>KomponentenpaletteTXMLPropStorage.png</figcaption>
307-</figure>
281+![](/wiki-images/0/00/KomponentenpaletteTXMLPropStorage.png)
308282
309283- im Objektinspektor: XMLPropStorage1 -\> FileName auf z.B. "session.xml" setzen
310284- im Objektinspektor: Form1 -\> SessionProperties bearbeiten (einfach den Button \[...\] anklicken)
311285- nun jeweils die Properties Left;Top;Width;Height von der *Komponente Form1* auswählen und den *Selected Properties* hinzufügen
312286- mit OK bestätigen und Projekt starten, das Formular in der Größe verändern und verschieben, beim nächsten Start hat es wieder diese Einstellung
313287
314288Weitere Informationen unter [[TXMLPropStorage/de|TXMLPropStorage]]
315289
316290## Formular dynamisch erzeugen
317291
318292### Von Lazarus designtes Formular dynamisch erstellen
319293
320294Sie müssen nicht alle Formulare, die während der Laufzeit einer Anwendung möglicherweise aufgerufen werden, immer bei Programmstart erstellen lassen. Manche Entwickler halten generell nichts davon und löschen den, bei Einfügen eines neuen Formulars in ein Projekt automatisch erstellten, Code aus der Projekt.lpr sofort heraus. Sobald Sie z.B. eine Library schreiben wollen, die ein paar GUIs enthält, kommen Sie um die dynamische Erstellung von Formularen nicht herum.
321295
322296Ein Beispiel:
323297
324298- erstellen Sie ein neue Anwendung mit zwei Formularen, fügen *Form1* einen TButton hinzu und nehmen in die Uses-Klausel von *Unit1*, "Unit2" mit auf
325299- öffnen Sie die Projekt.lpr (Projekt -\> .lpr-Datei anzeigen)
326300- löschen Sie die Zeile " Application.CreateForm(TForm2, Form2);"
327301- im OnClick-Ereignis von *Form1 Button1* müssten Sie folgenden Code einfügen:
328302
329303``` pascal
330304procedure TForm1.Button1Click(Sender: TObject);
331305begin
332306 Form2:=TForm2.Create(Nil); //Form2 wird erstellt
333307 Form2.ShowModal; //Form2 wird angezeigt
334308 FreeAndNil(Form2); //Form2 wieder freigeben
335309end;
336310```
337311
338312- nun können Sie die Anwendung starten
339313
340314### Neues Formular dynamisch erstellen
341315
342316Folgendes Beispiel soll demonstrieren, wie neue Formulare per Hand, ohne den Formulardesigner, erzeugt werden können.
343317
344318Mit einem Buttonklick soll sich ein weiteres Formular öffnen, das einen Button enthält, bei dessen Klick eine Warnmeldung erscheint, dass sich das Formular schließen wird und daraufhin das Formular geschlossen wird.
345319
346320- erstellen Sie eine neue Anwendung mit einem Formular und einem Button
347321- im OnClick-Ereignis von *Form1 Button1* müssen Sie folgenden Code einfügen:
348322
349323``` pascal
350324procedure TForm1.Button1Click(Sender: TObject);
351325var
352326 MyForm: TForm;
353327 MyButton: TButton;
354328begin
355329 MyForm:=TForm.Create(nil); // Formular erzeugen
356330 MyForm.SetBounds(100, 100, 220, 150); // Größe des Formulars
357331 MyForm.Caption:='Mein dynamisch erstelltes Formular';
358332
359333 MyButton:=TButton.create(MyForm); // Den Button erstellen, der Owner wird MyForm
360334 MyButton.Caption:='Schließe meines Formulars';
361335 MyButton.SetBounds(10, 10, 200, 30);
362336 MyButton.Parent:=MyForm; // Festlegen, auf welchem Formular der Button platziert wird
363337
364338 MyButton.OnClick:=@MyButtonClick; // Wird gleich noch erstellt...
365339
366340 MyForm.ShowModal; // MyForm anzeigen
367341
368342 FreeAndNil(MyForm); // MyForm (und MyButton) wieder freigeben
369343end;
370344```
371345
372346> **Note:** Wenn eine Komponente mit einem Owner erzeugt wurde (TButton.Create(Owner: TComponent)), gehört sie dem Owner, der dann dafür zuständig ist,\
373347> die Komponente freizugeben. Somit wird MyButton bei der Freigabe von MyForm automatisch mit freigegeben.
374348
375349- jetzt müssen Sie noch der Eventhandler von MyButtonClick erstellen
376350- dazu im private-Abschnitt der Klasse *TForm1* folgende Procedure hineinschreiben und \[Strg\]+\[Shift\]+\[C\] (Codevervollständigung) drücken:
377351
378352``` pascal
379353 TForm1 = class(TForm)
380354...
381355 private
382356 { private declarations }
383357 procedure MyButtonClick(Sender: TObject);
384358```
385359
386360- und folgenden Code dort einfügen:
387361
388362``` pascal
389363procedure TForm1.MyButtonClick(Sender: TObject);
390364begin
391365 Showmessage('Achtung, mein dynamisch erstelltes Formular wird geschlossen!');
392366 if Sender is TButton then
393367 TForm(TButton(Sender).Parent).Close;
394368end;
395369```
396370
397371- nun können Sie das Projekt kompilieren und starten
398372
399373Ein paar Tipps für die [[LCL Tips/de|manuelle Erzeugung von Bedienelementen]]
400374
401375## Weitere Informationen
402376
403377- [[LCL Tips/de|Beispiel, wie Sie eine komplette GUI Anwendung per Code erstellen können]]
404378- [[Testing, if form exists/de|Testen, ob ein Formular existiert]]
405379- [[Canvas draw vertical line on form/de|Eine vertikale Line auf einem Formular zeichnen]]
406380- [[Drawing with canvas/de|Mit Canvas auf einem Formular zeichnen]]
407381- [[user should not be able to close form/de|Verhindern, dass ein Anwender das Formular schliessen kann]]
408382- [[LCL Tips/de|Ein nicht-rechteckiges Fenster oder Steuerelement erstellen]]
409383
410384---
411385*From the Free Pascal wiki, page "Form Tutorial/de", as it stood on 2020-02-15 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history