Sign in Join
Wiki copytemporary

Form Tutorial/fi: what changed

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

OldNewLine
11Lyhyt esittely lomakkeiden käytöstä Lazaruksessa.
22
33## Mikä on lomake?
44
55Lomake (luokka [[TForm/fi|TForm]]) edustaa ikkunaa tai valintaikkunaa, joka on [[Application|sovelluksen]] käyttöliittymä. Säiliö, johon kaikki muut [[LCL Components|komponentit]] (esim. Painikkeet, label:t, muokkauskentät, kuvat jne.) lisätään.
66
77## Ensimmäinen GUI-sovellus
88
99Lazaruksen onnistuneen asentamisen ja uuden sovelluksen käynnistämisen jälkeen luodaan tyhjä lomake. Se voidaan luoda uuden [[Overview of Free Pascal and Lazarus|GUI-sovelluksen]] päävalikosta -\> Projekti -\> Uusi projekti -\> Sovellus ja paina OK painiketta.
1010
1111Näin luotiin uusi, täysin toimiva lomake projekti:
1212
13-<figure>
14-<img src="Form1_Designmodus.png" title="Form1_Designmodus.png" />
15-<figcaption>Form1_Designmodus.png</figcaption>
16-</figure>
13+![](/wiki-images/7/73/Form1_Designmodus.png)
1714
18-Uusi projekti voidaan käynnistää painamalla <span class="kbd">F9</span>-näppäintä tai klikkaamalla hiirellä päävalikon kuvaketta ![](/wiki-images/b/b8/Start.png) (tai valitaan päävalikosta: Suorita -\> Suorita). Projekti kootaan ja suoritetaan.
15+Uusi projekti voidaan käynnistää painamalla `F9`-näppäintä tai klikkaamalla hiirellä päävalikon kuvaketta ![](/wiki-images/b/b8/Start.png) (tai valitaan päävalikosta: Suorita -\> Suorita). Projekti kootaan ja suoritetaan.
1916
2017Mitään todella jännittävää ei tapahdu. Lomake (Form1) muuttuu hieman ulkonäöltään ja rasteriruudukon pisteet (joita käytetään yksittäisten komponenttien paikannusapuna) katoavat (niin kauan kuin ruudukon pisteet ovat näkyvissä, tiedät myös, että se on edelleen suunnittelutilassa):\
2118![](/wiki-images/7/73/Form1_Designmodus.png) -\> ![](/wiki-images/d/dc/Form1_Runmodus.png)
2219
2320Seuraavaksi voidaan asettaa [[TButton/fi|TButtonin]] lomakkeelle. Tätä käytetään myöhemmin mahdollistamaan toisen lomakkeen avaaminen:
2421
2522Valitaan TButton [[Component Palette/fi|komponenttipaletin]] [[Standard tab/fi|Standard]]-välilehdeltä.
2623
27-<figure>
28-<img src="TButtonStandardpalette.png" title="TButtonStandardpalette.png" />
29-<figcaption>TButtonStandardpalette.png</figcaption>
30-</figure>
24+![](/wiki-images/4/49/TButtonStandardpalette.png)
3125
3226ja klikataan lomaketta: Nyt siinä on painike, joka on sijoitettu Form1: een, jonka nimi ja kuvateksti on "Button1".
3327
3428Jotta tämä painike voisi tehdä jotain, niin on ilmoitettava, että aiotaan tehdä jotain, kun sitä klikataan. Tätä voidaan pitää yksinkertaisena tapahtumana. Tätä varten tarvitaan [[Event order|tapahtuman käsittelijä]], jota kutsutaan klikkauksen jälkeen. Hiiren klikkauksen tapahtumakäsittelijä on melko helposti saavutettavissa kaksoisklikkaamalla Button1-painiketta (tai komponenttimuokkaimessa), valitaan Button1 -\> Tapahtumat-välilehti -\> OnClick ja klikataan sitten \[...\] -painiketta. Tämä luo aliohjelman procedure TForm1.Button1Click koodieditoriin, jota kutsutaan aina ([[runtime|ajonaikaisesti]], ei suunnittelun aikana), kun Button1:stä klikataan:
3529
36-<figure>
37-<img src="NeuesProjekt2.png" title="NeuesProjekt2.png" />
38-<figcaption>NeuesProjekt2.png</figcaption>
39-</figure>
30+![](/wiki-images/9/9b/NeuesProjekt2.png)
4031
4132Jotta sovellus voi tehdä jotain Button1:n klikkaamisen jälkeen, lisätään koodia [[Begin/fi|Begin]] ja [[End/fi|End]] lauseiden väliin aliohjelman rungoon procedure TForm1.Button1Click näin:
4233
4334``` pascal
4435procedure TForm1.Button1Click(Sender: TObject);
4536begin
4637 Caption:='My first Form'; //Lomakkeen Form1 otsikko muuttuu
4738 //or
4839 Button1.Caption:='Hello'; //Painikkeen teksti muuttuu
4940end;
5041```
5142
52-Suorita lomake nyt painamalla <span class="kbd">F9</span> ja huomaa, että kun painiketta klikataan niin lomakkeen otsikko ja painikkeen otsikko muuttuvat.
43+Suorita lomake nyt painamalla `F9` ja huomaa, että kun painiketta klikataan niin lomakkeen otsikko ja painikkeen otsikko muuttuvat.
5344
5445Nyt voidaan kokeilla hieman ja oppia käyttämään standardikomponentteja. Alussa suosittellaan kokeilemaan seuraavia komponentteja:
5546
56-<table>
57-<tbody>
58-<tr>
59-<td><p>[[TButton/fi|TButton]]</p></td>
60-<td><figure>
61-<img src="tbutton.png" title="tbutton.png" />
62-<figcaption>tbutton.png</figcaption>
63-</figure></td>
64-</tr>
65-<tr>
66-<td><p>[[TLabel/fi|TLabel]]</p></td>
67-<td><figure>
68-<img src="tlabel.png" title="tlabel.png" />
69-<figcaption>tlabel.png</figcaption>
70-</figure></td>
71-</tr>
72-<tr>
73-<td><p>[[TEdit/fi|TEdit]]</p></td>
74-<td><figure>
75-<img src="tedit.png" title="tedit.png" />
76-<figcaption>tedit.png</figcaption>
77-</figure></td>
78-</tr>
79-<tr>
80-<td><p>[[TMemo/fi|TMemo]]</p></td>
81-<td><figure>
82-<img src="tmemo.png" title="tmemo.png" />
83-<figcaption>tmemo.png</figcaption>
84-</figure></td>
85-</tr>
86-<tr>
87-<td><p>[[TToggleBox/fi|TToggleBox]]</p></td>
88-<td><figure>
89-<img src="ttogglebox.png" title="ttogglebox.png" />
90-<figcaption>ttogglebox.png</figcaption>
91-</figure></td>
92-</tr>
93-<tr>
94-<td><p>[[TCheckBox/fi|TCheckBox]]</p></td>
95-<td><figure>
96-<img src="tcheckbox.png" title="tcheckbox.png" />
97-<figcaption>tcheckbox.png</figcaption>
98-</figure></td>
99-</tr>
100-<tr>
101-<td><p>[[TRadioButton/fi|TRadioButton]]</p></td>
102-<td><figure>
103-<img src="tradiobutton.png" title="tradiobutton.png" />
104-<figcaption>tradiobutton.png</figcaption>
105-</figure></td>
106-</tr>
107-<tr>
108-<td><p>[[TListBox/fi|TListBox]]</p></td>
109-<td><figure>
110-<img src="tlistbox.png" title="tlistbox.png" />
111-<figcaption>tlistbox.png</figcaption>
112-</figure></td>
113-</tr>
114-<tr>
115-<td><p>[[TComboBox/fi|TComboBox]]</p></td>
116-<td><figure>
117-<img src="tcombobox.png" title="tcombobox.png" />
118-<figcaption>tcombobox.png</figcaption>
119-</figure></td>
120-</tr>
121-<tr>
122-<td><p>[[TScrollBar/fi|TScrollBar]]</p></td>
123-<td><figure>
124-<img src="tscrollbar.png" title="tscrollbar.png" />
125-<figcaption>tscrollbar.png</figcaption>
126-</figure></td>
127-</tr>
128-</tbody>
129-</table>
47+| | |
48+|----|----|
49+| [[TButton/fi|TButton]] | ![](/wiki-images/b/b2/Tbutton.png) |
50+| [[TLabel/fi|TLabel]] | ![](/wiki-images/a/a2/Tlabel.png) |
51+| [[TEdit/fi|TEdit]] | ![](/wiki-images/d/db/Tedit.png) |
52+| [[TMemo/fi|TMemo]] | ![](/wiki-images/1/1b/Tmemo.png) |
53+| [[TToggleBox/fi|TToggleBox]] | ![](/wiki-images/1/15/Ttogglebox.png) |
54+| [[TCheckBox/fi|TCheckBox]] | ![](/wiki-images/d/d6/Tcheckbox.png) |
55+| [[TRadioButton/fi|TRadioButton]] | ![](/wiki-images/7/7a/Tradiobutton.png) |
56+| [[TListBox/fi|TListBox]] | ![](/wiki-images/7/77/Tlistbox.png) |
57+| [[TComboBox/fi|TComboBox]] | ![](/wiki-images/7/75/Tcombobox.png) |
58+| [[TScrollBar/fi|TScrollBar]] | ![](/wiki-images/c/c4/Tscrollbar.png) |
13059
13160Lisää muita hyödyllisiä tietoja on [[Lazarus Tutorial/fi|Lazarus Tutorial opetussivulla]].
13261
13362## Kahden lomakkeen käyttö
13463
13564Tässä nähdään, kuinka voidaan käyttää useita lomakkeita projektissa. Tässä esimerkissä luodaan vain kaksi lomaketta, Form1 (päälomake) ja Form2, mutta prosessi on identtinen lisälomakkeiden osalta.
13665
13766Päälomakkeella on painike, joka klikkaamalla avataan uusi lomake. Uusi lomake saa myös painikkeen, jota klikkamalla sulkee tämän uuden lomakkeen ja palaa takaisin päälomakkeeseen.
13867
13968Jos ollaan tehty ensimmäinen opetusohjelma: [[Form Tutorial/fi|Ensimmäinen käyttöliittymäsovellus]], niin on poistettava koodi aliohjelmassa procedure TForm1.Button1Click lauseiden begin ja end väliltä. Muutoin on luotava uusi projekti (sovellus), tuotava painike lomakkeelle ja luotava OnClick-tapahtumakäsittelijä tälle painikkeelle.\
14069Klikkaa uutta painiketta, jos halutaan kirjoittaa painikkeen Caption ominaisuuteen (näkyvä teksti painikkeella). Tämä voidaan tehdä valitsemalla painike (klikkaa sitä kerran) ja komponenttimuokkaimessa valisemalla Ominaisuudet-välilehti -\> ja kirjoittamalla Caption ominaisuuteen teksti "Avaa Lomake2" tai "Open Form2".
14170
142-<figure>
143-<img src="Objektinspektor.png" title="Objektinspektor.png" />
144-<figcaption>Objektinspektor.png</figcaption>
145-</figure>
71+![](/wiki-images/5/52/Objektinspektor.png)
14672
14773Klikkaa päävalikossa Tiedosto -\> Uusi lomake, jos halutaan lisätä toinen lomake (Form2) projektiin. Sijoitetaan painike (Button1) Form2: een ja luodaan siihen OnClick-tapahtumankäsittelijä. Muuta tämän painikkeen Caption ominaisuuden teksti "Sulje" (tai "Close").
14874
149-Nyt projektissa on kaksi lomaketta, joista jokainen voidaan valita ja näyttää päävalikossa Projekti -\> Lomakkeet (tai näppäinyhdistelmällä <span class="kbd">Shift</span> + <span class="kbd">F12</span>). Vaihtoehtoisesti voidaan valita käännösyksikön välilehti lähdekoodieditorissa ja käyttää sitten <span class="kbd">F12</span>-näppäintä vaihtamaan koodieditori ja lomakkeen suunnittelun välillä vastaavan käännösyksikön lomakkeella.
75+Nyt projektissa on kaksi lomaketta, joista jokainen voidaan valita ja näyttää päävalikossa Projekti -\> Lomakkeet (tai näppäinyhdistelmällä `Shift` + `F12`). Vaihtoehtoisesti voidaan valita käännösyksikön välilehti lähdekoodieditorissa ja käyttää sitten `F12`-näppäintä vaihtamaan koodieditori ja lomakkeen suunnittelun välillä vastaavan käännösyksikön lomakkeella.
15076
15177Siirrytään [[source code editor|lähdekoodieditorissa]] Form1:tä vastaavaan [[Unit/fi|käännösyksikköön]] (Unit1) ja lisätään "Unit2" sen [[Uses/fi|uses]] lauseeseen :
15278
15379``` pascal
15480uses
15581 Classes, SysUtils, ... , Unit2; // On tärkeää, että yksittäiset käännösyksiköt erotetaan pilkulla
15682 // ja lauseke päättyy puolipisteeseen.
15783```
15884
15985Nyt voidaan kutsua Unit2:sta (ja siten Form2:sta) Unit1:ltä.
16086
16187Seuraavaksi muokataan OnClick-tapahtumaa, joka kuuluu Form1:n painikkeelle:
16288
16389``` pascal
16490unit Unit1;
16591...
16692procedure TForm1.Button1Click(Sender: TObject);
16793begin
16894 Form2.ShowModal; //Näytetään Form2 ja fokus asetetaan Form2:lle.
16995end;
17096```
17197
17298``` pascal
17399unit Unit2;
174100...
175101procedure TForm2.Button1Click(Sender: TObject);
176102begin
177103 Close; //Suljetaan Form2.
178104end;
179105```
180106
181-Nyt voidaan käynnistää projekti (![](/wiki-images/b/b8/Start.png) tai <span class="kbd">F9</span>) ja avata Form2 klikkaamalla Form1-painiketta.
107+Nyt voidaan käynnistää projekti (![](/wiki-images/b/b8/Start.png) tai `F9`) ja avata Form2 klikkaamalla Form1-painiketta.
182108
183109### Show ja ShowModal-erot
184110
185111Molemmat menetelmät *Show* ja *ShowModal* tekevät lomakkeen näkyväksi. Nähdäksesi eron *Show*- ja *ShowModal*:n välillä:
186112
187113- Laajenna edellisen esimerkin [[Form Tutorial/fi|Kahden lomakkeen käyttö]] lisäämällä toinen TButton *Form1*:een.
188114- Valitse *Button1* ja muuta ominaisuuksien *Name* arvoon *btnShow* ja Caption arvoon *Show*.
189115- Valitse *Button2* ja muuta ominaisuudet *Name* arvoon *btnShowModal* ja Caption arvoon *ShowModal*.
190116- Luo (tai muokkaa) kahden painikkeen *OnClick*-tapahtumakäsittelijää seuraavasti:
191117
192118``` pascal
193119procedure TForm1.btnShowClick(Sender: TObject);
194120begin
195121 Form2.Show;
196122 ShowMessage('Form2 is opened!');
197123end;
198124
199125procedure TForm1.btnShowModalClick(Sender: TObject);
200126begin
201127 Form2.ShowModal;
202128 ShowMessage('Form2 is opened and closed again!');
203129end;
204130```
205131
206132Käynnistä ohjelma ja katso eroa!
207133
208134Show
209135
210136Tämä aliohjelma tekee lomakkeen näkyväksi ja jatkaa kutsuvan ohjauksen koodin (*Form1*) suorittamista. Esimerkissä viesti ([[Dialog Examples/fi|ShowMessage]]) näkyy lähes samanaikaisesti *Form2*:n kanssa. Voidaan myös jatkaa kutsuvan lomakkeen *Form1* käyttöä. Esimerkiksi on mahdollista siirtää sitä tai klikata *Show*-painiketta uudelleen (mutta klikkaamalla *ShowModal* aiheuttaa virheen).
211137
212138**`<myForm>.Show;`**: n käyttämisen sijaan on mahdollista käyttää **`<myForm>.Visible:=True;`**. Metodi *Show* tekee seuraavaa:
213139
214140``` pascal
215141procedure TCustomForm.Show;
216142begin
217143 Visible := True;
218144 BringToFront;
219145end;
220146```
221147
222148Ainoa ero **\<myForm\>.Show;** ja **\<myForm\>.Visible: = True;** on, että lomake, joka näytetään *Show*, on kaikkien muiden tällä hetkellä näkyvien lomakkeiden päällä.
223149
224150ShowModal
225151
226152ShowModal pysäyttää koodin käsittelyn kutsun tehneessä kontrollissa (*Form1*), kunnes vasta avattu lomake (*Form2*) on suljettu. Esimerkissä *ShowModal*in välittömästi seuraava *ShowMessage*-rivi suoritetaan vasta kun *Form2* on suljettu. Kutsulomake on jäädytetty: Ei voi siirtää *Form1*:tä eikä klikata mitään sen painikkeista.
227153
228154ShowModal on funktio, joka palauttaa kokonaisluvun, katso [[doc:lcl/forms/tmodalresult.html|TModalResult]]. Palautettu arvo sallii haarautumisen sen mukaan, miten lomake suljettiin.
229155
230156## Kaksi lomaketta, jotka voivat kutsua toisiaan
231157
232158Yleensä on hyvä ohjelmasuunnittelu välttää päälomakkeen kutsuminen toisesta lomakkeesta. On parempi palata päälomakkeeseen sulkemalla toinen lomake (kuten edellisessä esimerkissä) ja antamalla fokuksen palata päälomakkeelle. On kuitenkin mahdollista kutsua alilomakkeelta päälomaketta, kuten tämä esimerkki näyttää.
233159
234160Jotta Form1 voi kutsua Form2:sta, niin Unit1:n uses-lausekkeessa on oltava unit2. Ja päinvastoin, kun Form2:sesta kutsutaan Form1:stä niin Unit2:n on käytettävä unit1 sen uses-lausekkeessa. Tämä johtaa mahdolliseen Circular Unit Reference-kääntäjän virheeseen, kun kukin yksikkö viittaa toiseen. Tämä esimerkki osoittaa myös, miten Circular Unit Reference virhe voidaan välttää.
235161
236162Jos halutaan tehdä tämä esimerkki, muokkaa edellisen esimerkin lomakkeita ([[Form Tutorial|Kahden lomakkeen käyttö]]) tai luo uusi projekti, jossa on kaksi lomaketta, joista jokaisella on yksi painike. Aseta Form1.Button1:n caption arvoon "Open Form2" ja määritä Form2.Button1: n caption "Open Form1".
237163
238164Jos muokataan edellistä esimerkkiä niin poistetaan "Unit2" Unit1:n uses-lausekkeesta.
239165
240166Lisätään uses-lauseke kunkin [[Unit/fi|käännösyksikön]] [[Implementation]]-osaan. Lisätään unit2 Unit1:n-lausekkeeseen ja lisätään Unit1 Unit2:n-lausekkeeseen seuraavasti:
241167
242168``` pascal
243169unit Unit1;
244170...
245171implementation
246172
247173uses
248174 Unit2;
249175...
250176```
251177
252178``` pascal
253179unit Unit2;
254180...
255181implementation
256182
257183uses
258184 Unit1;
259185...
260186```
261187
262188Sitten muutetaan OnClick-tapahtumien takana olevaa koodia painikkeiden tapahtuman käsittelijässä:
263189
264190``` pascal
265191unit Unit1;
266192...
267193procedure TForm1.Button1Click(Sender: TObject);
268194begin
269195 Form2.Show;
270196end;
271197```
272198
273199``` pascal
274200unit Unit2;
275201...
276202procedure TForm2.Button1Click(Sender: TObject);
277203begin
278204 Form1.Show;
279205end;
280206```
281207
282208## Muuttujien siirtäminen muihin lomakkeisiin
283209
284210Edellä esitetyn esimerkin "[[Form Tutorial|Kahden lomakkeen käyttö]]" mukaisesti on mahdollista esitellä [[Global variables|globaali muuttuja]] Unit2: n rajapinnassa. Tämä mahdollistaisi pääsyn sekä unit1:n että unit2:n samaan [[Variable/fi|muuttujaan]] (tämä johtuu siitä, että asettamalla Unit2 unit1:n uses-lausekkeeseen, kaikki unit2 rajapinnassa ilmoitetut muuttujat ovat myös saatavilla käännösyksikössä unit1). Tämä käytäntö on rajoitettava minimiin, koska siitä on vaikea muistaa, mikä yksittäisen muuttujan "näkölaajuus", se mahdollisesti lisää virheitä. On parempi käyttää [[Local variables/fi|paikallisia muuttujia]], määritellä [[Object Oriented Programming with Free Pascal and Lazarus|Property]] [[Class/fi|luokassa]] tai vaihtoehtoisesti muuttujana luokassa.
285211
286212Seuraavassa projektissa avataan toinen lomake klikkaamalla painiketta. Tällöin päälomakkeen käännösyksikössä lasketaan, kuinka usein toinen muoto on näytetty. Tässä toisessa lomakkeessa voit kysyä, klikkaamalla painiketta, kuinka usein se on avattu:
287213
288214- Tehdään uusi projekti, jossa on kaksi lomaketta, jokainen painike sen päällä ja niiden OnClick-tapahtumat arvioida.
289215- nyt luokan TForm2 (unit2) julkisessa osassaon muuttuja (tässä tapauksessa [[Const/fi|vakio]], joka määriteltiin muuttuvaksi). Se on kokonaisluku tyyppinen, jonka nimi on Count:
290216
291217``` pascal
292218unit Unit2;
293219...
294220 TForm2 = class(TForm)
295221 Button1: TButton;
296222 procedure Button1Click(Sender: TObject);
297223 private
298224 { private declarations }
299225 public
300226 { public declarations }
301227 const Count: Integer = 0; //Tässä
302228 end;
303229```
304230
305231- nyt voidaan jopa mukauttaa painikkeen tapahtuman käsittelijää vastaavasti:
306232
307233``` pascal
308234unit Unit1;
309235...
310236procedure TForm1.Button1Click(Sender: TObject);
311237begin
312238 inc(Form2.Count); //Lisää laskuria yhdellä jokaiselle Form2-kutsulla
313239 Form2.ShowModal;
314240end;
315241```
316242
317243``` pascal
318244unit Unit2;
319245...
320246procedure TForm2.Button1Click(Sender: TObject);
321247begin
322248 ShowMessage('Form2 would be displayed '+IntToStr(Count)+' times');
323249end;
324250```
325251
326252Tällä tavoin voidaan käyttää Unit1:ssä kaikkia Unit2:n julkisia muuttujia / ominaisuuksia / funktioita / aliohjelmia (yleisiä metodeja).
327253
328254## Muut lomakkeeseen liittyvät aiheet
329255
330256### Käytä toista lomaketta päälomakkeena
331257
332258Jos päätät jonkin ajan kuluttua, että haluat näyttää eri lomakkeita tai uuden lomakkeen näkymään käynnistyksen aikana, voit valita päävalikosta Projekti -\> Projektiasetukset -\> Lomakkeet:
333259
334-<figure>
335-<img src="Projekteinstellungen_Formulare.png" title="Projekteinstellungen_Formulare.png" />
336-<figcaption>Projekteinstellungen_Formulare.png</figcaption>
337-</figure>
260+![](/wiki-images/7/76/Projekteinstellungen_Formulare.png)
338261
339262Vaihtoehtoisesti voit valita Päävalikko -\> Projekti -\> Näytä projektin lähdekoodi, eli Project1.lpr (pääohjelman Pascal-koodi) ja luo ensimmäinen lomake, joka näytetään ensimmäisenä:
340263
341264``` pascal
342265program Project1;
343266...
344267 Application.CreateForm(TForm2, Form2); //Form2 luotiin ekana ja näytetään kun sovellus käynnistyy
345268 Application.CreateForm(TForm1, Form1);
346269```
347270
348271### Tallenna lomakkeen ominaisuudet ohjelman lopussa
349272
350273- [[Remember form position and size|Remember form position and size#Using_TForm.SessionProperties and TXMLPropStorage]]
351274
352275## Luo lomake dynaamisesti
353276
354277### Luo Lazaruksessa suunniteltu lomake dynaamisesti
355278
356279Aina ei tarvitse luoda kaikkia lomakkeita käynnistyksen aikana, joita voidaan kutsua sovelluksen aikana. Jotkut kehittäjät eivät yleensäkään pidä mitään niistä ja poistaa koodin, joka luodaan automaattisesti, kun lisätään projektiin uusi lomake Projekt.lpr: stä. Jos halutaan kirjoittaa kirjasto, jossa on muutama graafinen käyttöliittymä, ei voida muodostaa muotojen dynaamista luomista.
357280
358281Esimerkki:
359282
360283- uusi sovellus, jossa on kaksi lomaketta, Form1:llä painike (lisää unit1 uses lausekkeeseen "Unit2")
361284- avaa Projekt.lpr (Projekti -\> Näytä projektin lähdekoodi).
362285- poista rivi "Application.CreateForm (TForm2, Form2)";
363286- Button1: n OnClick-tapahtuma, Form1 lisää seuraavaa koodia:
364287
365288``` pascal
366289procedure TForm1.Button1Click(Sender: TObject);
367290begin
368291 Form2:=TForm2.Create(Nil); //Form2 luodaan
369292 Form2.ShowModal; //Form2 näytetään
370293 FreeAndNil(Form2); //tuhotaan Form2
371294end;
372295```
373296
374297- nyt yksinkertaisesti suorita
375298
376299### Uuden lomakkeen luominen dynaamisesti
377300
378301Seuraava esimerkki osoittaa, miten uudet lomakkeet voidaan luoda koodilla ilman Form Designer -ohjelmaa.
379302
380303Tässä esimerkissä painikkeen painaminen avaa toisen lomakkeen, joka itse sisältää painikkeen. Tämän toisen painikkeen klikkaaminen ilmoittaa, että lomake sulkeutuu; sitten lomake on suljettu.
381304
382305- Luo uusi sovellus lomakkeella ja painikkeella
383306- Lisää Button1: n OnClick-tapahtumassa lomakkeessa 1 seuraava koodi:
384307
385308``` pascal
386309procedure TForm1.Button1Click(Sender: TObject);
387310var
388311 MyForm: TForm;
389312 MyButton: TButton;
390313begin
391314 MyForm:=TForm.Create(nil);
392315 MyForm.SetBounds(100, 100, 220, 150);
393316 MyForm.Caption:='My dynamic created form';
394317
395318 MyButton:=TButton.create(MyForm);
396319 MyButton.Caption:='Close my form';
397320 MyButton.SetBounds(10, 10, 200, 30);
398321 MyButton.Parent:=MyForm;
399322
400323 MyButton.OnClick:=@MyButtonClick;
401324
402325 MyForm.ShowModal;
403326
404327 FreeAndNil(MyForm);
405328end;
406329```
407330
408331> **Note:** Jos komponentti on luotu omistajan (owner) kanssa (TButton.Create (Owner: TComponent)), se kuuluu omistajalle, joka vastaa sitten komponentin vapauttamisesta. Näin MyButton vapautetaan automaattisesti vapauttamalla MyForm.
409332
410333- nyt on luotava MyButton.OnClick-tapahtuman käsittelijä. Tätä varten kirjoita luokan TForm1 yksityiseen (private) osioon seuraava aliohjelman määrittely:
411334
412335``` pascal
413336TForm1 = class(TForm)
414337...
415338private
416339 { private declarations }
417340 procedure MyButtonClick(Sender: TObject);
418341```
419342
420-- Paina <span class="kbd">Ctrl\]</span>+<span class="kbd">Shift</span>+<span class="kbd">C</span> (code completion eli koodin täydentäminen) ja aseta seuraava koodi toteutukseen:
343+- Paina `Ctrl]`+`Shift`+`C` (code completion eli koodin täydentäminen) ja aseta seuraava koodi toteutukseen:
421344
422345``` pascal
423346procedure TForm1.MyButtonClick(Sender: TObject);
424347begin
425348 Showmessage('Attention, closing my dynamically created form!');
426349 if Sender is TButton then
427350 TForm(TButton(Sender).Parent).Close;
428351end;
429352```
430353
431354- nyt projekti voidaan koota ja suorittaa
432355
433356## Katso myös
434357
435358- [[LCL Tips|Vinkkejä kontrollien manuaaliseen generointiin]]
436359- [[LCL Tips|Esimerkki luoda täydellinen GUI-sovellus koodin mukaan]]
437360- [[Testing, if form exists|Testi onko lomake jo olemassa]]
438361- [[Canvas draw vertical line on form/de|piirtää pystysuoran viivan lomakkeelle]]
439362- [[Drawing with canvas|Piirretään lomakkeelle]]
440363- [[user should not be able to close form|Käyttäjän ei pitäisi pystyä sulkemaan lomaketta]]
441364- [[LCL Tips|Luodaan ei-suorakulmainen ikkuna tai kontrolli]]
442365- [[Remember form position and size|Muistetaan lomakkeen sijainti ja koko]]
443366
444367---
445368*From the Free Pascal wiki, page "Form Tutorial/fi", 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