Howdy World (Hello World on steroids)/fi: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | Tämä Wikisivu on Lazarus ohjelmoinnin perusopastusta. Tässä selitetään ensimmäisiä askeleita miten saada toimiva ohjelmisto ja joitakin hyviä käytäntöjä selitetään myös matkan varrella. Lopputulos on (toivottavasti)kaksitahoinen: lukija ymmärtää peruskäsitteet miten rakentaa ohjelmisto Lazaruksella ja hän saa todellisen palan toimivaa ohjelmistoa, joka voidaan sisällyttää muihin ohjelmiin: laskimen. Laskin on melko helppo toteuttaa ja jokainen ymmärtää sen käsitteitä. Joten sitä ei tarvitse kuvata "liiketaloudellisesti" etukäteen. Laskin on rajoitettu vain kokonaisluku laskelmiin, mutta voidaan helposti laajentaa. Tämä opetusohjelma ei kuvaa Lazaruksen asennusta. Vaan oletetaan, että Lasarus on asennettu ja käyttövalmis (mieluiten viimeinen vakaa versio). Tämä opetusohjelma on enemmän tai vähemmän alustasta riippumaton. Kaikki kuvakaappauksia tehtiin Windows XP PC; joten sininen / punainen / harmahtava väritys. | |
| 2 | 2 | ||
| 3 | 3 | Suositeltavaa luettavaa ennen tätä: [[Lazarus Tutorial/fi|Kattava Lazaruksen käyttöönotto]]. | |
| 4 | 4 | ||
| 5 | 5 | ## Aloitus | |
| 6 | 6 | ||
| 7 | 7 | On parasta luoda erillinen hakemisto/kansio jokaista uutta projektia varten. Joten ennen kuin tartutaan varsinaisiin "puikkoihin" niin luodaa hakemisto johon tallennetaan tämä laskin projekti (tehdään tämä käyttöjärjestelmän avulla). Tämä hakemisto on juuri kaikille projektiin luoduille tiedostoille. | |
| 8 | 8 | ||
| 9 | 9 | - Luo uusi hakemisto tälle demo projektille (kutsutaan sitä \$HOME/CalculatorDemo). | |
| 10 | 10 | ||
| 11 | 11 | (*Teksti, joka kuvaa toimia, jotka täytyy suorittaa on merkitty luettelomerkeillä kuten edellinen rivi.*) | |
| 12 | 12 | ||
| 13 | 13 | On siis aika aloittaa uusi Lazarus projekti. | |
| 14 | 14 | ||
| 15 | 15 | - Käynnistä Lazarus. | |
| 16 | 16 | - Valitse valikosta: Projekti / Uusi projekti... | |
| 17 | 17 | - Valintaikkun, joka näytetään valitse siinä: Sovellus ja paina OK (jos kehitysympäristö valittaa tallentamattomia muutoksia, paina ei). | |
| 18 | 18 | ||
| 19 | 19 | Voit varmistaa, että kaikki tiedostot uudessa projektissa päätyvät oikeaan hakemistoon on projekti tallennettava ensin. | |
| 20 | 20 | ||
| 21 | 21 | - Valitse valikosta Tiedosto/Tallenna kaikki. | |
| 22 | 22 | - Valitse hakemisto, joka luotiin aiemmin (\$ HOME / CalculatorDemo). | |
| 23 | 23 | - Anna projektille uusi nimi: CalculatorDemo | |
| 24 | 24 | - Paina tallenna | |
| 25 | 25 | - Kehitysympäristö haluaa tallentaa päälomakkeen samalla kertaa: kirjoita "ufrmMain''. se on lomakkeen ja käännösyksikön nimi. | |
| 26 | 26 | - Kehitysympäristö kysyy että tiedoston tulisi muuttaa pienillä kirjaimilla kirjoitetuksi. Vahvista tämä painamalla näppäintä "Nimeä pienillä kirjaimilla". | |
| 27 | 27 | ||
| 28 | 28 | Teoriassa ohjelma, joka on täten luotu on pala toimivaa ohjelmistoa, joka voidaan suorittaa. Ennen kokoamisen ensimmäistä kertaa, kaksi muutosta suositellaan: osoitetaan uusia paikkoja (hakemistoja) varten kootuille käännösyksiköille ja kohdetiedostolle. | |
| 29 | 29 | ||
| 30 | 30 | - Valitse valikosta: Projekti / Projektikohtaiset asetukset ... | |
| 31 | 31 | - Valitse kääntäjän asetukset / Hakupolut (klikkaa solmun puunäkymää) | |
| 32 | 32 | - Kirjoita teksti *bin\* ennen kohdetiedostonimeä (tai *bin/* esim. unix/linux ympäristössä) | |
| 33 | 33 | - Huomaa myös *lib* etuliite käännöshakemisto kohdassa (älä muuta sitä). | |
| 34 | 34 | - Paina OK | |
| 35 | 35 | ||
| 36 | 36 | Alla oleva kuva näyttää miten tämä on Windows koneella. | |
| 37 | 37 | ||
| 38 | - | ||
| 39 | - | ||
| 40 | - | ||
| 41 | - | ||
| 38 | + |  | |
| 42 | 39 | ||
| 43 | 40 | Tekemällä näin projektikansio ei täyty tuotoksella, joka syntyy kääntämisessä. Projektikansion tiedostot vaaditaan kun (uudelleen) kootaan ohjelma. Kaikki se mitä on *lib* ja *bin* hakemistoissa voidaan poistaa kun projekti arkistoidaan. | |
| 44 | 41 | ||
| 45 | 42 | Nyt ensimmäisenä testinä projekti voidaan koota ja ajaa. | |
| 46 | 43 | ||
| 47 | - | ||
| 44 | + | - Paina `F9` (pikanäppäin joka kokooaa, rakentaa ja suorittaa ohjelman) | |
| 48 | 45 | ||
| 49 | 46 | Jos kaikki meni hyvin niin nähdään tyhjä ikkuna. Nyt tiedetään että ollaan luotu vankka perusta johon voidaan alkaa rakentaa ohjelmaa. | |
| 50 | 47 | ||
| 51 | 48 | - Lopeta käynnissä oleva ohjelma klikkaamalla sulje kuvaketta (käyttöjärjestelmä riippuvainen piirre). | |
| 52 | 49 | ||
| 53 | 50 | ## Ensimmäinen komponentti | |
| 54 | 51 | ||
| 55 | 52 | Lazaruksessa on [[Component Palette/fi|komponenttipaletti]]: | |
| 56 | 53 | ||
| 57 | - | ||
| 58 | - | ||
| 59 | - | ||
| 60 | - | ||
| 54 | + |  | |
| 61 | 55 | ||
| 62 | 56 | Kaikki komponentit, jotka ovat saatavilla rakentaessa käyttöliittymää on ryhmitelty loogisesti välilehtiin. Todellinen välilehtien määrä riippuu asennetuista paketeista. Mutta peruspaletti näyttää suunnilleen samanlaiselta mitä on kuvassa. Ensimmäinen välilehti on [[Standard tab/fi|Standard]], jonka jälkeen [[Additional tab/fi|Additional]], [[Common Controls tab/fi|Common]] jne. Komponentin [[Type/fi|tyypin]] nimi löytyy kun vie hiiren osoittimen komponentin kuvakkeen yläpuolelle jolloin vihjetekstinä näkyy tyypin nimi (tarkemmin sanottuna: näytetään minkä tyyppinen on komponentin [[Class/fi|luokka]]). Selitystä komponenteista löytyy myös mm [[Lazarus Tutorial/fi|Kattava Lazaruksen käyttöönotto]]. | |
| 63 | 57 | ||
| 64 | 58 | Ensimmäinen asia, joka tehdään laskinohjelmaan on luoda siihen näyttö, jossa syötetyt numerot ovat tai näytetään. Tähän käytetään [[TEdit]]-komponenttia tai Controls:ia. | |
| 65 | 59 | ||
| 66 | 60 | > **Note:** Joskus visuaalisia komponentteja kutsutaan myös Controls:ksi. "Komponentin (component)" ja "control" erolla ei nyt ole merkitystä. | |
| 67 | 61 | ||
| 68 | - | ||
| 62 | + | Jos halutaan sijoittaa komponentti lomakkeelle niin se on oltava valittuna. Painamalla `F12`-näppäintä se vaihtaa valituksi vuorotellen lomakkeen tai lähdekoodieditorin. | |
| 69 | 63 | ||
| 70 | - | ||
| 64 | + | - Paina `F12`- kerran tai kahdesti niin saadaan lomakkeen ikkunan päällimmäiseksi (katso kuva alla). | |
| 71 | 65 | ||
| 72 | - | ||
| 73 | - | ||
| 74 | - | ||
| 75 | - | ||
| 66 | + |  | |
| 76 | 67 | ||
| 77 | 68 | - Valitse Standard välilehti [[Component Palette/fi|komponenttipalettilta]]. Tämä on välilehti, joka on oletusarvoisesti valittuna. | |
| 78 | 69 | - Klikkaa [[TEdit/fi|TEdit]] komponenttia (Vinkki: viemällä kohdistin komponentin kuvakkeen päälle niin saadaan tieto luokan nimestä). | |
| 79 | 70 | - Klikkaa jossain keskellä lomaketta. Tämä asettaa TEdit komponentin lomakkeelle. Sen nimi on sama kuin komponentin tyyppi ilman aloittavaa "T"-kirjainta ja nimen loppuun liitetään (järjestys)numero (esim. Edit1). Jos toinen TEdit komponentti olisi tarkoitus sijoittaa lomakkeelle niin se olisi nimeltään Edit2. Ja niin edelleen. Tämä koskee kaikkia komponentteja. | |
| 80 | 71 | ||
| 81 | 72 | Nyt kun komponentti on sijoitettu lomakkeelle se voidaan räätälöidä tarpeisiimme. Tämä mukauttaminen tapahtuu komponenttimuokkaimessa. Se on ikkuna näytön vasemmalla puolella jossa on TEdit-komponentin ominaisuuksien luettelo jotka ovat muokattavissa. | |
| 82 | 73 | ||
| 83 | - | ||
| 84 | - | ||
| 85 | - | ||
| 86 | - | ||
| 74 | + |  | |
| 87 | 75 | ||
| 88 | - | ||
| 76 | + | [[Property/fi|Ominaisuudet]] määrittävät komponentin ulkoasua ja käyttäytymistä. Ominaisuuksia on helppo vaihtaa: klikkaa jotain niistä, syötä uusi arvo ja paina `Enter`. Vaikutukset komponenttiin ovat heti näkyvissä. Kaikki komponenttimuokkaimessa kerralla näytettävät ominaisuudet kuuluvat yhdelle komponentille. Se komponentti, joka on valittu voidaan tunnistaa pienistä mustista neliöistä lomakkeella. Neliöt ympäröivät komponenttia. Niin tapa muuttaa komponentin ominaisuuksia, on ensin valita se ja sitten tehdä muutoksia komponenttimuokaimella. Jos mitään komponenttia ei ole valittu niin lomakkeen ominaisuudet näkyvät. | |
| 89 | 77 | ||
| 90 | 78 | Tee seuraavat muutokset komponentin Edit1 ominaisuuksiin. | |
| 91 | 79 | ||
| 92 | 80 | - Vaihda Name-ominaisuuden tekstiksi *edDisplay*. | |
| 93 | 81 | - Muuta Align-ominaisuus arvoon *alTop* (muuta Align, ei Alignment!). | |
| 94 | 82 | - Muuta Alignment-ominaisuus arvoon *alRightJustify*. | |
| 95 | 83 | - Muuta BorderSpacing.Around arvoon *6*. | |
| 96 | 84 | - Vaihda Text-ominaisuus arvoon *0* (siis numero nolla, ei kirjain o). | |
| 97 | 85 | ||
| 98 | 86 | Nämä ominaisuudet ovat melko itsestään selviä. Varsinkin kun edellä olevia muutoksia tehdään ja niiden vaikutuksia seurataan lomakkeella. | |
| 99 | 87 | ||
| 100 | 88 | Viimeistely koskettaa myös käytettävää kirjaisinta (Font), jota käytetään näyttämään tekstejä kaikissa komponenteissa. Kirjaisin eli fontti voidaan muuttaa kahdessa paikassa: TEdit-tyyppisen edDisplay komponentin Font ominaisuudessa tai lomakkeen Font-ominaisuudessa. Muuttaminen lomakkeen Font-ominaisuudessa on se etu, että "kaikki" asetut komponentit lomakkeella tulee "perimään" tämän fontin. Nyt tehdään tälläinen muutos. | |
| 101 | 89 | ||
| 102 | 90 | - Klikkaa jossain keskellä lomaketta. Tämä peruuttaa edDisplay-komponentin valinnan ja valitsee itse lomakkeen. Lomakkeen ominaisuudet näkyvät nyt komponenttimuokkaimessa. | |
| 103 | 91 | ||
| 104 | - | ||
| 92 | + | Klikkaa komponenttimuokkaimessa Font-ominaisuutta. Font-rivi on nyt korostettu ja painike kolmella pisteellä `...` näkyy. | |
| 105 | 93 | ||
| 106 | 94 | - Klikkaa painiketta, jossa on kolme pistettä. Tämä avaa dialogin Fontti. | |
| 107 | 95 | - Valitse kirjaimeksi Verdana, Lihavoitu (Bold), koko 10. | |
| 108 | 96 | - Paina OK. | |
| 109 | 97 | ||
| 110 | 98 | Lomakkeen otsikko ei ole kovin mielekäs. Oletusteksti "Form1" näytetään. | |
| 111 | 99 | ||
| 112 | 100 | - Komponenttimuokaimessa klikkaa Caption-ominaisuutta. | |
| 113 | 101 | - Muuta Caption-ominaisuuden tekstiksi *Calculator Demo*. | |
| 114 | 102 | ||
| 115 | 103 | Kaikkien näiden toimien tuloksena on lomake, joka näyttää (suurinpiirtein) tältä:  | |
| 116 | 104 | ||
| 117 | 105 | Nyt on hyvä aika tallentaa tehty työ. | |
| 118 | 106 | ||
| 119 | - | ||
| 107 | + | - Valitaan valikosta Tiedosto / Tallenna tai paina näppäinyhdistelmää `Ctrl`+`S`. | |
| 120 | 108 | ||
| 121 | 109 | Muista tallentaa ja tallentaa usein! | |
| 122 | 110 | ||
| 123 | 111 | ## Painikkeet | |
| 124 | 112 | ||
| 125 | 113 | Mitä hyötyä on laskimesta, jos numeroita ei voida syöttää? Niin seuraava askel on lisätä painikkeet numeroille 0..9. Ennen kuin laitetaan numeropainikkeita niin ns säiliö/kontti (container) sijoitetaan lomakkeelle. Säiliö rajaa alueen lomakkeelle johon komponentit voidaan ryhmitellä. Lomake on säiliö. [[TPanel/fi|TPanel]] on toinen säiliö, joka voidaan sijoittaa lomakkeelle. Säiliöihin voidaan sijoittaa sisällä sijaitsevia säiliöitä, mutta siitä lisää jossain toisessa opetusohjelmassa. | |
| 126 | 114 | ||
| 127 | 115 | - Valitse komponenttipaletilta [[TPanel/fi|TPanel]]-komponentti. | |
| 128 | 116 | - Klikkaa lomaketta sijoittaaksi paneelin siihen. | |
| 129 | 117 | ||
| 130 | 118 | Uusi paneeli on nyt näkyvissä lomakkeella oletusleveydellä, korkeudella ja tekstillä. Huomio, että paneelin Caption tekstin fontti periytyy lomakkeelta. Tätä paneelia käytetään ryhmittelemään kaikki painikkeet, joten useita ominaisuuksia, on muutettava. | |
| 131 | 119 | ||
| 132 | 120 | - Poista teksti *Panel1* Panel1:n Caption-ominaisuudesta. | |
| 133 | 121 | - Vaihda Align arvoon *alClient*. | |
| 134 | 122 | - Muuta Borderspacing.Around arvoon *6*. | |
| 135 | 123 | - Muuta lomakkeen Width (eli leveys) arvoon *300* (ensin klikataan Form1 komponenttimuokkaimen puunäkymässä). | |
| 136 | 124 | - Muuta lomakkeen Height (korkeus) arvoon *350*. | |
| 137 | 125 | ||
| 138 | 126 | (Koon kasvattaminen lomakkeella antaa tilaa komponenteille.) | |
| 139 | 127 | ||
| 140 | 128 | Nyt lisätään numeronäppäimet. | |
| 141 | 129 | ||
| 142 | 130 | - Komponenttipaletilta valitaan [[TButton/fi|TButton]]-komponentti. | |
| 143 | 131 | - Klikkaa jossain keskellä lomakketta, tämä sijoittaa painikkeen paneeliin. Tämä näkyy komponenttimuokkaimen puunäkymässä: Button1 on Panel1:n ns *lapsi*. Tämä tarkoittaa käytännössä sitä, että kun Panel1:stä siirretään niin kaikki lapsikomponentit liikkuvat mukana. Ja kun Panel1 poistetaan niin kaikki lapsikomponentit myös poistetaan. | |
| 144 | 132 | - Komponenttimuokkaimessa muuta Caption-tekstiksi *0*. | |
| 145 | 133 | - Muuta Width arvoon *32*. | |
| 146 | 134 | - Muuta Height arvoon *30*. | |
| 147 | 135 | - Muuta Name arvoon *btnDigit0*. | |
| 148 | 136 | ||
| 149 | 137 | Tämä on toistettava myös numeroille 1..9. Nopein tapa tehdä tämä on kopioda 0-näppäintä ja liittämällä sitä. | |
| 150 | 138 | ||
| 151 | 139 | - Klikkaa hiiren oikeata painiketta yllä luodun 0-näppäimen päällä ja valitse kopioi ponnahdusvalikosta. | |
| 152 | 140 | - Klikkaa hiirtä jossain muualla Panel1:n alueella ja valitse Liitä. Toinen painike lisätään paneeliin. Ainoa ero ensimmäiseen painikeeseen on nimi btnDigit1. | |
| 153 | 141 | - Muuta komponenttimuokkaimessa Caption-tekstiksi *1*. | |
| 154 | 142 | - Toista liitä toiminta 8 kertaa jolloin saadaan loput numero painikkeet. | |
| 155 | 143 | - Siirrä painikkeita lomakkeella niin että saadan tulos joka näyttää laskimelta: | |
| 156 | 144 | ||
| 157 | - | ||
| 158 | - | ||
| 159 | - | ||
| 160 | - | ||
| 145 | + |  | |
| 161 | 146 | ||
| 162 | 147 | Seuraavaksi on neljä painikketta matemaattisia laskuja varten (lisäys, vähennys jne). | |
| 163 | 148 | ||
| 164 | 149 | - Tuo uusi TButton-komponentti paneeliin. | |
| 165 | 150 | - Komponenttimuokkaimessa muuta Caption-tekstiksi *+*. | |
| 166 | 151 | - Muuta Width arvoon *32*. | |
| 167 | 152 | - Muuta Height arvoon *30*. | |
| 168 | 153 | - Muuta Name arvoon *btnFunction*. | |
| 169 | 154 | - Kopio ja liitä näitä painikkeita kolme kertaa ja vaihda Caption-tekstiksi *-*, *** ja */*. | |
| 170 | 155 | - Sijoita painikkeet pystysuoraan, aivan numeronäppäinten viereen. | |
| 171 | 156 | ||
| 172 | 157 | Ja "erikoisnäppäimet": | |
| 173 | 158 | ||
| 174 | 159 | - Kopioi ja liitä *+*-painike. | |
| 175 | 160 | - Muuta Caption arvoon *+/-*. | |
| 176 | 161 | - Muuta Name arvoon *btnPlusMinus*. | |
| 177 | 162 | - Sijoita painike painikkeen *3* alapuolella. | |
| 178 | 163 | - Kopioi ja liitä *+*-painike. | |
| 179 | 164 | - Muuta Caption arvoon *C*. | |
| 180 | 165 | - Muuta Name arvoon *btnClear*. | |
| 181 | 166 | - Sijoita painike painikkeen *+* oikealle puolen. | |
| 182 | 167 | - Kopioi ja liitä *+*-painike. | |
| 183 | 168 | - Muuta Caption arvoon *=*. | |
| 184 | 169 | - Muuta Name arvoon *btnCalculate*. | |
| 185 | 170 | - Sijoita painike painikkeen */* oikealle puolen. | |
| 186 | 171 | ||
| 187 | 172 | Kaikki painikkeet on sijoitettu, muuta lomaketta sopivan tiiviiksi. | |
| 188 | 173 | ||
| 189 | 174 | Sen pitäisi näyttää tältä: | |
| 190 | 175 | ||
| 191 | - | ||
| 192 | - | ||
| 193 | - | ||
| 194 | - | ||
| 176 | + |  | |
| 195 | 177 | ||
| 196 | 178 | Muista tallentaa ja tallentaa usein! | |
| 197 | 179 | ||
| 198 | 180 | ## Tapahtumiin vastaaminen | |
| 199 | 181 | ||
| 200 | 182 | Graafinen sovellus on usein tapahtuma-pohjainen ohjelma. Tämä tarkoittaa sitä, että sovellus ei tee mitään ennen kuin kerromme sitä tekemään jotain. Esimerkiksi syöttämällä dataa näppäimistön kautta, painalluksina jne. Yksi asioista on että laskimen tarvitsee vastata kun hiirellä klikataan numeroita 0..9. Tässä on Lazarus ohjelman kehitysympäristö auttaa. Niin sanotun tapahtumakäsittelijän lisääminen painiketta varten on helppoa. | |
| 201 | 183 | ||
| 202 | - | ||
| 184 | + | - Varmista, että lomakkeen kaikki painikkeet on näkyvissä (tarvittaessa paina `F12` kerran tai kahdesti). | |
| 203 | 185 | - Tuplaklikkaa *0*-painiketta (jonka Caption on asetettu arvoon 0): Kehitysympäristö luo automaattisesti aliohjelman rungon, joka käsittelee hiiren klikkausta: procedure TForm1.btnDigit0Click (Sender: TObject); | |
| 204 | 186 | - kirjoita seuraava koodi [[Begin/fi|begin]] ja [[End/fi|end]] väliin: | |
| 205 | 187 | ||
| 206 | 188 | ``` pascal | |
| 207 | 189 | edDisplay.Text := edDisplay.Text + '0'; | |
| 208 | 190 | ``` | |
| 209 | 191 | ||
| 210 | 192 | Eli edDisplay on TEdit-komponentti. Tapa muuttaa sen sisältöä on muokata sen Text-ominaisuutta. Edellä esitetty [[statement/fi|lause]] lisää numeron "0" muokkausruutuun ja tämä näkyy näytöllä välittömästi. | |
| 211 | 193 | ||
| 212 | 194 | - Tuplaklikkaa *1*-painiketta | |
| 213 | 195 | - kirjoita seuraava koodi `begin` ja `end` väliin: | |
| 214 | 196 | ||
| 215 | 197 | ``` pascal | |
| 216 | 198 | edDisplay.Text := edDisplay.Text + '1'; | |
| 217 | 199 | ``` | |
| 218 | 200 | ||
| 219 | 201 | On hyvä idea kääntää koodin ajoittain tarkistaen syntaksivirheet ([[compile-time error/fi|käännösaikainen virhe]]). | |
| 220 | 202 | ||
| 221 | - | ||
| 203 | + | - Valitse valikosta Suorita/Suorita (tai paina `F9`. Projekti käännetään ja sovellus käynnistyy. | |
| 222 | 204 | - Klikkaa numeroita 0 ja 1 pari kertaa ja katso mitä tapahtuu ruudulla. Toiset painikkeet eivät tee mitään koska niiden tapahtumakäsittelijöitä ei ole vielä lisätty. | |
| 223 | 205 | - Pysäytä Calculator Demo ohjelma. | |
| 224 | 206 | ||
| 225 | 207 | Tietenkin se on nyt helppo lisätä tapahtuman käsittelijät numeroille 2..9, mutta tämä johtaa paljon tarpeettomaan koodiin. Jokainen tapahtuma käsittelijä on lähes samanlainen, ainoa erona on että numero on erilainen. Tapa poistaa tämä päällekkäisyys on luoda aliohjelma, joka tekee käsittelyn ja lisää muuttuvat tiedot (numerot 0..9) parametrina. | |
| 226 | 208 | ||
| 227 | 209 | - Lähdekoodieditori paikantaa rivit jossa luokka TForm1 on määritelty. Se näyttää tältä: | |
| 228 | 210 | ||
| 229 | 211 | ``` pascal | |
| 230 | 212 | ||
| 231 | 213 | { TForm1 } | |
| 232 | 214 | ||
| 233 | 215 | TForm1 = class(TForm) | |
| 234 | 216 | btnDigit0: TButton; | |
| 235 | 217 | btnDigit1: TButton; | |
| 236 | 218 | btnDigit2: TButton; | |
| 237 | 219 | btnDigit3: TButton; | |
| 238 | 220 | btnDigit4: TButton; | |
| 239 | 221 | btnDigit5: TButton; | |
| 240 | 222 | btnDigit6: TButton; | |
| 241 | 223 | btnDigit7: TButton; | |
| 242 | 224 | btnDigit8: TButton; | |
| 243 | 225 | btnDigit9: TButton; | |
| 244 | 226 | btnFunction: TButton; | |
| 245 | 227 | btnFunction1: TButton; | |
| 246 | 228 | btnFunction2: TButton; | |
| 247 | 229 | btnFunction3: TButton; | |
| 248 | 230 | btnCalculate: TButton; | |
| 249 | 231 | btnPlusMinus: TButton; | |
| 250 | 232 | btnClear: TButton; | |
| 251 | 233 | edDisplay: TEdit; | |
| 252 | 234 | Panel1: TPanel; | |
| 253 | 235 | procedure btnDigit0Click(Sender: TObject); | |
| 254 | 236 | procedure btnDigit1Click(Sender: TObject); | |
| 255 | 237 | private | |
| 256 | 238 | { private declarations } | |
| 257 | 239 | public | |
| 258 | 240 | { public declarations } | |
| 259 | 241 | end; | |
| 260 | 242 | ||
| 261 | 243 | ``` | |
| 262 | 244 | ||
| 263 | 245 | Huomaa, että edellisessää luokkamäärittelyssä kaikki komponentit ja aliohjelmat on määritelty lisäämällä ne lomakkeen kautta "osoittamalla kohtaa ja klikkaamalla". ***Älä tee mitään (manuaalista) muutoksia sinne!!*** [[IDE/fi|Kehitysympäristö]] ei välttämättä ymmärrä niitä ja menee sekaisin. Paikka lisätä mukautettuja [[Variable/fi|muuttujia]], [[Procedure/fi|aliohjelmia]] ja [[Function/fi|funktioita]] on [[Private/fi|private]] tai [[Public/fi|public]] osio. Pääsääntöisesti kaikki muokatut muuttujat lisätään `private` osioon. Aliohjelmat ja funktiot lisätään usein `private` osioon, paitsi jos muut (luokat, lomakkeet) tarvitsee kutsua näitä aliohjelmia tai funktioita (jonka ei pitäisi tapahtua liian usein). | |
| 264 | 246 | ||
| 265 | 247 | Takaisin numeron näyttö ongelmaan: tarvitaan aliohjelma, joka lisää numeron näytölle, jossa itse numerot voi vaihdella. | |
| 266 | 248 | ||
| 267 | 249 | - Lisää procedure AddDigit lomakkeen private osioon. | |
| 268 | 250 | ||
| 269 | 251 | ``` pascal | |
| 270 | 252 | ||
| 271 | 253 | private | |
| 272 | 254 | { private declarations } | |
| 273 | 255 | procedure AddDigit(const pDigit: byte); | |
| 274 | 256 | public | |
| 275 | 257 | { public declarations } | |
| 276 | 258 | end; | |
| 277 | 259 | ``` | |
| 278 | 260 | ||
| 279 | 261 | Seuraavaksi aliohjelman AddDigit varsinainen koodi olisi syötettävä. Jälleen voidaan hyödyntää kehitysympäristöä: | |
| 280 | 262 | ||
| 281 | 263 | - Sijoita vilkkuva tekstikursori AddDigit riville. | |
| 282 | - | ||
| 264 | + | - Paina näppäinyhdistelmää `Ctrl`+`Shift`+`C`. | |
| 283 | 265 | ||
| 284 | 266 | Kehitysympäristö luo määritelmän tälle uudelle aliohjelmalle ja asettaa tekstikursorin tyhjän rungon sisälle. Jolloin heti voidaan aloittaa kirjoittaminen. | |
| 285 | 267 | ||
| 286 | 268 | - Lisää seuraava koodi AddDigit aliohjelman runkoon: | |
| 287 | 269 | ||
| 288 | 270 | ``` pascal | |
| 289 | 271 | edDisplay.Text := edDisplay.Text + IntToStr(pDigit); | |
| 290 | 272 | ``` | |
| 291 | 273 | ||
| 292 | 274 | Huomaa että function *IntToStr()* muuttaa numeerisen arvon, numeron, merkkijono arvoksi jotta se voidaan lisätä näytön tekstiin. | |
| 293 | 275 | ||
| 294 | 276 | Nyt käyttää tätä aliohjelmaa kaikissa numeroissa 0..9: | |
| 295 | 277 | ||
| 296 | - | ||
| 278 | + | - Avaa lomake (tarvittaessa paina `F12` kerran tai kahdesti). | |
| 297 | 279 | - Tuplaklikkaa numeropainiketta 0: tämä avaa lähdekoodieditorissa painikkeen 0 tapahtumakäsittelijä kohtaan. | |
| 298 | 280 | - Korvaa koodin tapahtumakäsittelijä: aliohjelmakutsulla AddDigit (0). Kokonaisuudessaan aliohjelma näyttää tältä: | |
| 299 | 281 | ||
| 300 | 282 | ``` pascal | |
| 301 | 283 | procedure TForm1.btnDigit0Click(Sender: TObject); | |
| 302 | 284 | begin | |
| 303 | 285 | AddDigit(0); | |
| 304 | 286 | end; | |
| 305 | 287 | ``` | |
| 306 | 288 | ||
| 307 | 289 | - Tee sama numero painike 1:lle: | |
| 308 | 290 | ||
| 309 | 291 | ``` pascal | |
| 310 | 292 | procedure TForm1.btnDigit1Click(Sender: TObject); | |
| 311 | 293 | begin | |
| 312 | 294 | AddDigit(1); | |
| 313 | 295 | end; | |
| 314 | 296 | ``` | |
| 315 | 297 | ||
| 316 | 298 | Ennen kuin teet tämän sekvenssin kaikkille muille numeropainikkeille, varmista, että tämä todella tekee sen mitä halutaan. | |
| 317 | 299 | ||
| 318 | - | ||
| 300 | + | - Suorita ohjelma (paina `F9` ). | |
| 319 | 301 | - Klikkaa numeroita 0 ja 1 pari kertaa ja katso että se todella toimii. | |
| 320 | 302 | - Sulje ohjelma. | |
| 321 | 303 | ||
| 322 | 304 | *Hyvä ohjelmoija on laiska ohjelmoija* | |
| 323 | 305 | ||
| 324 | 306 | Nyt voimme lisätä tapahtuman käsittelijät numeronäppäimille 2..9. Mutta sitten taas meillä on sama ongelma, luodaan paljon tarpeeton koodia: AddDigit (2), AddDigit (3) jne. Mitä jos olisi olemassa tapa kertoa painikkeet toisistaan? Onneksi on. | |
| 325 | 307 | ||
| 326 | 308 | Kaikki komponenteilla on kokonaisluku ominaisuus nimeltään *Tag* (muista: kontrollit on vain erikoinen komponentti, joka perii tämän Tag ominaisuuden). Se on ominaisuus, jolla ei ole varsinaista toimintoa. Se on olemassa, jotta sitä voidaan käyttää tarvittaessa. Mitä jos jokaisen painikkeen numeroarvo olisi tallennettu Tag ominaisuuteen... | |
| 327 | 309 | ||
| 328 | - | ||
| 310 | + | - Avaa lomake (tarvittaessa paina `F12` kerran tai kahdesti). | |
| 329 | 311 | - Valitse numeron 1 painike (klikkaa sitä kerran). | |
| 330 | 312 | - Siirry komponenttimuokkaimessa Tag ominaisuuteen ja muuta sen arvoksi 1. | |
| 331 | 313 | - Valitse numeron 2 painikke (klikkaa sitä kerran). | |
| 332 | 314 | - Siirry komponenttimuokkaimessa Tag ominaisuuteen ja muuta sen arvoksi 2. | |
| 333 | 315 | - Toista tämä numerojen 3..9 painikkeilla. | |
| 334 | 316 | ||
| 335 | 317 | Nyt kaikkilla numeropainikkeilla on oma ainutlaatuinen Tag arvo. Emme ole muuttaneet numeropainiketta 0 koska Tag arvon oletusarvo on jo 0. Nyt hyödynnetään tämä Tag arvo: | |
| 336 | 318 | ||
| 337 | 319 | - Avaa lomake. | |
| 338 | 320 | - Tuplaklikkaa numeropainiketta 0 (Tämä avaa lähdekoodieditorin numeropainikkeen 0 tapahtumankäsittelijän). | |
| 339 | 321 | - Huomaa, että aliohjelmalla *btnDigit0Click* on parametri *Sender* joka on tyyppiä *TObject*. | |
| 340 | 322 | ||
| 341 | 323 | ``` pascal | |
| 342 | 324 | procedure TForm1.btnDigit0Click(Sender: TObject); | |
| 343 | 325 | ``` | |
| 344 | 326 | ||
| 345 | 327 | Parametri *Sender* on käytännössä viittaus painikkeeseen, jota painettiin. Typecasting avulla voidaan parametria käyttää kuin se olisi TButton. | |
| 346 | 328 | ||
| 347 | 329 | - Muuta koodi näin: | |
| 348 | 330 | ||
| 349 | 331 | ``` pascal | |
| 350 | 332 | procedure TForm1.btnDigit0Click(Sender: TObject); | |
| 351 | 333 | begin | |
| 352 | 334 | AddDigit(TButton(Sender).Tag); | |
| 353 | 335 | end; | |
| 354 | 336 | ``` | |
| 355 | 337 | ||
| 356 | 338 | Ei näytä siltä että olisi saavutettu paljon, yksi rivi koodia korvaa toisen. Kuitenkin jos lisätään koodi muihin numeroihin (1..9) se näyttää *täsmälleen* samalta. Joten kaikki muut numerot voidaan laittaa käyttämään tätä koodia uudelleen! | |
| 357 | 339 | ||
| 358 | 340 | Katsotaanpa tarkemmin komponenttimuokkaimella. | |
| 359 | 341 | ||
| 360 | 342 | - Valitse lomake. | |
| 361 | 343 | - Valitse numeropainike 0 (btnDigit0). | |
| 362 | 344 | - Komponenttimuokkaimessa valitse tapahtumat välilehti (katso alla). | |
| 363 | 345 | ||
| 364 | - | ||
| 365 | - | ||
| 366 | - | ||
| 367 | - | ||
| 346 | + |  | |
| 368 | 347 | ||
| 369 | 348 | Komponenttimuokkaimessa voidaan komponentin ominaisuuksien lisäksi muuttaa tapahtumankäsittelijöitä. Komponenttimuokkaimessa voidaan heti nähdä kun numeropainiketta 0 klikataan niin kutsutaan aliohjelmaa *btnDigit0Click* (tämä on *onClick* tapahtumakäsittelijässä). | |
| 370 | 349 | ||
| 371 | 350 | - Lomakkeelle: valitse numeropainike 2. Komponenttimuokkaimessa voidaan nyt nähdä, että ei ole onClick tapahtumakäsittelijää painikkeella 2. | |
| 372 | 351 | - Avaa onClick tapahtuman pudotusvalikko ja valitse *btnDigit0Click*. | |
| 373 | 352 | - Tee tämä sama kaikille muille numeropainikkeille 3..9. | |
| 374 | 353 | ||
| 375 | 354 | Nyt kaikki painikkeet jakaa yksi yhteisen aliohjelman, joka tekee juuri mitä halutaan paitsi numeropainiketta 1. Muistutuksesksi se että numeron 1 painikeeseen luotiin tapahtumankäsittelijä *btnDigit1Click* ja sitä ei todellakaan tarvita enää. | |
| 376 | 355 | ||
| 377 | 356 | - Lomakkeella: valitaan numeron 1 näppäin. Komponenttimuokkaimessa voidaan nyt nähdä, että tapahtumakäsittelijä todellakin on *btnDigit1Click*. | |
| 378 | 357 | - Avaa onclick tapahtuman pudotusvalikko ja valitse *btnDigit0Click*. | |
| 379 | 358 | ||
| 380 | 359 | Nyt kaikki painikkeet jakavat saman tapahtumakäsittelyn ja lisää numeroa näyttöruudussa. | |
| 381 | 360 | ||
| 382 | - | ||
| 361 | + | - Suorita ohjelma (paina `F9` ). | |
| 383 | 362 | - Klikkaa kaikkia numeropainikkeita 0..9 muutamia kertoja ja totea että de todellakin toimii. | |
| 384 | 363 | - Sulje ohjelma. | |
| 385 | 364 | ||
| 386 | 365 | Numeropainikkeilla on eräs viimeistely asia vielä tehtävä: tapahtumakäsittelijä *btnDigit1Click* edelleen olemassa, mutta sitä ei käytetä enää joten se olisi poistettava. Turvallisin tapa tehdä tämä (toistaiseksi) on antaa kehitysympäristön käsitellä sitä. Jotta tämä toimisi niin vaihtoehto *Poista automaattisesti tyhjät metodit* olisi oltava käytössä. | |
| 387 | 366 | ||
| 388 | 367 | - Valikossa valitse Työkalut / Asetukset. | |
| 389 | 368 | - Klikkaa Editori / Koodin täydennys ja vihjeet. | |
| 390 | 369 | - Salli (klikkaa) vaihtoehto *Poista automaattisesti tyhjät metodit* päälle (katso kuva alla). | |
| 391 | 370 | - Paina OK. | |
| 392 | 371 | ||
| 393 | - | ||
| 394 | - | ||
| 395 | - | ||
| 396 | - | ||
| 372 | + |  | |
| 397 | 373 | ||
| 398 | 374 | Tästä lähtien kaikki tyhjät metodit poistetaan automaattisesti heti, kun lähdetiedosto tallennetaan. | |
| 399 | 375 | ||
| 400 | 376 | - Paikallista aliohjelma *procedure TForm1.btnDigit1Click(Sender: TObject)* | |
| 401 | 377 | - Poista rivi *AddDigit(1);* | |
| 402 | - | ||
| 378 | + | - Tallenna tiedosto (paina `Ctrl` + `s` tai valitsemalla valikosta Tiedosto / Tallenna). Nyt tyhjä aliohjelma poistetaan automaattisesti. | |
| 403 | 379 | ||
| 404 | 380 | ## Hienosäätöä | |
| 405 | 381 | ||
| 406 | 382 | Jotain hyvää : laskin ohjelma kääntyy ja toimii kun klikkaa numeroa 0..9. Mutta se ei käyttäydy juuri niin kuin haluamme: siellä on aina ärsyttävä nolla luvun alussa ja salliiasivan liikaa numeroita. | |
| 407 | 383 | ||
| 408 | 384 | ### Poistetaan etunollat | |
| 409 | 385 | ||
| 410 | 386 | Normaalisti kokonaisluku, joka on suurempi (tai pienempi) kuin nolla ei ala nolla numerolla. Joten laskimenkin pitäisi kompensoida tämän. Onneksi tämä on helppo toteuttaa. Muista, että on vain yksi aliohjelma, joka käsittelee numeroiden lisäämisen: AddDigit. Tämä on paikka johon lisätä logiikka joka *tukahduttaa* nämä etunollat. | |
| 411 | 387 | ||
| 412 | 388 | - Paikanna aliohjelma *procedure TForm1.AddDigit(const pDigit: byte)* | |
| 413 | 389 | - Muuta koodi seuraavanlaiseksi: | |
| 414 | 390 | ||
| 415 | 391 | ``` pascal | |
| 416 | 392 | procedure TForm1.AddDigit(const pDigit: byte); | |
| 417 | 393 | begin | |
| 418 | 394 | // Poistaa etunollan lisättäessä numeroa | |
| 419 | 395 | if edDisplay.Text = '0' then | |
| 420 | 396 | edDisplay.Text := IntToStr(pDigit) | |
| 421 | 397 | else | |
| 422 | 398 | edDisplay.Text := edDisplay.Text + IntToStr(pDigit) | |
| 423 | 399 | end; | |
| 424 | 400 | ``` | |
| 425 | 401 | ||
| 426 | 402 | ### Rajaa numeroiden määrä | |
| 427 | 403 | ||
| 428 | 404 | Tämä demo laskin ei osaa käsitellä numeroita, jotka ovat liian suuria. Joten täytyy rajoittaa numeroiden määrä joita voidaan syöttää. Jälleen looginen paikka tehdä tämä on aliohjelma AddDigit: | |
| 429 | 405 | ||
| 430 | 406 | - Paikanna aliohjelma *procedure TForm1.AddDigit(const pDigit: byte)* | |
| 431 | 407 | - Muuta koodi seuraavanlaiseksi: | |
| 432 | 408 | ||
| 433 | 409 | ``` pascal | |
| 434 | 410 | procedure TForm1.AddDigit(const pDigit: byte); | |
| 435 | 411 | begin | |
| 436 | 412 | // Rajoittaa numeroiden määrän | |
| 437 | 413 | if length(edDisplay.Text) < 8 then | |
| 438 | 414 | begin | |
| 439 | 415 | // Poistaa etunollan lisättäessä numeroa | |
| 440 | 416 | if edDisplay.Text = '0' then | |
| 441 | 417 | edDisplay.Text := IntToStr(pDigit) | |
| 442 | 418 | else | |
| 443 | 419 | edDisplay.Text := edDisplay.Text + IntToStr(pDigit); | |
| 444 | 420 | end; | |
| 445 | 421 | end; | |
| 446 | 422 | ``` | |
| 447 | 423 | ||
| 448 | 424 | ## Toiminnot | |
| 449 | 425 | ||
| 450 | 426 | Nyt on aika tarkastella varsinaista toimintaa jota halutaan toteuttaa: lisäämistä, vähentämistä, kertomista ja jakamista. Tapa, jolla käyttäjä aikoo käyttää laskinta menee jotenkin näin: | |
| 451 | 427 | ||
| 452 | 428 | 1. Käyttäjä syöttää luvun | |
| 453 | 429 | 2. Käyttäjä painaa toimintonäppäintä (esimerkiksi "+") | |
| 454 | 430 | 3. Käyttäjä syöttää toisen luvun | |
| 455 | 431 | 4. Käyttäjä painaa "=" | |
| 456 | 432 | 5. Ohjelma vastaa lisäämällä ensimmäisen ja toisen luvun | |
| 457 | 433 | ||
| 458 | 434 | Heti kun käyttäjä painaa "=" -painiketta ohjelma on tiedettävä kolme asiaa: | |
| 459 | 435 | ||
| 460 | 436 | 1. Mikä oli toiminto? | |
| 461 | 437 | 2. Mikä oli ensimmäinen luku? | |
| 462 | 438 | 3. Mikä oli toinen luku? | |
| 463 | 439 | ||
| 464 | 440 | ### Mikä oli toiminto? | |
| 465 | 441 | ||
| 466 | 442 | Jotenkin täytyy rekisteröidä, mikä tietyn toiminnan tyyppi valittiin. Ja on tiedettävä, mitkä toiminnat ovat käytettävissä. Yksi tapa toteuttaa tämä on luoda luetteltu tyyppi (tai käyttäjän määrittämä skalaarityyppi), joka sisältää kaikki sallitut toiminnot. | |
| 467 | 443 | ||
| 468 | 444 | - Lähdekoodieditorissa siirrytään paikkaan, jossa lomake on määritelty. | |
| 469 | 445 | - Sen yläpuolella lisätään lueteltun tyypin määritys *TOperationType* kaikille tuetuille toiminnoille (Lähdekoodi täydennetään seuraavanlaiseksi): | |
| 470 | 446 | ||
| 471 | 447 | ``` pascal | |
| 472 | 448 | ||
| 473 | 449 | type | |
| 474 | 450 | ||
| 475 | 451 | { Kaikki tuetut toiminnot laskimessa } | |
| 476 | 452 | TOperationType = (otNone, otPlus, otMinus, otMultiply, otDivide); | |
| 477 | 453 | ||
| 478 | 454 | { TForm1 } | |
| 479 | 455 | ||
| 480 | 456 | TForm1 = class(TForm) | |
| 481 | 457 | ``` | |
| 482 | 458 | ||
| 483 | 459 | - Tilapäisen toiminnan tallennukseen muuttuja (SelectedOperation) | |
| 484 | 460 | ||
| 485 | 461 | , joka lisätään `private` osaan lomakkeen luokan määrittelyyn. | |
| 486 | 462 | ||
| 487 | 463 | ``` pascal | |
| 488 | 464 | ||
| 489 | 465 | private | |
| 490 | 466 | { private declarations } | |
| 491 | 467 | SelectedOperation: TOperationType; | |
| 492 | 468 | procedure AddDigit(const pDigit: byte); | |
| 493 | 469 | ``` | |
| 494 | 470 | ||
| 495 | 471 | ### Mikä oli ensimmäinen luku? | |
| 496 | 472 | ||
| 497 | 473 | Ensimmäisen luvun tilapäiseen tallennukseen tarvitaan muuttuja. | |
| 498 | 474 | ||
| 499 | 475 | - Lisätään muuttuja (FirstNumber) lomakkeen `private` osioon. | |
| 500 | 476 | ||
| 501 | 477 | ``` pascal | |
| 502 | 478 | ||
| 503 | 479 | private | |
| 504 | 480 | { private declarations } | |
| 505 | 481 | SelectedOperation: TOperationType; | |
| 506 | 482 | FirstNumber: longint; | |
| 507 | 483 | procedure AddDigit(const pDigit: byte); | |
| 508 | 484 | ``` | |
| 509 | 485 | ||
| 510 | 486 | ### Mikä oli toinen luku? | |
| 511 | 487 | ||
| 512 | 488 | - Lisätään myös muuttuja SecondNumber lomakkeen `private` osioon (samaan missä on FirstNumber) ja tehdään siitä myös [[Longint/fi|longint]] tyyppinen. | |
| 513 | 489 | ||
| 514 | 490 | ## Mitähän seuraavaksi? | |
| 515 | 491 | ||
| 516 | 492 | Nyt on aika toteuttaa toimintopainikkeiden toiminnot: lisäys, vähentäminen, kertominen ja jakaminen. Aloitetaan "+" -painikkeella. Vähän niin kuten aikaisemminkin : kun "+" painiketta painetaan niin täytyy tallentaa ensimmäinen luku ja se mikä operaatio on käytössä. Niin, että mitä aiotaan tehdä. | |
| 517 | 493 | ||
| 518 | 494 | - Mene lomakkeelle. | |
| 519 | 495 | - Tuplaklikkaa painiketta "+". Kehitysympäristö luo tapahtumankäsittelijän ja tekstikursori on sijoitettu tyhjälle riville `begin` `end` lohkon sisään. | |
| 520 | 496 | ||
| 521 | 497 | Hetkinen! Ennen kuin lisätään koodia tähän ja tehdään samoin kolmeen muuhun käyttöpainikkeelle, muista mitä aiemmin kerrottiin, kun numeroita 0..9 lisättiin: Ei lisätä päällekkäistä koodia! On kohtuullista olettaa, että koodi kolmessa muussa toimintopainikkeessa on sama kuin "+" painikkeessa, lukuun ottamatta itse operaatiota. Joten siinä säästää jonkin verran työtäkin. | |
| 522 | 498 | ||
| 523 | 499 | - Mene lomakkeen `private` osioon ja lisää uusi aliohjelma: StoreOperation. | |
| 524 | 500 | ||
| 525 | 501 | ``` pascal | |
| 526 | 502 | ||
| 527 | 503 | private | |
| 528 | 504 | { private declarations } | |
| 529 | 505 | SelectedOperation: TOperationType; | |
| 530 | 506 | FirstNumber: longint; | |
| 531 | 507 | SecondNumber: longint; | |
| 532 | 508 | procedure AddDigit(const pDigit: byte); | |
| 533 | 509 | procedure StoreOperation(const pOperation: TOperationType); | |
| 534 | 510 | ``` | |
| 535 | 511 | ||
| 536 | 512 | - Sijoita vilkkuva tekstikursori äskettäin tehdylle uudelle riville. | |
| 537 | - | ||
| 513 | + | - Paina `Ctrl`+`Shift` +`C` (Tiedät jo mitä nyt tapahtuu…). | |
| 538 | 514 | ||
| 539 | 515 | Aliohjelmassa StoreOperation on tehtävä kaksi asiaa: tallentaa toiminto ja tallentaa luku, joka on näytössä, jolloin sitä voidaan käyttää myöhemmin. | |
| 540 | 516 | ||
| 541 | 517 | - Lisää seuraava koodi viimeksi luodulle aliohjelmalle: | |
| 542 | 518 | ||
| 543 | 519 | ``` pascal | |
| 544 | 520 | procedure TForm1.StoreOperation(const pOperation: TOperationType); | |
| 545 | 521 | begin | |
| 546 | 522 | // tallentaa toiminnon | |
| 547 | 523 | SelectedOperation := pOperation; | |
| 548 | 524 | ||
| 549 | 525 | // tallentaa luvun | |
| 550 | 526 | FirstNumber := StrToInt(edDisplay.Text); | |
| 551 | 527 | end; | |
| 552 | 528 | ``` | |
| 553 | 529 | ||
| 554 | 530 | Ok, takaisin "+" -painikkeeseen: | |
| 555 | 531 | ||
| 556 | 532 | - Mene lomakkeelle. | |
| 557 | 533 | - Tuplaklikkaa painiketta "+". | |
| 558 | 534 | - Lisää seuraava koodi: StoreOperation(otPlus); | |
| 559 | 535 | - Mene lomakkeelle. | |
| 560 | 536 | - Tuplaklikkaa painiketta "-". | |
| 561 | 537 | - Lisää seuraava koodi: StoreOperation(otMinus); | |
| 562 | 538 | - Mene lomakkeelle. | |
| 563 | 539 | - Tuplaklikkaa painiketta "*". | |
| 564 | 540 | - Lisää seuraava koodi: StoreOperation(otMultiply); | |
| 565 | 541 | - Mene lomakkeelle. | |
| 566 | 542 | - Tuplaklikkaa painiketta "/". | |
| 567 | 543 | - Lisää seuraava koodi: StoreOperation(otDivide); | |
| 568 | 544 | ||
| 569 | 545 | Nyt hyvä testata ohjelmaa ja katsoa mitä tapahtuu: | |
| 570 | 546 | ||
| 571 | - | ||
| 547 | + | - Suorita ohjelma (paina `F9` ) | |
| 572 | 548 | - Anna luku (esim. 21267) | |
| 573 | 549 | - Paina '+'-painiketta | |
| 574 | 550 | - Anna seuraava luku (esim. 31170) | |
| 575 | 551 | ||
| 576 | 552 | Mitä tapahtuu kun painaa "+"-painiketta tai jotain muuta toimitopainikketta: näyttö ei tyhjenny. On löydettävä tapa jolla näyttö tyhjentyy, kun toimintopainiketta painetaan. Koska on käytetty aliohjelmia yhdistämään samanlaisia ??toimia, tämä on helppo muutos. | |
| 577 | 553 | ||
| 578 | 554 | - Mene lomakkeen `private` osioon ja lisää uusi muuttuja: doClearDisplay. Tämä [[Boolean/fi|boolean]] muuttujaa kertoo milloin tehdään näytön tyhjennys. | |
| 579 | 555 | ||
| 580 | 556 | ``` pascal | |
| 581 | 557 | private | |
| 582 | 558 | { private declarations } | |
| 583 | 559 | SelectedOperation: TOperationType; | |
| 584 | 560 | FirstNumber: longint; | |
| 585 | 561 | SecondNumber: longint; | |
| 586 | 562 | doClearDisplay: boolean; | |
| 587 | 563 | procedure AddDigit(const pDigit: byte); | |
| 588 | 564 | procedure StoreOperation(const pOperation: TOperationType); | |
| 589 | 565 | ``` | |
| 590 | 566 | ||
| 591 | 567 | - Sijoita vilkkuva tekstikursori StoreOperation riville. | |
| 592 | - | ||
| 568 | + | - Paina `Ctrl`+`Shift`+`Down`: tämä siirtää kohdistimen aliohjelman StoreOperation runkoon. | |
| 593 | 569 | - Aliohjelmassa StoreOperation on päivitettävä *doClearDisplay* muuttuja, jotta tiedetään, että näyttö on tyhjennettävä heti kun uusi numero on syötetään. Muuta koodi tälläiseksi: | |
| 594 | 570 | ||
| 595 | 571 | ``` pascal | |
| 596 | 572 | procedure TForm1.StoreOperation(const pOperation: TOperationType); | |
| 597 | 573 | begin | |
| 598 | 574 | // tallentaa toiminnon | |
| 599 | 575 | SelectedOperation := pOperation; | |
| 600 | 576 | // tallentaa luvun | |
| 601 | 577 | FirstNumber := StrToInt(edDisplay.Text); | |
| 602 | 578 | // Näytön muistiin että täytyy aloittaa uusi luku | |
| 603 | 579 | doClearDisplay := true; | |
| 604 | 580 | end; | |
| 605 | 581 | ``` | |
| 606 | 582 | ||
| 607 | 583 | - Ja missä parempi tyhjentää näytön kuin AddDigit aliohjelma? Muuta koodia seuraavanlaiseksi: | |
| 608 | 584 | ||
| 609 | 585 | ``` pascal | |
| 610 | 586 | procedure TForm1.AddDigit(const pDigit: byte); | |
| 611 | 587 | begin | |
| 612 | 588 | // Täytyykö näyttö tyhjentää ensin? | |
| 613 | 589 | if doClearDisplay then | |
| 614 | 590 | begin | |
| 615 | 591 | edDisplay.Text := '0'; // Laitetaan näyttöön nolla | |
| 616 | 592 | doClearDisplay := false; // Tyhjennys tehty | |
| 617 | 593 | end; | |
| 618 | 594 | ||
| 619 | 595 | // Rajoittaa numeroiden määrän | |
| 620 | 596 | if length(edDisplay.Text) < 8 then | |
| 621 | 597 | begin | |
| 622 | 598 | // Poistaa etunollan lisättäessä numeroa | |
| 623 | 599 | if edDisplay.Text = '0' then | |
| 624 | 600 | edDisplay.Text := IntToStr(pDigit) | |
| 625 | 601 | else | |
| 626 | 602 | edDisplay.Text := edDisplay.Text + IntToStr(pDigit); | |
| 627 | 603 | end; | |
| 628 | 604 | end; | |
| 629 | 605 | ``` | |
| 630 | 606 | ||
| 631 | 607 | Nyt hyvä testata ohjelmaa ja katsoa mitä tapahtuu: | |
| 632 | 608 | ||
| 633 | - | ||
| 609 | + | - Suorita ohjelma (paina `F9` ) | |
| 634 | 610 | - Anna luku | |
| 635 | 611 | - Paina toiminnon näppäintä. | |
| 636 | 612 | - Syötä toinen luku. | |
| 637 | 613 | - Lopeta ohjelma. | |
| 638 | 614 | ||
| 639 | 615 | Jo ollaan aika pitkällä: voidaan kirjoittaa numeroita ja valita toiminto. Nyt on aika tehdä todellisia laskelmia. | |
| 640 | 616 | ||
| 641 | 617 | ## Tehdään laskutoimitukset | |
| 642 | 618 | ||
| 643 | 619 | Nyt kun on tallennettu luvut ja toiminta, on aika tehdä todellisia laskelmia. Aloitetaan helppolla: yhteenlaskulla. | |
| 644 | 620 | ||
| 645 | 621 | - Mene lomakkeelle. | |
| 646 | 622 | - Tuplaklikkaa painiketta "=" (tapahtumakäsittelijä luodaan). | |
| 647 | 623 | - Täydennä aliohjelma tälläiseksi: | |
| 648 | 624 | ||
| 649 | 625 | ``` pascal | |
| 650 | 626 | procedure TForm1.btnCalculateClick(Sender: TObject); | |
| 651 | 627 | var result: longint; | |
| 652 | 628 | begin | |
| 653 | 629 | case SelectedOperation of | |
| 654 | 630 | otPlus: begin | |
| 655 | 631 | // Nouda toinen luku | |
| 656 | 632 | SecondNumber := StrToInt(edDisplay.Text); | |
| 657 | 633 | // Laske lasku | |
| 658 | 634 | result := FirstNumber + SecondNumber; | |
| 659 | 635 | // Näytettävä tulos | |
| 660 | 636 | edDisplay.Text := IntToStr(result); | |
| 661 | 637 | end; | |
| 662 | 638 | end; | |
| 663 | 639 | end; | |
| 664 | 640 | ``` | |
| 665 | 641 | ||
| 666 | 642 | Edellä oleva koodi on melko yksinkertainen: jos käyttäjä painaa "+" -painiketta, ensimmäinen ja toinen luku lasketaan yhteen ja tulos tallennetaan Edit-komponenttiin näytölle. On hyvä huomata että koodissa käytetään [[Case/fi|case]] [[Of/fi|of]] valintarakennetta. | |
| 667 | 643 | ||
| 668 | 644 | Nyt on toimiva laskin (joka voi vain lisätä kaksi lukua): | |
| 669 | 645 | ||
| 670 | - | ||
| 646 | + | - Suorita ohjelma (paina `F9` ) | |
| 671 | 647 | - Anna luku | |
| 672 | 648 | - Paina *+*-painiketta. | |
| 673 | 649 | - Syötä toinen luku. | |
| 674 | 650 | - Paina '=' jolloin kahden luvun summa näkyy. | |
| 675 | 651 | - Lopeta ohjelma. | |
| 676 | 652 | ||
| 677 | 653 | Nyt voisi lisätä kolme muuta puuttuvaa toimintoa ( '-', '*' ja '/'). Mutta ei vielä, on parantamisen varaa. Katsotaan seuraava lausetta: | |
| 678 | 654 | ||
| 679 | 655 | ``` pascal | |
| 680 | 656 | SecondNumber := StrToInt(edDisplay.Text); | |
| 681 | 657 | ``` | |
| 682 | 658 | ||
| 683 | 659 | Olemme nähneet tämän tapaisen lauseen ennenkin: Aliohjelma StoreOperation sisältää jotain vastaavaa: | |
| 684 | 660 | ||
| 685 | 661 | ``` pascal | |
| 686 | 662 | FirstNumber := StrToInt(edDisplay.Text); | |
| 687 | 663 | ``` | |
| 688 | 664 | ||
| 689 | 665 | Lukumäärän laskemiseksi käyttäjän kirjoittaman luvun muunto nyt tapahtuu kahdessa eri paikassa. Ei haluta toistaa tätä niin on hyvä idea luoda kokonaan uusi toiminto, joka tekee laskelman. | |
| 690 | 666 | ||
| 691 | 667 | - Lähdekoodieditorissa siirrytään paikkaan, jossa on lomakkeen `private` osio ja lisätään uusi funktio *GetDisplayValue*: | |
| 692 | 668 | ||
| 693 | 669 | ``` pascal | |
| 694 | 670 | ||
| 695 | 671 | private | |
| 696 | 672 | { private declarations } | |
| 697 | 673 | SelectedOperation: TOperationType; | |
| 698 | 674 | FirstNumber: longint; | |
| 699 | 675 | SecondNumber: longint; | |
| 700 | 676 | doClearDisplay: boolean; | |
| 701 | 677 | procedure AddDigit(const pDigit: byte); | |
| 702 | 678 | procedure StoreOperation(const pOperation: TOperationType); | |
| 703 | 679 | function GetDisplayValue: longint; | |
| 704 | 680 | ``` | |
| 705 | 681 | ||
| 706 | 682 | - Sijoita vilkkuva tekstikursori äskettäin tehdylle uudelle riville. | |
| 707 | - | ||
| 683 | + | - Paina `Ctrl`+`Shift`+`C` | |
| 708 | 684 | - Täydennä lähdekoodi seuraavanlaiseksi (eli se poimii arvon, joka on näyttökentässä): | |
| 709 | 685 | ||
| 710 | 686 | ``` pascal | |
| 711 | 687 | function TForm1.GetDisplayValue: longint; | |
| 712 | 688 | begin | |
| 713 | 689 | result := StrToInt(edDisplay.Text); | |
| 714 | 690 | end; | |
| 715 | 691 | ``` | |
| 716 | 692 | ||
| 717 | 693 | - Paikallista lause (etsi rivi): FirstNumber: = StrToInt (edDisplay.Text); | |
| 718 | 694 | - Muuta se: FirstNumber := GetDisplayValue; | |
| 719 | 695 | ||
| 720 | 696 | Jonkin verran koodin uudelleen kirjoittamista, takaisin laskentaan. | |
| 721 | 697 | ||
| 722 | 698 | - Paikallista lause (etsi rivi): SecondNumber := StrToInt(edDisplay.Text); | |
| 723 | 699 | - Muuta se: SecondNumber := GetDisplayValue; | |
| 724 | 700 | ||
| 725 | 701 | Nyt katso seuraavat lausetta: | |
| 726 | 702 | ||
| 727 | 703 | ``` pascal | |
| 728 | 704 | // Nouda toinen luku | |
| 729 | 705 | SecondNumber := GetDisplayValue; | |
| 730 | 706 | // Laske lasku | |
| 731 | 707 | result := FirstNumber + SecondNumber; | |
| 732 | 708 | ``` | |
| 733 | 709 | ||
| 734 | 710 | Muuttujaa *SecondNumber* käytetään tallentamaan arvo näyttöruudusta. Kuitenkin se ei ole välttämättä tarpeen. Edellä oleva koodi voidaan yksinkertaistaa: | |
| 735 | 711 | ||
| 736 | 712 | ``` pascal | |
| 737 | 713 | // Laske lasku | |
| 738 | 714 | result := FirstNumber + GetDisplayValue; | |
| 739 | 715 | ``` | |
| 740 | 716 | ||
| 741 | 717 | Nyt katsotaan seuraavia lauseita: | |
| 742 | 718 | ||
| 743 | 719 | ``` pascal | |
| 744 | 720 | // Laske lasku | |
| 745 | 721 | result := FirstNumber + GetDisplayValue; | |
| 746 | 722 | // Näytettävä tulos | |
| 747 | 723 | edDisplay.Text := IntToStr(result); | |
| 748 | 724 | ``` | |
| 749 | 725 | ||
| 750 | 726 | Sama koskee myös *result* muuttujaa. Edellä oleva koodi voidaan yksinkertaistaa: | |
| 751 | 727 | ||
| 752 | 728 | ``` pascal | |
| 753 | 729 | // Näytettävä tulos | |
| 754 | 730 | edDisplay.Text := IntToStr(FirstNumber + GetDisplayValue); | |
| 755 | 731 | ``` | |
| 756 | 732 | ||
| 757 | 733 | Nyt voimme lisätä kolme jäljellä olevaa toimintaa. | |
| 758 | 734 | ||
| 759 | 735 | - Mene lomakkeelle. | |
| 760 | 736 | - Tuplaklikkaa painiketta "=" (siirrytään tapahtumakäsittelijään). | |
| 761 | 737 | - Muuta aliohjelma tälläiseksi: | |
| 762 | 738 | ||
| 763 | 739 | ``` pascal | |
| 764 | 740 | procedure TForm1.btnCalculateClick(Sender: TObject); | |
| 765 | 741 | begin | |
| 766 | 742 | case SelectedOperation of | |
| 767 | 743 | otPlus : edDisplay.Text := IntToStr(FirstNumber + GetDisplayValue); | |
| 768 | 744 | otMinus : edDisplay.Text := IntToStr(FirstNumber - GetDisplayValue); | |
| 769 | 745 | otMultiply : edDisplay.Text := IntToStr(FirstNumber * GetDisplayValue); | |
| 770 | 746 | otDivide : edDisplay.Text := IntToStr(FirstNumber div GetDisplayValue); | |
| 771 | 747 | end; | |
| 772 | 748 | end; | |
| 773 | 749 | ``` | |
| 774 | 750 | ||
| 775 | 751 | Nyt on toimiva laskin kaikille neljälle toiminnolle: | |
| 776 | 752 | ||
| 777 | - | ||
| 753 | + | - Suorita ohjelma (paina `F9` ) | |
| 778 | 754 | - Anna luku | |
| 779 | 755 | - Paina toiminnon näppäintä. | |
| 780 | 756 | - Syötä toinen luku. | |
| 781 | 757 | - Paina "=" jolloin tulos näytetään. | |
| 782 | 758 | - Lopeta ohjelma. | |
| 783 | 759 | ||
| 784 | 760 | ## Intermezzo | |
| 785 | 761 | ||
| 786 | 762 | Kun kaikki tämä työ on tehty niin nyt on "käyttökelpoinen" laskin. Mutta jotkut asiat eivät ole aivan oikein. Ilmeinen asia on nollalla jakaminen. Ja painikkeet "C" ja "+/-" eivät toimi vielä. Nämä asiat käsitellään seuraavassa osassa. | |
| 787 | 763 | ||
| 788 | 764 | Katsotaanpa ensin lisätä toista aliohjelmaa, vain huvin vuoksi (no, ei enempää tietenkään :-)): | |
| 789 | 765 | ||
| 790 | 766 | - Mene lomakkeen `private` osioon ja lisää uusi aliohjelma: SetDisplayValue. | |
| 791 | 767 | ||
| 792 | 768 | ``` pascal | |
| 793 | 769 | ||
| 794 | 770 | private | |
| 795 | 771 | { private declarations } | |
| 796 | 772 | SelectedOperation: TOperationType; | |
| 797 | 773 | FirstNumber: longint; | |
| 798 | 774 | SecondNumber: longint; | |
| 799 | 775 | doClearDisplay: boolean; | |
| 800 | 776 | procedure AddDigit(const pDigit: byte); | |
| 801 | 777 | procedure StoreOperation(const pOperation: TOperationType); | |
| 802 | 778 | function GetDisplayValue: longint; | |
| 803 | 779 | procedure SetDisplayValue(const pValue: longint); | |
| 804 | 780 | ``` | |
| 805 | 781 | ||
| 806 | 782 | - Sijoita vilkkuva tekstikursori äskettäin tehdylle uudelle riville. | |
| 807 | - | ||
| 783 | + | - Paina `Ctrl`+`Shift`+`C` | |
| 808 | 784 | - Täydennä lähdekoodi (joka antaa näytölle uuden arvon) seuraavanlaiseksi: | |
| 809 | 785 | ||
| 810 | 786 | ``` pascal | |
| 811 | 787 | procedure TForm1.SetDisplayValue(const pValue: longint); | |
| 812 | 788 | begin | |
| 813 | 789 | edDisplay.Text := IntToStr(pValue); | |
| 814 | 790 | end; | |
| 815 | 791 | ``` | |
| 816 | 792 | ||
| 817 | 793 | Edellä oleva koodi pitäisi näyttää aika lailla tutulta. Tutustu aliohjelmaan, joka tekee kaikki laskelmat: | |
| 818 | 794 | ||
| 819 | 795 | ``` pascal | |
| 820 | 796 | procedure TForm1.btnCalculateClick(Sender: TObject); | |
| 821 | 797 | begin | |
| 822 | 798 | case SelectedOperation of | |
| 823 | 799 | otPlus : edDisplay.Text := IntToStr(FirstNumber + GetDisplayValue); | |
| 824 | 800 | otMinus : edDisplay.Text := IntToStr(FirstNumber - GetDisplayValue); | |
| 825 | 801 | otMultiply : edDisplay.Text := IntToStr(FirstNumber * GetDisplayValue); | |
| 826 | 802 | otDivide : edDisplay.Text := IntToStr(FirstNumber div GetDisplayValue); | |
| 827 | 803 | end; | |
| 828 | 804 | end; | |
| 829 | 805 | ``` | |
| 830 | 806 | ||
| 831 | 807 | Tämä aliohjelma voidaan nyt yksinkertaistaa. | |
| 832 | 808 | ||
| 833 | 809 | - Muuta lähdekoodiksi: | |
| 834 | 810 | ||
| 835 | 811 | ``` pascal | |
| 836 | 812 | procedure TForm1.btnCalculateClick(Sender: TObject); | |
| 837 | 813 | begin | |
| 838 | 814 | case SelectedOperation of | |
| 839 | 815 | otPlus : SetDisplayValue(FirstNumber + GetDisplayValue); | |
| 840 | 816 | otMinus : SetDisplayValue(FirstNumber - GetDisplayValue); | |
| 841 | 817 | otMultiply : SetDisplayValue(FirstNumber * GetDisplayValue); | |
| 842 | 818 | otDivide : SetDisplayValue(FirstNumber div GetDisplayValue); | |
| 843 | 819 | end; | |
| 844 | 820 | end; | |
| 845 | 821 | ``` | |
| 846 | 822 | ||
| 847 | 823 | ## Selvittämättömiä asioita | |
| 848 | 824 | ||
| 849 | 825 | On pari asiaa, jotka pitää vielä tehdä: toteuttaa kaksi painiketta ja tehdä laskin hieman vankempi. | |
| 850 | 826 | ||
| 851 | 827 | ### "+/-"- painike | |
| 852 | 828 | ||
| 853 | 829 | - Mene lomakkeelle. | |
| 854 | 830 | - Tuplaklikkaa painiketta "+/-" (luodaan tapahtumakäsittelijä). | |
| 855 | 831 | - Täydennä aliohjelma seuraavanlaiseksi: | |
| 856 | 832 | ||
| 857 | 833 | ``` pascal | |
| 858 | 834 | procedure TForm1.btnPlusMinusClick(Sender: TObject); | |
| 859 | 835 | begin | |
| 860 | 836 | SetDisplayValue(0 - GetDisplayValue); | |
| 861 | 837 | end; | |
| 862 | 838 | ``` | |
| 863 | 839 | ||
| 864 | 840 | Katso työn hedelmät! Käytetään uudelleen aliohjelmaa SetDisplayValue ja funktiota GetDisplayValue. Ne toteuttavat vastalukupainikkeen toiminnon. | |
| 865 | 841 | ||
| 866 | 842 | Kokeile ajamalla ohjelma ja paina "+/-" -painiketta. | |
| 867 | 843 | ||
| 868 | 844 | ### "C"-painike | |
| 869 | 845 | ||
| 870 | 846 | - Mene lomakkeelle. | |
| 871 | 847 | - Tuplaklikkaa painiketta "C" (luodaan tapahtumakäsittelijä). | |
| 872 | 848 | - Täydennä aliohjelma seuraavanlaiseksi: | |
| 873 | 849 | ||
| 874 | 850 | ``` pascal | |
| 875 | 851 | procedure TForm1.btnClearClick(Sender: TObject); | |
| 876 | 852 | begin | |
| 877 | 853 | SetDisplayValue(0); // Aloittaa alusta | |
| 878 | 854 | SelectedOperation := otNone; // Toimintoa ei ole vielä valittu | |
| 879 | 855 | doClearDisplay := false; // Näyttö on nyt nollattu | |
| 880 | 856 | end; | |
| 881 | 857 | ``` | |
| 882 | 858 | ||
| 883 | 859 | Edellä oleva koodi on melko itsestään selvä: Näyttö tyhjentyy (ensimmäinen rivi). Se "unohtaa" oliko vireillä jotain toimintaa tyhjentämällä SelectedOperation muuttujan. Ja kerrotaan ei tarvitse tyhjentää näyttöä, kun uusia numeroja lisätään, koska se oli jo tyhjentynyt aiemmin. | |
| 884 | 860 | ||
| 885 | 861 | ### Nollalla jako | |
| 886 | 862 | ||
| 887 | 863 | Kokeile jotain ihan "päätöntä": aja sovellus ja yrittä jakaa luku 10 luvulla 0. Tällöin sovellus kaatuu. Täytyy varmistaa, ettei tälläistä tapahdu. Se missä tämä tarkistetaan on tietysti paikka, jossa kaikki laskut suoritetaan (TForm1.btnCalculateClick). | |
| 888 | 864 | ||
| 889 | 865 | - Mene lomakkeelle. | |
| 890 | 866 | - Tuplaklikkaa painiketta "=" (Siirrytään tapahtumakäsittelijään). | |
| 891 | 867 | - Päivitä otDivide lause: | |
| 892 | 868 | ||
| 893 | 869 | ``` pascal | |
| 894 | 870 | procedure TForm1.btnCalculateClick(Sender: TObject); | |
| 895 | 871 | begin | |
| 896 | 872 | case SelectedOperation of | |
| 897 | 873 | otPlus : SetDisplayValue(FirstNumber + GetDisplayValue); | |
| 898 | 874 | otMinus : SetDisplayValue(FirstNumber - GetDisplayValue); | |
| 899 | 875 | otMultiply : SetDisplayValue(FirstNumber * GetDisplayValue); | |
| 900 | 876 | otDivide : if GetDisplayValue <> 0 then | |
| 901 | 877 | SetDisplayValue(FirstNumber div GetDisplayValue) | |
| 902 | 878 | else | |
| 903 | 879 | begin | |
| 904 | 880 | // Näytä virheviesti käyttäjälle | |
| 905 | 881 | MessageDlg('On mahdotonta jakaa numerolla nolla(0)!', mtWarning, [mbCancel],0); | |
| 906 | 882 | // Resetoidaan laskin. Aloitetaan puhtaalta pöydältä | |
| 907 | 883 | btnClearClick(nil); | |
| 908 | 884 | end; | |
| 909 | 885 | end; | |
| 910 | 886 | end; | |
| 911 | 887 | ``` | |
| 912 | 888 | ||
| 913 | 889 | Huomionarvoisia asioita: | |
| 914 | 890 | ||
| 915 | 891 | 1. *MessageDlg* on toiminto, jolla näytetään lyhyt varoitus / virhe / informatiivinen viesti käyttäjälle.Myös *ShowMessage* voidaan myös käyttää. Se on vähän helpompi käyttää, mutta ei voi näyttää varoitus / virhe kuvakkeet. | |
| 916 | 892 | 2. *btnClearClick(nil)*: heti kun virhetilanne syntyy niin täytyy nollata laskin. Toiminta on pohjimmiltaan sama kuin painamalla C-painiketta. "C"-painikkeen painamista simuloidaan suoraan kutsumalla sen tapahtumakäsittelijää. | |
| 917 | 893 | ||
| 918 | 894 | ### Ylivuodot | |
| 919 | 895 | ||
| 920 | 896 | - Käynnistä laskin | |
| 921 | 897 | - Anna 99999999 ensimmäisenä lukuna(8 numeroa) | |
| 922 | 898 | - Paina painiketta "*" | |
| 923 | 899 | - Anna 99999999 toisena lukuna | |
| 924 | 900 | - Paina painiketta '=' | |
| 925 | 901 | ||
| 926 | 902 | Nyt kaksi asiaa olisi voinut tapahtua: | |
| 927 | 903 | ||
| 928 | 904 | 1. Sovellus antaa väärän tuloksen (jotain 1674919425). | |
| 929 | 905 | 2. Sovellus nostaa virhe. | |
| 930 | 906 | ||
| 931 | 907 | Jos se on ensimmäinen vaihtoehto sitten ylivuoto virheet on poistettu projektista. Ne sallitaan rastittamalla ylivuoto ruutu: | |
| 932 | 908 | ||
| 933 | 909 | - Valitse valikosta Projekti / Projektikohtaiset asetukset... | |
| 934 | 910 | - Valitse puunäkymästä kääntäjän asetukset / Virheenjäljitys. | |
| 935 | 911 | - Rastita *Ylivuoto (-Co)* kohta (katso kuva alla). | |
| 936 | 912 | - Valitse OK. | |
| 937 | 913 | ||
| 938 | - | ||
| 939 | - | ||
| 940 | - | ||
| 941 | - | ||
| 914 | + |  | |
| 942 | 915 | ||
| 943 | 916 | Nyt kun ajaa ohjelmaa uudelleen niin tapahtuu ylivuotoja. | |
| 944 | 917 | ||
| 945 | 918 | Jos se oli toinen vaihtoehto tämä tarkoittaa, että täytyy lisätä [[Exceptions/fi|poikkeuskäsittelyä]] laskimeen. Poikkeuskäsittelyä käytetään estämään sovelluksen kaatumista kun virheitä esiintyy. Tässä tapauksessa halutaan käsitellä aritmeettinen ylivuoto virhe, joka saattaa esiintyä. Koska kaikki laskelmat tehdään yhdessä paikassa, se on helppo napata ylivuotovirheet kiinni. | |
| 946 | 919 | ||
| 947 | 920 | - Mene lomakkeelle. | |
| 948 | 921 | - Tuplaklikkaa painiketta "=" (Siirrytään tapahtumakäsittelijään). | |
| 949 | 922 | - Päivitä aliohjelma seuraavanlaiseksi: | |
| 950 | 923 | ||
| 951 | 924 | ``` pascal | |
| 952 | 925 | procedure TForm1.btnCalculateClick(Sender: TObject); | |
| 953 | 926 | begin | |
| 954 | 927 | // Napataan mikä tahansa ylivuotovirhe | |
| 955 | 928 | try | |
| 956 | 929 | case SelectedOperation of | |
| 957 | 930 | otPlus : SetDisplayValue(FirstNumber + GetDisplayValue); | |
| 958 | 931 | otMinus : SetDisplayValue(FirstNumber - GetDisplayValue); | |
| 959 | 932 | otMultiply : SetDisplayValue(FirstNumber * GetDisplayValue); | |
| 960 | 933 | otDivide : if GetDisplayValue <> 0 then | |
| 961 | 934 | SetDisplayValue(FirstNumber div GetDisplayValue) | |
| 962 | 935 | else | |
| 963 | 936 | begin | |
| 964 | 937 | // Näytä virheviesti käyttäjälle | |
| 965 | 938 | MessageDlg('On mahdotonta jakaa numerolla nolla(0)!', mtWarning, [mbCancel],0); | |
| 966 | 939 | // Resetoidaan laskin. Aloitetaan puhtaalta pöydältä | |
| 967 | 940 | btnClearClick(nil); | |
| 968 | 941 | end | |
| 969 | 942 | end; | |
| 970 | 943 | except | |
| 971 | 944 | on E: EIntOverflow do | |
| 972 | 945 | begin | |
| 973 | 946 | // Näytetään virheviesti | |
| 974 | 947 | MessageDlg('Laskelman tulos oli liian iso laskimen käsiteltäväksi!', mtWarning, [mbCancel], 0); | |
| 975 | 948 | // Resetoidaan laskin. Aloitetaan puhtaalta pöydältä | |
| 976 | 949 | btnClearClick(nil); | |
| 977 | 950 | end | |
| 978 | 951 | end | |
| 979 | 952 | end; | |
| 980 | 953 | ``` | |
| 981 | 954 | ||
| 982 | - | ||
| 955 | + | Huomaa, että vaikka poikkeusten käsittely on paikallaan niin sovellus vielä pysäyttää ajettaessa sitä kehitysympäristöstä käsin. Kuitenkin sovellus ainoastaan keskeytetyy ja on yhä aktiivinen. Paina `F9` jatkaaksesi. Tämä näyttää toisen pop up-ikkunan, debuggeri ilmoitus ikkuna. Paina Jatka. Nyt ohjelman oma poikkeuskäsittely "heittää" odotetun viestin. Jos sovellus ajetaan kehitysympäristön ulkopuolella niin sitten nähtäisiin vain se viesti mikä lisättiin poikkeuskäsittelyyn. | |
| 983 | 956 | ||
| 984 | 957 | ## Hienosäätö | |
| 985 | 958 | ||
| 986 | 959 | Muista, että tietyssä vaiheessa muuttuja nimeltä *SecondNumber* otettiin käyttöön. Jos valitaan Suorita / Kokoa valikosta, sitten rakentamisen jälkeen kääntäjä näyttää viestin "Kääntäjän viestit"-ikkunassa, että tätä tiettyä muuttujaa ei koskaan käytetä. Jos klikkaat kääntäjän viestin tekstiä kehitysympäristö avaa lähdekoodieditorissa kohdan, jossa muuttuja on määritelty. | |
| 987 | 960 | ||
| 988 | 961 | - Klikkaa viesti *Note: Private field "TForm1.SecondNumber" is never used*. | |
| 989 | 962 | - Poista longint muuttuja *SecondNumber*. | |
| 990 | 963 | ||
| 991 | 964 | Heti kun demo Laskin käynnistetään nähdään että numero 0 on valittuna näytössä (katso kuva alla). | |
| 992 | 965 | ||
| 993 | - | ||
| 994 | - | ||
| 995 | - | ||
| 996 | - | ||
| 966 | + |  | |
| 997 | 967 | ||
| 998 | 968 | Tämä on absurdia, koska käyttäjä ei pitäisi voida kirjoittaa mitään kyseiseen kohtaan. Vielä pahempaa, kun hän kirjoittaa jotain siellä, mikä ei ole numero, meidän laskin voisi kaatua! Joten on parempi olla antamatta pääsyä lainkaan tähän. Se pitää korjata. | |
| 999 | 969 | ||
| 1000 | 970 | - Mene lomakkeelle. | |
| 1001 | 971 | - Valitse näytön ohjaus (klikkaa edDisplay). | |
| 1002 | 972 | - Komponenttimuokkaimessa muuta ominaisuus ReadOnly arvoon [[True/fi|true]] (jos Tapahtumat-välilehti on vielä näkyvissä, valitse Ominaisuudet-välilehti ensin jotta päästään muuttamaan ominaisuuksia). Tästä lähtien se on mahdotonta antaa mitään tietoja manuaalisesti. | |
| 1003 | 973 | - Muuta TabStop arvoon [[False/fi|false]]. Nyt on mahdotonta päästä näyttökenttään näppäimistöllä ja näyttö kenttä ei korostettu enää. | |
| 1004 | 974 | ||
| 1005 | 975 | Suorita ohjelma nähdä näiden muutosten jälkeen. | |
| 1006 | 976 | ||
| 1007 | 977 | --- | |
| 1008 | 978 | *From the Free Pascal wiki, page "Howdy World (Hello World on steroids)/fi", as it stood on 2019-11-14 after a change by Djzepi, 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).* |
