Sign in Join
Wiki copytemporary

Form Tutorial/fi: what changed

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

OldNewLine
1-Lyhyt esittely lomakkeiden käytöstä Lazaruksessa.
1+Lyhyt esittely lomakkeiden käytöstä Lazaruksessa.
22
3+## Contents
4+
5+ * 1 Mikä on lomake?
6+ * 2 Ensimmäinen GUI-sovellus
7+ * 3 Kahden lomakkeen käyttö
8+ * 3.1 Show ja ShowModal-erot
9+ * 4 Kaksi lomaketta, jotka voivat kutsua toisiaan
10+ * 5 Muuttujien siirtäminen muihin lomakkeisiin
11+ * 6 Muut lomakkeeseen liittyvät aiheet
12+ * 6.1 Käytä toista lomaketta päälomakkeena
13+ * 6.2 Tallenna lomakkeen ominaisuudet ohjelman lopussa
14+ * 7 Luo lomake dynaamisesti
15+ * 7.1 Luo Lazaruksessa suunniteltu lomake dynaamisesti
16+ * 7.2 Uuden lomakkeen luominen dynaamisesti
17+ * 8 Katso myös
18+
319## Mikä on lomake?
420
5-Lomake (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.
21+Lomake (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.
622
723## Ensimmäinen GUI-sovellus
824
9-Lazaruksen 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.
25+Lazaruksen 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.
1026
11-Näin luotiin uusi, täysin toimiva lomake projekti:
27+Näin luotiin uusi, täysin toimiva lomake projekti:
1228
13-![](/wiki-images/7/73/Form1_Designmodus.png)
29+[![Form1 Designmodus.png](/wiki-images/7/73/Form1_Designmodus.png)](</File:Form1_Designmodus.png>)
1430
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.
31+Uusi projekti voidaan käynnistää painamalla `F9`-näppäintä tai klikkaamalla hiirellä päävalikon kuvaketta [![Start.png](/wiki-images/b/b8/Start.png)](</File:Start.png>) (tai valitaan päävalikosta: Suorita -> Suorita). Projekti kootaan ja suoritetaan.
1632
17-Mitää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):\
18-![](/wiki-images/7/73/Form1_Designmodus.png) -\> ![](/wiki-images/d/dc/Form1_Runmodus.png)
33+Mitää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):
1934
20-Seuraavaksi voidaan asettaa [[TButton/fi|TButtonin]] lomakkeelle. Tätä käytetään myöhemmin mahdollistamaan toisen lomakkeen avaaminen:
35+[![Form1 Designmodus.png](/wiki-images/7/73/Form1_Designmodus.png)](</File:Form1_Designmodus.png>) -> [![Form1 Runmodus.png](/wiki-images/d/dc/Form1_Runmodus.png)](</File:Form1_Runmodus.png>)
2136
22-Valitaan TButton [[Component Palette/fi|komponenttipaletin]] [[Standard tab/fi|Standard]]-välilehdeltä.
37+Seuraavaksi voidaan asettaa [[TButton/fi|TButtonin]] lomakkeelle. Tätä käytetään myöhemmin mahdollistamaan toisen lomakkeen avaaminen:
2338
24-![](/wiki-images/4/49/TButtonStandardpalette.png)
39+Valitaan TButton [[Component Palette/fi|komponenttipaletin]] [[Standard tab/fi|Standard]]-välilehdeltä.
2540
26-ja klikataan lomaketta: Nyt siinä on painike, joka on sijoitettu Form1: een, jonka nimi ja kuvateksti on "Button1".
41+[![TButtonStandardpalette.png](/wiki-images/4/49/TButtonStandardpalette.png)](</File:TButtonStandardpalette.png>)
2742
28-Jotta 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:
43+ja klikataan lomaketta: Nyt siinä on painike, joka on sijoitettu Form1: een, jonka nimi ja kuvateksti on "Button1".
2944
30-![](/wiki-images/9/9b/NeuesProjekt2.png)
45+Jotta 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:
3146
32-Jotta 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:
47+[![NeuesProjekt2.png](/wiki-images/9/9b/NeuesProjekt2.png)](</File:NeuesProjekt2.png>)
3348
34-``` pascal
49+Jotta 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:
50+```
3551procedure TForm1.Button1Click(Sender: TObject);
36-begin
37- Caption:='My first Form'; //Lomakkeen Form1 otsikko muuttuu
38- //or
39- Button1.Caption:='Hello'; //Painikkeen teksti muuttuu
40-end;
52+ begin
53+ Caption:='My first Form'; //Lomakkeen Form1 otsikko muuttuu
54+ //or
55+ Button1.Caption:='Hello'; //Painikkeen teksti muuttuu
56+ end;
4157```
4258
43-Suorita lomake nyt painamalla `F9` ja huomaa, että kun painiketta klikataan niin lomakkeen otsikko ja painikkeen otsikko muuttuvat.
44-
45-Nyt voidaan kokeilla hieman ja oppia käyttämään standardikomponentteja. Alussa suosittellaan kokeilemaan seuraavia komponentteja:
59+Suorita lomake nyt painamalla `F9` ja huomaa, että kun painiketta klikataan niin lomakkeen otsikko ja painikkeen otsikko muuttuvat.
4660
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) |
61+Nyt voidaan kokeilla hieman ja oppia käyttämään standardikomponentteja. Alussa suosittellaan kokeilemaan seuraavia komponentteja:
5962
60-Lisää muita hyödyllisiä tietoja on [[Lazarus Tutorial/fi|Lazarus Tutorial opetussivulla]].
63+[[TButton/fi|TButton]] | [![tbutton.png](/wiki-images/b/b2/tbutton.png)](</File:tbutton.png>)
64+---|---
65+[[TLabel/fi|TLabel]] | [![tlabel.png](/wiki-images/3/3a/tlabel.png)](</File:tlabel.png>)
66+[[TEdit/fi|TEdit]] | [![tedit.png](/wiki-images/0/07/tedit.png)](</File:tedit.png>)
67+[[TMemo/fi|TMemo]] | [![tmemo.png](/wiki-images/f/f3/tmemo.png)](</File:tmemo.png>)
68+[[TToggleBox/fi|TToggleBox]] | [![ttogglebox.png](/wiki-images/5/5e/ttogglebox.png)](</File:ttogglebox.png>)
69+[[TCheckBox/fi|TCheckBox]] | [![tcheckbox.png](/wiki-images/3/3c/tcheckbox.png)](</File:tcheckbox.png>)
70+[[TRadioButton/fi|TRadioButton]] | [![tradiobutton.png](/wiki-images/e/ef/tradiobutton.png)](</File:tradiobutton.png>)
71+[[TListBox/fi|TListBox]] | [![tlistbox.png](/wiki-images/7/7f/tlistbox.png)](</File:tlistbox.png>)
72+[[TComboBox/fi|TComboBox]] | [![tcombobox.png](/wiki-images/b/be/tcombobox.png)](</File:tcombobox.png>)
73+[[TScrollBar/fi|TScrollBar]] | [![tscrollbar.png](/wiki-images/0/05/tscrollbar.png)](</File:tscrollbar.png>)
74+
75+Lisää muita hyödyllisiä tietoja on [[Lazarus Tutorial/fi|Lazarus Tutorial opetussivulla]].
6176
6277## Kahden lomakkeen käyttö
6378
64-Tä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.
65-
66-Pää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.
79+Tä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.
6780
68-Jos 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.\
69-Klikkaa 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".
81+Pää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.
7082
71-![](/wiki-images/5/52/Objektinspektor.png)
83+Jos 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.
84+Klikkaa 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".
7285
73-Klikkaa 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").
86+
87+[![Objektinspektor.png](/wiki-images/5/52/Objektinspektor.png)](</File:Objektinspektor.png>)
7488
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.
89+Klikkaa 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").
7690
77-Siirrytää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 :
91+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.
7892
79-``` pascal
93+Siirrytää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 :
94+```
8095uses
81- Classes, SysUtils, ... , Unit2; // On tärkeää, että yksittäiset käännösyksiköt erotetaan pilkulla
82- // ja lauseke päättyy puolipisteeseen.
96+ Classes, SysUtils, ... , Unit2; // On tärkeää, että yksittäiset käännösyksiköt erotetaan pilkulla
97+ // ja lauseke päättyy puolipisteeseen.
8398```
8499
85-Nyt voidaan kutsua Unit2:sta (ja siten Form2:sta) Unit1:ltä.
86-
87-Seuraavaksi muokataan OnClick-tapahtumaa, joka kuuluu Form1:n painikkeelle:
100+Nyt voidaan kutsua Unit2:sta (ja siten Form2:sta) Unit1:ltä.
88101
89-``` pascal
102+Seuraavaksi muokataan OnClick-tapahtumaa, joka kuuluu Form1:n painikkeelle:
103+```
90104unit Unit1;
91-...
92-procedure TForm1.Button1Click(Sender: TObject);
93-begin
94- Form2.ShowModal; //Näytetään Form2 ja fokus asetetaan Form2:lle.
95-end;
105+ ...
106+ procedure TForm1.Button1Click(Sender: TObject);
107+ begin
108+ Form2.ShowModal; //Näytetään Form2 ja fokus asetetaan Form2:lle.
109+ end;
96110```
97-
98-``` pascal
111+```
99112unit Unit2;
100-...
101-procedure TForm2.Button1Click(Sender: TObject);
102-begin
103- Close; //Suljetaan Form2.
104-end;
113+ ...
114+ procedure TForm2.Button1Click(Sender: TObject);
115+ begin
116+ Close; //Suljetaan Form2.
117+ end;
105118```
106119
107-Nyt voidaan käynnistää projekti (![](/wiki-images/b/b8/Start.png) tai `F9`) ja avata Form2 klikkaamalla Form1-painiketta.
120+Nyt voidaan käynnistää projekti ([![Start.png](/wiki-images/b/b8/Start.png)](</File:Start.png>) tai `F9`) ja avata Form2 klikkaamalla Form1-painiketta.
108121
109122### Show ja ShowModal-erot
110123
111-Molemmat menetelmät *Show* ja *ShowModal* tekevät lomakkeen näkyväksi. Nähdäksesi eron *Show*- ja *ShowModal*:n välillä:
124+Molemmat menetelmät _Show_ ja _ShowModal_ tekevät lomakkeen näkyväksi. Nähdäksesi eron _Show_ \- ja _ShowModal_ :n välillä:
112125
113-- Laajenna edellisen esimerkin [[Form Tutorial/fi|Kahden lomakkeen käyttö]] lisäämällä toinen TButton *Form1*:een.
114-- Valitse *Button1* ja muuta ominaisuuksien *Name* arvoon *btnShow* ja Caption arvoon *Show*.
115-- Valitse *Button2* ja muuta ominaisuudet *Name* arvoon *btnShowModal* ja Caption arvoon *ShowModal*.
116-- Luo (tai muokkaa) kahden painikkeen *OnClick*-tapahtumakäsittelijää seuraavasti:
126+ * Laajenna edellisen esimerkin [[Form Tutorial/fi|Kahden lomakkeen käyttö]] lisäämällä toinen TButton _Form1_ :een.
127+ * Valitse _Button1_ ja muuta ominaisuuksien _Name_ arvoon _btnShow_ ja Caption arvoon _Show_.
128+ * Valitse _Button2_ ja muuta ominaisuudet _Name_ arvoon _btnShowModal_ ja Caption arvoon _ShowModal_.
129+ * Luo (tai muokkaa) kahden painikkeen _OnClick_ -tapahtumakäsittelijää seuraavasti:
117130
118-``` pascal
131+```
119132procedure TForm1.btnShowClick(Sender: TObject);
120-begin
121- Form2.Show;
122- ShowMessage('Form2 is opened!');
123-end;
124-
125-procedure TForm1.btnShowModalClick(Sender: TObject);
126-begin
127- Form2.ShowModal;
128- ShowMessage('Form2 is opened and closed again!');
129-end;
133+ begin
134+ Form2.Show;
135+ ShowMessage('Form2 is opened!');
136+ end;
137+
138+ procedure TForm1.btnShowModalClick(Sender: TObject);
139+ begin
140+ Form2.ShowModal;
141+ ShowMessage('Form2 is opened and closed again!');
142+ end;
130143```
131144
132-Käynnistä ohjelma ja katso eroa!
133-
134-Show
145+Käynnistä ohjelma ja katso eroa!
135146
136-Tä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).
147+Show
148+
137149
138-**`<myForm>.Show;`**: n käyttämisen sijaan on mahdollista käyttää **`<myForm>.Visible:=True;`**. Metodi *Show* tekee seuraavaa:
150+Tä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).
139151
140-``` pascal
152+**`<myForm>.Show;`**: n käyttämisen sijaan on mahdollista käyttää **`<myForm>.Visible:=True;`**. Metodi _Show_ tekee seuraavaa:
153+```
141154procedure TCustomForm.Show;
142-begin
143- Visible := True;
144- BringToFront;
145-end;
155+ begin
156+ Visible := True;
157+ BringToFront;
158+ end;
146159```
147160
148-Ainoa 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ä.
161+Ainoa 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ä.
149162
150-ShowModal
163+ShowModal
164+
151165
152-ShowModal 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.
166+ShowModal 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.
153167
154-ShowModal on funktio, joka palauttaa kokonaisluvun, katso [[doc:lcl/forms/tmodalresult.html|TModalResult]]. Palautettu arvo sallii haarautumisen sen mukaan, miten lomake suljettiin.
168+ShowModal on funktio, joka palauttaa kokonaisluvun, katso [TModalResult](<http://lazarus-ccr.sourceforge.net/docs/lcl/forms/tmodalresult.html> "doc:lcl/forms/tmodalresult.html"). Palautettu arvo sallii haarautumisen sen mukaan, miten lomake suljettiin.
155169
156170## Kaksi lomaketta, jotka voivat kutsua toisiaan
157171
158-Yleensä 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ää.
159-
160-Jotta 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ää.
172+Yleensä 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ää.
161173
162-Jos 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".
174+Jotta 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ää.
163175
164-Jos muokataan edellistä esimerkkiä niin poistetaan "Unit2" Unit1:n uses-lausekkeesta.
176+Jos 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".
165177
166-Lisä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:
178+Jos muokataan edellistä esimerkkiä niin poistetaan "Unit2" Unit1:n uses-lausekkeesta.
167179
168-``` pascal
180+Lisä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:
181+```
169182unit Unit1;
170-...
171-implementation
172-
173-uses
174- Unit2;
175-...
183+ ...
184+ implementation
185+
186+ uses
187+ Unit2;
188+ ...
176189```
177-
178-``` pascal
190+```
179191unit Unit2;
180-...
181-implementation
182-
183-uses
184- Unit1;
185-...
192+ ...
193+ implementation
194+
195+ uses
196+ Unit1;
197+ ...
186198```
187199
188-Sitten muutetaan OnClick-tapahtumien takana olevaa koodia painikkeiden tapahtuman käsittelijässä:
189-
190-``` pascal
200+Sitten muutetaan OnClick-tapahtumien takana olevaa koodia painikkeiden tapahtuman käsittelijässä:
201+```
191202unit Unit1;
192-...
193-procedure TForm1.Button1Click(Sender: TObject);
194-begin
195- Form2.Show;
196-end;
203+ ...
204+ procedure TForm1.Button1Click(Sender: TObject);
205+ begin
206+ Form2.Show;
207+ end;
197208```
198-
199-``` pascal
209+```
200210unit Unit2;
201-...
202-procedure TForm2.Button1Click(Sender: TObject);
203-begin
204- Form1.Show;
205-end;
211+ ...
212+ procedure TForm2.Button1Click(Sender: TObject);
213+ begin
214+ Form1.Show;
215+ end;
206216```
207217
208218## Muuttujien siirtäminen muihin lomakkeisiin
209219
210-Edellä 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.
220+Edellä 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]] [luokassa](</index.php?title=Class/fi&action=edit&redlink=1> "Class/fi \(page does not exist\)") tai vaihtoehtoisesti muuttujana luokassa.
211221
212-Seuraavassa 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:
222+Seuraavassa 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:
213223
214-- Tehdään uusi projekti, jossa on kaksi lomaketta, jokainen painike sen päällä ja niiden OnClick-tapahtumat arvioida.
215-- 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:
224+ * Tehdään uusi projekti, jossa on kaksi lomaketta, jokainen painike sen päällä ja niiden OnClick-tapahtumat arvioida.
225+ * 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:
216226
217-``` pascal
227+```
218228unit Unit2;
219-...
220- TForm2 = class(TForm)
221- Button1: TButton;
222- procedure Button1Click(Sender: TObject);
223- private
224- { private declarations }
225- public
226- { public declarations }
227- const Count: Integer = 0; //Tässä
228- end;
229+ ...
230+ TForm2 = class(TForm)
231+ Button1: TButton;
232+ procedure Button1Click(Sender: TObject);
233+ private
234+ { private declarations }
235+ public
236+ { public declarations }
237+ const Count: Integer = 0; //Tässä
238+ end;
229239```
230240
231-- nyt voidaan jopa mukauttaa painikkeen tapahtuman käsittelijää vastaavasti:
241+ * nyt voidaan jopa mukauttaa painikkeen tapahtuman käsittelijää vastaavasti:
232242
233-``` pascal
243+```
234244unit Unit1;
235-...
236-procedure TForm1.Button1Click(Sender: TObject);
237-begin
238- inc(Form2.Count); //Lisää laskuria yhdellä jokaiselle Form2-kutsulla
239- Form2.ShowModal;
240-end;
245+ ...
246+ procedure TForm1.Button1Click(Sender: TObject);
247+ begin
248+ inc(Form2.Count); //Lisää laskuria yhdellä jokaiselle Form2-kutsulla
249+ Form2.ShowModal;
250+ end;
241251```
242-
243-``` pascal
252+```
244253unit Unit2;
245-...
246-procedure TForm2.Button1Click(Sender: TObject);
247-begin
248- ShowMessage('Form2 would be displayed '+IntToStr(Count)+' times');
249-end;
254+ ...
255+ procedure TForm2.Button1Click(Sender: TObject);
256+ begin
257+ ShowMessage('Form2 would be displayed '+IntToStr(Count)+' times');
258+ end;
250259```
251260
252-Tällä tavoin voidaan käyttää Unit1:ssä kaikkia Unit2:n julkisia muuttujia / ominaisuuksia / funktioita / aliohjelmia (yleisiä metodeja).
261+Tällä tavoin voidaan käyttää Unit1:ssä kaikkia Unit2:n julkisia muuttujia / ominaisuuksia / funktioita / aliohjelmia (yleisiä metodeja).
253262
254263## Muut lomakkeeseen liittyvät aiheet
255264
256265### Käytä toista lomaketta päälomakkeena
257266
258-Jos 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:
259-
260-![](/wiki-images/7/76/Projekteinstellungen_Formulare.png)
267+Jos 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:
261268
262-Vaihtoehtoisesti 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ä:
269+[![Projekteinstellungen Formulare.png](/wiki-images/7/76/Projekteinstellungen_Formulare.png)](</File:Projekteinstellungen_Formulare.png>)
263270
264-``` pascal
271+Vaihtoehtoisesti 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ä:
272+```
265273program Project1;
266-...
267- Application.CreateForm(TForm2, Form2); //Form2 luotiin ekana ja näytetään kun sovellus käynnistyy
268- Application.CreateForm(TForm1, Form1);
274+ ...
275+ Application.CreateForm(TForm2, Form2); //Form2 luotiin ekana ja näytetään kun sovellus käynnistyy
276+ Application.CreateForm(TForm1, Form1);
269277```
270278
271279### Tallenna lomakkeen ominaisuudet ohjelman lopussa
272280
273-- [[Remember form position and size|Remember form position and size#Using_TForm.SessionProperties and TXMLPropStorage]]
281+ * [[Remember form position and size|Remember form position and size#Using_TForm.SessionProperties and TXMLPropStorage]]
274282
275283## Luo lomake dynaamisesti
276284
277285### Luo Lazaruksessa suunniteltu lomake dynaamisesti
278286
279-Aina 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.
287+Aina 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.
280288
281-Esimerkki:
289+Esimerkki:
282290
283-- uusi sovellus, jossa on kaksi lomaketta, Form1:llä painike (lisää unit1 uses lausekkeeseen "Unit2")
284-- avaa Projekt.lpr (Projekti -\> Näytä projektin lähdekoodi).
285-- poista rivi "Application.CreateForm (TForm2, Form2)";
286-- Button1: n OnClick-tapahtuma, Form1 lisää seuraavaa koodia:
291+ * uusi sovellus, jossa on kaksi lomaketta, Form1:llä painike (lisää unit1 uses lausekkeeseen "Unit2")
292+ * avaa Projekt.lpr (Projekti -> Näytä projektin lähdekoodi).
293+ * poista rivi "Application.CreateForm (TForm2, Form2)";
294+ * Button1: n OnClick-tapahtuma, Form1 lisää seuraavaa koodia:
287295
288-``` pascal
296+```
289297procedure TForm1.Button1Click(Sender: TObject);
290-begin
291- Form2:=TForm2.Create(Nil); //Form2 luodaan
292- Form2.ShowModal; //Form2 näytetään
293- FreeAndNil(Form2); //tuhotaan Form2
294-end;
298+ begin
299+ Form2:=TForm2.Create(Nil); //Form2 luodaan
300+ Form2.ShowModal; //Form2 näytetään
301+ FreeAndNil(Form2); //tuhotaan Form2
302+ end;
295303```
296304
297-- nyt yksinkertaisesti suorita
305+ * nyt yksinkertaisesti suorita
298306
299307### Uuden lomakkeen luominen dynaamisesti
300308
301-Seuraava esimerkki osoittaa, miten uudet lomakkeet voidaan luoda koodilla ilman Form Designer -ohjelmaa.
309+Seuraava esimerkki osoittaa, miten uudet lomakkeet voidaan luoda koodilla ilman Form Designer -ohjelmaa.
302310
303-Tä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.
311+Tä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.
304312
305-- Luo uusi sovellus lomakkeella ja painikkeella
306-- Lisää Button1: n OnClick-tapahtumassa lomakkeessa 1 seuraava koodi:
313+ * Luo uusi sovellus lomakkeella ja painikkeella
314+ * Lisää Button1: n OnClick-tapahtumassa lomakkeessa 1 seuraava koodi:
307315
308-``` pascal
316+```
309317procedure TForm1.Button1Click(Sender: TObject);
310-var
311- MyForm: TForm;
312- MyButton: TButton;
313-begin
314- MyForm:=TForm.Create(nil);
315- MyForm.SetBounds(100, 100, 220, 150);
316- MyForm.Caption:='My dynamic created form';
317-
318- MyButton:=TButton.create(MyForm);
319- MyButton.Caption:='Close my form';
320- MyButton.SetBounds(10, 10, 200, 30);
321- MyButton.Parent:=MyForm;
322-
323- MyButton.OnClick:=@MyButtonClick;
324-
325- MyForm.ShowModal;
326-
327- FreeAndNil(MyForm);
328-end;
318+ var
319+ MyForm: TForm;
320+ MyButton: TButton;
321+ begin
322+ MyForm:=TForm.Create(nil);
323+ MyForm.SetBounds(100, 100, 220, 150);
324+ MyForm.Caption:='My dynamic created form';
325+
326+ MyButton:=TButton.create(MyForm);
327+ MyButton.Caption:='Close my form';
328+ MyButton.SetBounds(10, 10, 200, 30);
329+ MyButton.Parent:=MyForm;
330+
331+ MyButton.OnClick:=@MyButtonClick;
332+
333+ MyForm.ShowModal;
334+
335+ FreeAndNil(MyForm);
336+ end;
329337```
330338
331-> **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.
339+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Huomaa:** 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.
332340
333-- nyt on luotava MyButton.OnClick-tapahtuman käsittelijä. Tätä varten kirjoita luokan TForm1 yksityiseen (private) osioon seuraava aliohjelman määrittely:
341+ * nyt on luotava MyButton.OnClick-tapahtuman käsittelijä. Tätä varten kirjoita luokan TForm1 yksityiseen (private) osioon seuraava aliohjelman määrittely:
334342
335-``` pascal
343+```
336344TForm1 = class(TForm)
337-...
338-private
339- { private declarations }
340- procedure MyButtonClick(Sender: TObject);
345+ ...
346+ private
347+ { private declarations }
348+ procedure MyButtonClick(Sender: TObject);
341349```
342350
343-- Paina `Ctrl]`+`Shift`+`C` (code completion eli koodin täydentäminen) ja aseta seuraava koodi toteutukseen:
351+ * Paina `Ctrl]`+`⇧ Shift`+`C` (code completion eli koodin täydentäminen) ja aseta seuraava koodi toteutukseen:
344352
345-``` pascal
353+```
346354procedure TForm1.MyButtonClick(Sender: TObject);
347-begin
348- Showmessage('Attention, closing my dynamically created form!');
349- if Sender is TButton then
350- TForm(TButton(Sender).Parent).Close;
351-end;
355+ begin
356+ Showmessage('Attention, closing my dynamically created form!');
357+ if Sender is TButton then
358+ TForm(TButton(Sender).Parent).Close;
359+ end;
352360```
353361
354-- nyt projekti voidaan koota ja suorittaa
362+ * nyt projekti voidaan koota ja suorittaa
355363
364+
365+
356366## Katso myös
357367
358-- [[LCL Tips|Vinkkejä kontrollien manuaaliseen generointiin]]
359-- [[LCL Tips|Esimerkki luoda täydellinen GUI-sovellus koodin mukaan]]
360-- [[Testing, if form exists|Testi onko lomake jo olemassa]]
361-- [[Canvas draw vertical line on form/de|piirtää pystysuoran viivan lomakkeelle]]
362-- [[Drawing with canvas|Piirretään lomakkeelle]]
363-- [[user should not be able to close form|Käyttäjän ei pitäisi pystyä sulkemaan lomaketta]]
364-- [[LCL Tips|Luodaan ei-suorakulmainen ikkuna tai kontrolli]]
365-- [[Remember form position and size|Muistetaan lomakkeen sijainti ja koko]]
368+ * [[LCL Tips|Vinkkejä kontrollien manuaaliseen generointiin]]
369+ * [[LCL Tips|Esimerkki luoda täydellinen GUI-sovellus koodin mukaan]]
370+ * [[Testing, if form exists|Testi onko lomake jo olemassa]]
371+ * [[Canvas draw vertical line on form/de|piirtää pystysuoran viivan lomakkeelle]]
372+ * [[Drawing with canvas|Piirretään lomakkeelle]]
373+ * [[user should not be able to close form|Käyttäjän ei pitäisi pystyä sulkemaan lomaketta]]
374+ * [[LCL Tips|Luodaan ei-suorakulmainen ikkuna tai kontrolli]]
375+ * [[Remember form position and size|Muistetaan lomakkeen sijainti ja koko]]
366376
367377---
368-*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).*
378+*From the Free Pascal wiki, page "Form Tutorial/fi", as the Internet Archive kept it on 2025-01-17, last changed on 2020-02-16. 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