Form Tutorial/fi: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Form Tutorial/fi
| Old | New | Line | |
|---|---|---|---|
| 1 | + | Lyhyt esittely lomakkeiden käytöstä Lazaruksessa. | |
| 2 | + | ||
| 3 | + | ## Mikä on lomake? | |
| 4 | + | ||
| 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. | |
| 6 | + | ||
| 7 | + | ## Ensimmäinen GUI-sovellus | |
| 8 | + | ||
| 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. | |
| 10 | + | ||
| 11 | + | Näin luotiin uusi, täysin toimiva lomake projekti: | |
| 12 | + | ||
| 13 | + | <figure> | |
| 14 | + | <img src="Form1_Designmodus.png" title="Form1_Designmodus.png" /> | |
| 15 | + | <figcaption>Form1_Designmodus.png</figcaption> | |
| 16 | + | </figure> | |
| 17 | + | ||
| 18 | + | Uusi projekti voidaan käynnistää painamalla <span class="kbd">F9</span>-näppäintä tai klikkaamalla hiirellä päävalikon kuvaketta  (tai valitaan päävalikosta: Suorita -\> Suorita). Projekti kootaan ja suoritetaan. | |
| 19 | + | ||
| 20 | + | 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):\ | |
| 21 | + |  -\>  | |
| 22 | + | ||
| 23 | + | Seuraavaksi voidaan asettaa [[TButton/fi|TButtonin]] lomakkeelle. Tätä käytetään myöhemmin mahdollistamaan toisen lomakkeen avaaminen: | |
| 24 | + | ||
| 25 | + | Valitaan TButton [[Component Palette/fi|komponenttipaletin]] [[Standard tab/fi|Standard]]-välilehdeltä. | |
| 26 | + | ||
| 27 | + | <figure> | |
| 28 | + | <img src="TButtonStandardpalette.png" title="TButtonStandardpalette.png" /> | |
| 29 | + | <figcaption>TButtonStandardpalette.png</figcaption> | |
| 30 | + | </figure> | |
| 31 | + | ||
| 32 | + | ja klikataan lomaketta: Nyt siinä on painike, joka on sijoitettu Form1: een, jonka nimi ja kuvateksti on "Button1". | |
| 33 | + | ||
| 34 | + | 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: | |
| 35 | + | ||
| 36 | + | <figure> | |
| 37 | + | <img src="NeuesProjekt2.png" title="NeuesProjekt2.png" /> | |
| 38 | + | <figcaption>NeuesProjekt2.png</figcaption> | |
| 39 | + | </figure> | |
| 40 | + | ||
| 41 | + | 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: | |
| 42 | + | ||
| 43 | + | ``` pascal | |
| 44 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 45 | + | begin | |
| 46 | + | Caption:='My first Form'; //Lomakkeen Form1 otsikko muuttuu | |
| 47 | + | //or | |
| 48 | + | Button1.Caption:='Hello'; //Painikkeen teksti muuttuu | |
| 49 | + | end; | |
| 50 | + | ``` | |
| 51 | + | ||
| 52 | + | Suorita lomake nyt painamalla <span class="kbd">F9</span> ja huomaa, että kun painiketta klikataan niin lomakkeen otsikko ja painikkeen otsikko muuttuvat. | |
| 53 | + | ||
| 54 | + | Nyt voidaan kokeilla hieman ja oppia käyttämään standardikomponentteja. Alussa suosittellaan kokeilemaan seuraavia komponentteja: | |
| 55 | + | ||
| 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> | |
| 130 | + | ||
| 131 | + | Lisää muita hyödyllisiä tietoja on [[Lazarus Tutorial/fi|Lazarus Tutorial opetussivulla]]. | |
| 132 | + | ||
| 133 | + | ## Kahden lomakkeen käyttö | |
| 134 | + | ||
| 135 | + | 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. | |
| 136 | + | ||
| 137 | + | 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. | |
| 138 | + | ||
| 139 | + | 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.\ | |
| 140 | + | 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". | |
| 141 | + | ||
| 142 | + | <figure> | |
| 143 | + | <img src="Objektinspektor.png" title="Objektinspektor.png" /> | |
| 144 | + | <figcaption>Objektinspektor.png</figcaption> | |
| 145 | + | </figure> | |
| 146 | + | ||
| 147 | + | 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"). | |
| 148 | + | ||
| 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. | |
| 150 | + | ||
| 151 | + | 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 : | |
| 152 | + | ||
| 153 | + | ``` pascal | |
| 154 | + | uses | |
| 155 | + | Classes, SysUtils, ... , Unit2; // On tärkeää, että yksittäiset käännösyksiköt erotetaan pilkulla | |
| 156 | + | // ja lauseke päättyy puolipisteeseen. | |
| 157 | + | ``` | |
| 158 | + | ||
| 159 | + | Nyt voidaan kutsua Unit2:sta (ja siten Form2:sta) Unit1:ltä. | |
| 160 | + | ||
| 161 | + | Seuraavaksi muokataan OnClick-tapahtumaa, joka kuuluu Form1:n painikkeelle: | |
| 162 | + | ||
| 163 | + | ``` pascal | |
| 164 | + | unit Unit1; | |
| 165 | + | ... | |
| 166 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 167 | + | begin | |
| 168 | + | Form2.ShowModal; //Näytetään Form2 ja fokus asetetaan Form2:lle. | |
| 169 | + | end; | |
| 170 | + | ``` | |
| 171 | + | ||
| 172 | + | ``` pascal | |
| 173 | + | unit Unit2; | |
| 174 | + | ... | |
| 175 | + | procedure TForm2.Button1Click(Sender: TObject); | |
| 176 | + | begin | |
| 177 | + | Close; //Suljetaan Form2. | |
| 178 | + | end; | |
| 179 | + | ``` | |
| 180 | + | ||
| 181 | + | Nyt voidaan käynnistää projekti ( tai <span class="kbd">F9</span>) ja avata Form2 klikkaamalla Form1-painiketta. | |
| 182 | + | ||
| 183 | + | ### Show ja ShowModal-erot | |
| 184 | + | ||
| 185 | + | Molemmat menetelmät *Show* ja *ShowModal* tekevät lomakkeen näkyväksi. Nähdäksesi eron *Show*- ja *ShowModal*:n välillä: | |
| 186 | + | ||
| 187 | + | - Laajenna edellisen esimerkin [[Form Tutorial/fi|Kahden lomakkeen käyttö]] lisäämällä toinen TButton *Form1*:een. | |
| 188 | + | - Valitse *Button1* ja muuta ominaisuuksien *Name* arvoon *btnShow* ja Caption arvoon *Show*. | |
| 189 | + | - Valitse *Button2* ja muuta ominaisuudet *Name* arvoon *btnShowModal* ja Caption arvoon *ShowModal*. | |
| 190 | + | - Luo (tai muokkaa) kahden painikkeen *OnClick*-tapahtumakäsittelijää seuraavasti: | |
| 191 | + | ||
| 192 | + | ``` pascal | |
| 193 | + | procedure TForm1.btnShowClick(Sender: TObject); | |
| 194 | + | begin | |
| 195 | + | Form2.Show; | |
| 196 | + | ShowMessage('Form2 is opened!'); | |
| 197 | + | end; | |
| 198 | + | ||
| 199 | + | procedure TForm1.btnShowModalClick(Sender: TObject); | |
| 200 | + | begin | |
| 201 | + | Form2.ShowModal; | |
| 202 | + | ShowMessage('Form2 is opened and closed again!'); | |
| 203 | + | end; | |
| 204 | + | ``` | |
| 205 | + | ||
| 206 | + | Käynnistä ohjelma ja katso eroa! | |
| 207 | + | ||
| 208 | + | Show | |
| 209 | + | ||
| 210 | + | 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). | |
| 211 | + | ||
| 212 | + | **`<myForm>.Show;`**: n käyttämisen sijaan on mahdollista käyttää **`<myForm>.Visible:=True;`**. Metodi *Show* tekee seuraavaa: | |
| 213 | + | ||
| 214 | + | ``` pascal | |
| 215 | + | procedure TCustomForm.Show; | |
| 216 | + | begin | |
| 217 | + | Visible := True; | |
| 218 | + | BringToFront; | |
| 219 | + | end; | |
| 220 | + | ``` | |
| 221 | + | ||
| 222 | + | 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ä. | |
| 223 | + | ||
| 224 | + | ShowModal | |
| 225 | + | ||
| 226 | + | 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. | |
| 227 | + | ||
| 228 | + | ShowModal on funktio, joka palauttaa kokonaisluvun, katso [[doc:lcl/forms/tmodalresult.html|TModalResult]]. Palautettu arvo sallii haarautumisen sen mukaan, miten lomake suljettiin. | |
| 229 | + | ||
| 230 | + | ## Kaksi lomaketta, jotka voivat kutsua toisiaan | |
| 231 | + | ||
| 232 | + | 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ää. | |
| 233 | + | ||
| 234 | + | 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ää. | |
| 235 | + | ||
| 236 | + | 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". | |
| 237 | + | ||
| 238 | + | Jos muokataan edellistä esimerkkiä niin poistetaan "Unit2" Unit1:n uses-lausekkeesta. | |
| 239 | + | ||
| 240 | + | 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: | |
| 241 | + | ||
| 242 | + | ``` pascal | |
| 243 | + | unit Unit1; | |
| 244 | + | ... | |
| 245 | + | implementation | |
| 246 | + | ||
| 247 | + | uses | |
| 248 | + | Unit2; | |
| 249 | + | ... | |
| 250 | + | ``` | |
| 251 | + | ||
| 252 | + | ``` pascal | |
| 253 | + | unit Unit2; | |
| 254 | + | ... | |
| 255 | + | implementation | |
| 256 | + | ||
| 257 | + | uses | |
| 258 | + | Unit1; | |
| 259 | + | ... | |
| 260 | + | ``` | |
| 261 | + | ||
| 262 | + | Sitten muutetaan OnClick-tapahtumien takana olevaa koodia painikkeiden tapahtuman käsittelijässä: | |
| 263 | + | ||
| 264 | + | ``` pascal | |
| 265 | + | unit Unit1; | |
| 266 | + | ... | |
| 267 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 268 | + | begin | |
| 269 | + | Form2.Show; | |
| 270 | + | end; | |
| 271 | + | ``` | |
| 272 | + | ||
| 273 | + | ``` pascal | |
| 274 | + | unit Unit2; | |
| 275 | + | ... | |
| 276 | + | procedure TForm2.Button1Click(Sender: TObject); | |
| 277 | + | begin | |
| 278 | + | Form1.Show; | |
| 279 | + | end; | |
| 280 | + | ``` | |
| 281 | + | ||
| 282 | + | ## Muuttujien siirtäminen muihin lomakkeisiin | |
| 283 | + | ||
| 284 | + | 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. | |
| 285 | + | ||
| 286 | + | 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: | |
| 287 | + | ||
| 288 | + | - Tehdään uusi projekti, jossa on kaksi lomaketta, jokainen painike sen päällä ja niiden OnClick-tapahtumat arvioida. | |
| 289 | + | - 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: | |
| 290 | + | ||
| 291 | + | ``` pascal | |
| 292 | + | unit Unit2; | |
| 293 | + | ... | |
| 294 | + | TForm2 = class(TForm) | |
| 295 | + | Button1: TButton; | |
| 296 | + | procedure Button1Click(Sender: TObject); | |
| 297 | + | private | |
| 298 | + | { private declarations } | |
| 299 | + | public | |
| 300 | + | { public declarations } | |
| 301 | + | const Count: Integer = 0; //Tässä | |
| 302 | + | end; | |
| 303 | + | ``` | |
| 304 | + | ||
| 305 | + | - nyt voidaan jopa mukauttaa painikkeen tapahtuman käsittelijää vastaavasti: | |
| 306 | + | ||
| 307 | + | ``` pascal | |
| 308 | + | unit Unit1; | |
| 309 | + | ... | |
| 310 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 311 | + | begin | |
| 312 | + | inc(Form2.Count); //Lisää laskuria yhdellä jokaiselle Form2-kutsulla | |
| 313 | + | Form2.ShowModal; | |
| 314 | + | end; | |
| 315 | + | ``` | |
| 316 | + | ||
| 317 | + | ``` pascal | |
| 318 | + | unit Unit2; | |
| 319 | + | ... | |
| 320 | + | procedure TForm2.Button1Click(Sender: TObject); | |
| 321 | + | begin | |
| 322 | + | ShowMessage('Form2 would be displayed '+IntToStr(Count)+' times'); | |
| 323 | + | end; | |
| 324 | + | ``` | |
| 325 | + | ||
| 326 | + | Tällä tavoin voidaan käyttää Unit1:ssä kaikkia Unit2:n julkisia muuttujia / ominaisuuksia / funktioita / aliohjelmia (yleisiä metodeja). | |
| 327 | + | ||
| 328 | + | ## Muut lomakkeeseen liittyvät aiheet | |
| 329 | + | ||
| 330 | + | ### Käytä toista lomaketta päälomakkeena | |
| 331 | + | ||
| 332 | + | 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: | |
| 333 | + | ||
| 334 | + | <figure> | |
| 335 | + | <img src="Projekteinstellungen_Formulare.png" title="Projekteinstellungen_Formulare.png" /> | |
| 336 | + | <figcaption>Projekteinstellungen_Formulare.png</figcaption> | |
| 337 | + | </figure> | |
| 338 | + | ||
| 339 | + | 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ä: | |
| 340 | + | ||
| 341 | + | ``` pascal | |
| 342 | + | program Project1; | |
| 343 | + | ... | |
| 344 | + | Application.CreateForm(TForm2, Form2); //Form2 luotiin ekana ja näytetään kun sovellus käynnistyy | |
| 345 | + | Application.CreateForm(TForm1, Form1); | |
| 346 | + | ``` | |
| 347 | + | ||
| 348 | + | ### Tallenna lomakkeen ominaisuudet ohjelman lopussa | |
| 349 | + | ||
| 350 | + | - [[Remember form position and size|Remember form position and size#Using_TForm.SessionProperties and TXMLPropStorage]] | |
| 351 | + | ||
| 352 | + | ## Luo lomake dynaamisesti | |
| 353 | + | ||
| 354 | + | ### Luo Lazaruksessa suunniteltu lomake dynaamisesti | |
| 355 | + | ||
| 356 | + | 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. | |
| 357 | + | ||
| 358 | + | Esimerkki: | |
| 359 | + | ||
| 360 | + | - uusi sovellus, jossa on kaksi lomaketta, Form1:llä painike (lisää unit1 uses lausekkeeseen "Unit2") | |
| 361 | + | - avaa Projekt.lpr (Projekti -\> Näytä projektin lähdekoodi). | |
| 362 | + | - poista rivi "Application.CreateForm (TForm2, Form2)"; | |
| 363 | + | - Button1: n OnClick-tapahtuma, Form1 lisää seuraavaa koodia: | |
| 364 | + | ||
| 365 | + | ``` pascal | |
| 366 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 367 | + | begin | |
| 368 | + | Form2:=TForm2.Create(Nil); //Form2 luodaan | |
| 369 | + | Form2.ShowModal; //Form2 näytetään | |
| 370 | + | FreeAndNil(Form2); //tuhotaan Form2 | |
| 371 | + | end; | |
| 372 | + | ``` | |
| 373 | + | ||
| 374 | + | - nyt yksinkertaisesti suorita | |
| 375 | + | ||
| 376 | + | ### Uuden lomakkeen luominen dynaamisesti | |
| 377 | + | ||
| 378 | + | Seuraava esimerkki osoittaa, miten uudet lomakkeet voidaan luoda koodilla ilman Form Designer -ohjelmaa. | |
| 379 | + | ||
| 380 | + | 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. | |
| 381 | + | ||
| 382 | + | - Luo uusi sovellus lomakkeella ja painikkeella | |
| 383 | + | - Lisää Button1: n OnClick-tapahtumassa lomakkeessa 1 seuraava koodi: | |
| 384 | + | ||
| 385 | + | ``` pascal | |
| 386 | + | procedure TForm1.Button1Click(Sender: TObject); | |
| 387 | + | var | |
| 388 | + | MyForm: TForm; | |
| 389 | + | MyButton: TButton; | |
| 390 | + | begin | |
| 391 | + | MyForm:=TForm.Create(nil); | |
| 392 | + | MyForm.SetBounds(100, 100, 220, 150); | |
| 393 | + | MyForm.Caption:='My dynamic created form'; | |
| 394 | + | ||
| 395 | + | MyButton:=TButton.create(MyForm); | |
| 396 | + | MyButton.Caption:='Close my form'; | |
| 397 | + | MyButton.SetBounds(10, 10, 200, 30); | |
| 398 | + | MyButton.Parent:=MyForm; | |
| 399 | + | ||
| 400 | + | MyButton.OnClick:=@MyButtonClick; | |
| 401 | + | ||
| 402 | + | MyForm.ShowModal; | |
| 403 | + | ||
| 404 | + | FreeAndNil(MyForm); | |
| 405 | + | end; | |
| 406 | + | ``` | |
| 407 | + | ||
| 408 | + | > **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. | |
| 409 | + | ||
| 410 | + | - nyt on luotava MyButton.OnClick-tapahtuman käsittelijä. Tätä varten kirjoita luokan TForm1 yksityiseen (private) osioon seuraava aliohjelman määrittely: | |
| 411 | + | ||
| 412 | + | ``` pascal | |
| 413 | + | TForm1 = class(TForm) | |
| 414 | + | ... | |
| 415 | + | private | |
| 416 | + | { private declarations } | |
| 417 | + | procedure MyButtonClick(Sender: TObject); | |
| 418 | + | ``` | |
| 419 | + | ||
| 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: | |
| 421 | + | ||
| 422 | + | ``` pascal | |
| 423 | + | procedure TForm1.MyButtonClick(Sender: TObject); | |
| 424 | + | begin | |
| 425 | + | Showmessage('Attention, closing my dynamically created form!'); | |
| 426 | + | if Sender is TButton then | |
| 427 | + | TForm(TButton(Sender).Parent).Close; | |
| 428 | + | end; | |
| 429 | + | ``` | |
| 430 | + | ||
| 431 | + | - nyt projekti voidaan koota ja suorittaa | |
| 432 | + | ||
| 433 | + | ## Katso myös | |
| 434 | + | ||
| 435 | + | - [[LCL Tips|Vinkkejä kontrollien manuaaliseen generointiin]] | |
| 436 | + | - [[LCL Tips|Esimerkki luoda täydellinen GUI-sovellus koodin mukaan]] | |
| 437 | + | - [[Testing, if form exists|Testi onko lomake jo olemassa]] | |
| 438 | + | - [[Canvas draw vertical line on form/de|piirtää pystysuoran viivan lomakkeelle]] | |
| 439 | + | - [[Drawing with canvas|Piirretään lomakkeelle]] | |
| 440 | + | - [[user should not be able to close form|Käyttäjän ei pitäisi pystyä sulkemaan lomaketta]] | |
| 441 | + | - [[LCL Tips|Luodaan ei-suorakulmainen ikkuna tai kontrolli]] | |
| 442 | + | - [[Remember form position and size|Muistetaan lomakkeen sijainti ja koko]] | |
| 443 | + | ||
| 444 | + | --- | |
| 445 | + | *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).* |
