Howdy World (Hello World on steroids)/fi

From Free Pascal wiki
Jump to navigationJump to search

English (en) suomi (fi) português (pt)

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.

Suositeltavaa luettavaa ennen tätä: Kattava Lazaruksen käyttöönotto.


Aloitus

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.

  • Luo uusi hakemisto tälle demo projektille (kutsutaan sitä $HOME/CalculatorDemo).

(Teksti, joka kuvaa toimia, jotka täytyy suorittaa on merkitty luettelomerkeillä kuten edellinen rivi.)

On siis aika aloittaa uusi Lazarus projekti.

  • Käynnistä Lazarus.
  • Valitse valikosta: Projekti / Uusi projekti...
  • Valintaikkun, joka näytetään valitse siinä: Sovellus ja paina OK (jos kehitysympäristö valittaa tallentamattomia muutoksia, paina ei).

Voit varmistaa, että kaikki tiedostot uudessa projektissa päätyvät oikeaan hakemistoon on projekti tallennettava ensin.

  • Valitse valikosta Tiedosto/Tallenna kaikki.
  • Valitse hakemisto, joka luotiin aiemmin ($ HOME / CalculatorDemo).
  • Anna projektille uusi nimi: CalculatorDemo
  • Paina tallenna
  • Kehitysympäristö haluaa tallentaa päälomakkeen samalla kertaa: kirjoita "ufrmMain. se on lomakkeen ja käännösyksikön nimi.
  • Kehitysympäristö kysyy että tiedoston tulisi muuttaa pienillä kirjaimilla kirjoitetuksi. Vahvista tämä painamalla näppäintä "Nimeä pienillä kirjaimilla".

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.

  • Valitse valikosta: Projekti / Projektikohtaiset asetukset ...
  • Valitse kääntäjän asetukset / Hakupolut (klikkaa solmun puunäkymää)
  • Kirjoita teksti bin\ ennen kohdetiedostonimeä (tai bin/ esim. unix/linux ympäristössä)
  • Huomaa myös lib etuliite käännöshakemisto kohdassa (älä muuta sitä).
  • Paina OK

Alla oleva kuva näyttää miten tämä on Windows koneella.

tutcal project options.png

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.

Nyt ensimmäisenä testinä projekti voidaan koota ja ajaa.

  • Paina F9 (pikanäppäin joka kokooaa, rakentaa ja suorittaa ohjelman)

Jos kaikki meni hyvin niin nähdään tyhjä ikkuna. Nyt tiedetään että ollaan luotu vankka perusta johon voidaan alkaa rakentaa ohjelmaa.

  • Lopeta käynnissä oleva ohjelma klikkaamalla sulje kuvaketta (käyttöjärjestelmä riippuvainen piirre).


Ensimmäinen komponentti

Lazaruksessa on komponenttipaletti:

tutcal component palette.png

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, jonka jälkeen Additional, Common jne. Komponentin 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 luokka). Selitystä komponenteista löytyy myös mm Kattava Lazaruksen käyttöönotto.

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.

Light bulb  Huomaa: Joskus visuaalisia komponentteja kutsutaan myös Controls:ksi. "Komponentin (component)" ja "control" erolla ei nyt ole merkitystä.

Jos halutaan sijoittaa komponentti lomakkeelle niin se on oltava valittuna. Painamalla F12-näppäintä se vaihtaa valituksi vuorotellen lomakkeen tai lähdekoodieditorin.

  • Paina F12- kerran tai kahdesti niin saadaan lomakkeen ikkunan päällimmäiseksi (katso kuva alla).

tutcal form on top.png

  • Valitse Standard välilehti komponenttipalettilta. Tämä on välilehti, joka on oletusarvoisesti valittuna.
  • Klikkaa TEdit komponenttia (Vinkki: viemällä kohdistin komponentin kuvakkeen päälle niin saadaan tieto luokan nimestä).
  • 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.

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.

tutcal object inspector.png

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.

Tee seuraavat muutokset komponentin Edit1 ominaisuuksiin.

  • Vaihda Name-ominaisuuden tekstiksi edDisplay.
  • Muuta Align-ominaisuus arvoon alTop (muuta Align, ei Alignment!).
  • Muuta Alignment-ominaisuus arvoon alRightJustify.
  • Muuta BorderSpacing.Around arvoon 6.
  • Vaihda Text-ominaisuus arvoon 0 (siis numero nolla, ei kirjain o).

Nämä ominaisuudet ovat melko itsestään selviä. Varsinkin kun edellä olevia muutoksia tehdään ja niiden vaikutuksia seurataan lomakkeella.

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.

  • Klikkaa jossain keskellä lomaketta. Tämä peruuttaa edDisplay-komponentin valinnan ja valitsee itse lomakkeen. Lomakkeen ominaisuudet näkyvät nyt komponenttimuokkaimessa.

Klikkaa komponenttimuokkaimessa Font-ominaisuutta. Font-rivi on nyt korostettu ja painike kolmella pisteellä ... näkyy.

  • Klikkaa painiketta, jossa on kolme pistettä. Tämä avaa dialogin Fontti.
  • Valitse kirjaimeksi Verdana, Lihavoitu (Bold), koko 10.
  • Paina OK.

Lomakkeen otsikko ei ole kovin mielekäs. Oletusteksti "Form1" näytetään.

  • Komponenttimuokaimessa klikkaa Caption-ominaisuutta.
  • Muuta Caption-ominaisuuden tekstiksi Calculator Demo.

Kaikkien näiden toimien tuloksena on lomake, joka näyttää (suurinpiirtein) tältä: tutcal form with tedit.png

Nyt on hyvä aika tallentaa tehty työ.

  • Valitaan valikosta Tiedosto / Tallenna tai paina näppäinyhdistelmää Ctrl+S.

Muista tallentaa ja tallentaa usein!


Painikkeet

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 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.

  • Valitse komponenttipaletilta TPanel-komponentti.
  • Klikkaa lomaketta sijoittaaksi paneelin siihen.

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.

  • Poista teksti Panel1 Panel1:n Caption-ominaisuudesta.
  • Vaihda Align arvoon alClient.
  • Muuta Borderspacing.Around arvoon 6.
  • Muuta lomakkeen Width (eli leveys) arvoon 300 (ensin klikataan Form1 komponenttimuokkaimen puunäkymässä).
  • Muuta lomakkeen Height (korkeus) arvoon 350.

(Koon kasvattaminen lomakkeella antaa tilaa komponenteille.)

Nyt lisätään numeronäppäimet.

  • Komponenttipaletilta valitaan TButton-komponentti.
  • 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.
  • Komponenttimuokkaimessa muuta Caption-tekstiksi 0.
  • Muuta Width arvoon 32.
  • Muuta Height arvoon 30 .
  • Muuta Name arvoon btnDigit0.

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ä.

  • Klikkaa hiiren oikeata painiketta yllä luodun 0-näppäimen päällä ja valitse kopioi ponnahdusvalikosta.
  • Klikkaa hiirtä jossain muualla Panel1:n alueella ja valitse Liitä. Toinen painike lisätään paneeliin. Ainoa ero ensimmäiseen painikeeseen on nimi btnDigit1.
  • Muuta komponenttimuokkaimessa Caption-tekstiksi 1.
  • Toista liitä toiminta 8 kertaa jolloin saadaan loput numero painikkeet.
  • Siirrä painikkeita lomakkeella niin että saadan tulos joka näyttää laskimelta:

tutcal calculator digits.png

Seuraavaksi on neljä painikketta matemaattisia laskuja varten (lisäys, vähennys jne).

  • Tuo uusi TButton-komponentti paneeliin.
  • Komponenttimuokkaimessa muuta Caption-tekstiksi +.
  • Muuta Width arvoon 32.
  • Muuta Height arvoon 30 .
  • Muuta Name arvoon btnFunction.
  • Kopio ja liitä näitä painikkeita kolme kertaa ja vaihda Caption-tekstiksi -, * ja /.
  • Sijoita painikkeet pystysuoraan, aivan numeronäppäinten viereen.

Ja "erikoisnäppäimet":

  • Kopioi ja liitä +-painike.
  • Muuta Caption arvoon +/-.
  • Muuta Name arvoon btnPlusMinus.
  • Sijoita painike painikkeen 3 alapuolella.
  • Kopioi ja liitä +-painike.
  • Muuta Caption arvoon C.
  • Muuta Name arvoon btnClear.
  • Sijoita painike painikkeen + oikealle puolen.
  • Kopioi ja liitä +-painike.
  • Muuta Caption arvoon =.
  • Muuta Name arvoon btnCalculate.
  • Sijoita painike painikkeen / oikealle puolen.

Kaikki painikkeet on sijoitettu, muuta lomaketta sopivan tiiviiksi.

Sen pitäisi näyttää tältä:

tutcal calculator gui ready.png

Muista tallentaa ja tallentaa usein!

Tapahtumiin vastaaminen

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.

  • Varmista, että lomakkeen kaikki painikkeet on näkyvissä (tarvittaessa paina F12 kerran tai kahdesti).
  • 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);
  • kirjoita seuraava koodi begin ja end väliin:
edDisplay.Text := edDisplay.Text + '0';

Eli edDisplay on TEdit-komponentti. Tapa muuttaa sen sisältöä on muokata sen Text-ominaisuutta. Edellä esitetty lause lisää numeron "0" muokkausruutuun ja tämä näkyy näytöllä välittömästi.

  • Tuplaklikkaa 1-painiketta
  • kirjoita seuraava koodi begin ja end väliin:
edDisplay.Text := edDisplay.Text + '1';

On hyvä idea kääntää koodin ajoittain tarkistaen syntaksivirheet (käännösaikainen virhe).

  • Valitse valikosta Suorita/Suorita (tai paina F9. Projekti käännetään ja sovellus käynnistyy.
  • 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.
  • Pysäytä Calculator Demo ohjelma.

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.

  • Lähdekoodieditori paikantaa rivit jossa luokka TForm1 on määritelty. Se näyttää tältä:
  
{ TForm1 }

  TForm1 = class(TForm)
    btnDigit0: TButton;
    btnDigit1: TButton;
    btnDigit2: TButton;
    btnDigit3: TButton;
    btnDigit4: TButton;
    btnDigit5: TButton;
    btnDigit6: TButton;
    btnDigit7: TButton;
    btnDigit8: TButton;
    btnDigit9: TButton;
    btnFunction: TButton;
    btnFunction1: TButton;
    btnFunction2: TButton;
    btnFunction3: TButton;
    btnCalculate: TButton;
    btnPlusMinus: TButton;
    btnClear: TButton;
    edDisplay: TEdit;
    Panel1: TPanel;
    procedure btnDigit0Click(Sender: TObject);
    procedure btnDigit1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

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!! Kehitysympäristö ei välttämättä ymmärrä niitä ja menee sekaisin. Paikka lisätä mukautettuja muuttujia, aliohjelmia ja funktioita on private tai 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).

Takaisin numeron näyttö ongelmaan: tarvitaan aliohjelma, joka lisää numeron näytölle, jossa itse numerot voi vaihdella.

  • Lisää procedure AddDigit lomakkeen private osioon.
  
  private
    { private declarations }
    procedure AddDigit(const pDigit: byte);
  public
    { public declarations }
  end;

Seuraavaksi aliohjelman AddDigit varsinainen koodi olisi syötettävä. Jälleen voidaan hyödyntää kehitysympäristöä:

  • Sijoita vilkkuva tekstikursori AddDigit riville.
  • Paina näppäinyhdistelmää Ctrl+ Shift+C.

Kehitysympäristö luo määritelmän tälle uudelle aliohjelmalle ja asettaa tekstikursorin tyhjän rungon sisälle. Jolloin heti voidaan aloittaa kirjoittaminen.

  • Lisää seuraava koodi AddDigit aliohjelman runkoon:
edDisplay.Text := edDisplay.Text + IntToStr(pDigit);

Huomaa että function IntToStr() muuttaa numeerisen arvon, numeron, merkkijono arvoksi jotta se voidaan lisätä näytön tekstiin.

Nyt käyttää tätä aliohjelmaa kaikissa numeroissa 0..9:

  • Avaa lomake (tarvittaessa paina F12 kerran tai kahdesti).
  • Tuplaklikkaa numeropainiketta 0: tämä avaa lähdekoodieditorissa painikkeen 0 tapahtumakäsittelijä kohtaan.
  • Korvaa koodin tapahtumakäsittelijä: aliohjelmakutsulla AddDigit (0). Kokonaisuudessaan aliohjelma näyttää tältä:
procedure TForm1.btnDigit0Click(Sender: TObject);
begin
  AddDigit(0);
end;
  • Tee sama numero painike 1:lle:
procedure TForm1.btnDigit1Click(Sender: TObject);
begin
  AddDigit(1);
end;

Ennen kuin teet tämän sekvenssin kaikkille muille numeropainikkeille, varmista, että tämä todella tekee sen mitä halutaan.

  • Suorita ohjelma (paina F9 ).
  • Klikkaa numeroita 0 ja 1 pari kertaa ja katso että se todella toimii.
  • Sulje ohjelma.

Hyvä ohjelmoija on laiska ohjelmoija

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.

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...

  • Avaa lomake (tarvittaessa paina F12 kerran tai kahdesti).
  • Valitse numeron 1 painike (klikkaa sitä kerran).
  • Siirry komponenttimuokkaimessa Tag ominaisuuteen ja muuta sen arvoksi 1.
  • Valitse numeron 2 painikke (klikkaa sitä kerran).
  • Siirry komponenttimuokkaimessa Tag ominaisuuteen ja muuta sen arvoksi 2.
  • Toista tämä numerojen 3..9 painikkeilla.

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:

  • Avaa lomake.
  • Tuplaklikkaa numeropainiketta 0 (Tämä avaa lähdekoodieditorin numeropainikkeen 0 tapahtumankäsittelijän).
  • Huomaa, että aliohjelmalla btnDigit0Click on parametri Sender joka on tyyppiä TObject.
procedure TForm1.btnDigit0Click(Sender: TObject);

Parametri Sender on käytännössä viittaus painikkeeseen, jota painettiin. Typecasting avulla voidaan parametria käyttää kuin se olisi TButton.

  • Muuta koodi näin:
procedure TForm1.btnDigit0Click(Sender: TObject);
begin
  AddDigit(TButton(Sender).Tag);
end;

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!

Katsotaanpa tarkemmin komponenttimuokkaimella.

  • Valitse lomake.
  • Valitse numeropainike 0 (btnDigit0).
  • Komponenttimuokkaimessa valitse tapahtumat välilehti (katso alla).


tutcal oi events.png

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ä).

  • Lomakkeelle: valitse numeropainike 2. Komponenttimuokkaimessa voidaan nyt nähdä, että ei ole onClick tapahtumakäsittelijää painikkeella 2.
  • Avaa onClick tapahtuman pudotusvalikko ja valitse btnDigit0Click.
  • Tee tämä sama kaikille muille numeropainikkeille 3..9.

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ää.

  • Lomakkeella: valitaan numeron 1 näppäin. Komponenttimuokkaimessa voidaan nyt nähdä, että tapahtumakäsittelijä todellakin on btnDigit1Click.
  • Avaa onclick tapahtuman pudotusvalikko ja valitse btnDigit0Click.

Nyt kaikki painikkeet jakavat saman tapahtumakäsittelyn ja lisää numeroa näyttöruudussa.

  • Suorita ohjelma (paina F9 ).
  • Klikkaa kaikkia numeropainikkeita 0..9 muutamia kertoja ja totea että de todellakin toimii.
  • Sulje ohjelma.

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ä.

  • Valikossa valitse Työkalut / Asetukset.
  • Klikkaa Editori / Koodin täydennys ja vihjeet.
  • Salli (klikkaa) vaihtoehto Poista automaattisesti tyhjät metodit päälle (katso kuva alla).
  • Paina OK.

tutcal auto remove.png

Tästä lähtien kaikki tyhjät metodit poistetaan automaattisesti heti, kun lähdetiedosto tallennetaan.

  • Paikallista aliohjelma procedure TForm1.btnDigit1Click(Sender: TObject)
  • Poista rivi AddDigit(1);
  • Tallenna tiedosto (paina Ctrl + s tai valitsemalla valikosta Tiedosto / Tallenna). Nyt tyhjä aliohjelma poistetaan automaattisesti.


Hienosäätöä

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.

Poistetaan etunollat

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.

  • Paikanna aliohjelma procedure TForm1.AddDigit(const pDigit: byte)
  • Muuta koodi seuraavanlaiseksi:
procedure TForm1.AddDigit(const pDigit: byte);
begin
  // Poistaa etunollan lisättäessä numeroa
  if edDisplay.Text = '0' then
    edDisplay.Text := IntToStr(pDigit)
  else
    edDisplay.Text := edDisplay.Text + IntToStr(pDigit)
end;

Rajaa numeroiden määrä

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:

  • Paikanna aliohjelma procedure TForm1.AddDigit(const pDigit: byte)
  • Muuta koodi seuraavanlaiseksi:
procedure TForm1.AddDigit(const pDigit: byte);
begin
  // Rajoittaa numeroiden määrän
  if length(edDisplay.Text) < 8 then
  begin
    // Poistaa etunollan lisättäessä numeroa
    if edDisplay.Text = '0' then
      edDisplay.Text := IntToStr(pDigit)
    else
      edDisplay.Text := edDisplay.Text + IntToStr(pDigit);
  end;
end;

Toiminnot

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:

  1. Käyttäjä syöttää luvun
  2. Käyttäjä painaa toimintonäppäintä (esimerkiksi "+")
  3. Käyttäjä syöttää toisen luvun
  4. Käyttäjä painaa "="
  5. Ohjelma vastaa lisäämällä ensimmäisen ja toisen luvun

Heti kun käyttäjä painaa "=" -painiketta ohjelma on tiedettävä kolme asiaa:

  1. Mikä oli toiminto?
  2. Mikä oli ensimmäinen luku?
  3. Mikä oli toinen luku?

Mikä oli toiminto?

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.

  • Lähdekoodieditorissa siirrytään paikkaan, jossa lomake on määritelty.
  • Sen yläpuolella lisätään lueteltun tyypin määritys TOperationType kaikille tuetuille toiminnoille (Lähdekoodi täydennetään seuraavanlaiseksi):
 
type

  { Kaikki tuetut toiminnot laskimessa }
  TOperationType = (otNone, otPlus, otMinus, otMultiply, otDivide);

  { TForm1 }

  TForm1 = class(TForm)
  • Tilapäisen toiminnan tallennukseen muuttuja (SelectedOperation)

, joka lisätään private osaan lomakkeen luokan määrittelyyn.

  
  private
    { private declarations }
    SelectedOperation: TOperationType;
    procedure AddDigit(const pDigit: byte);

Mikä oli ensimmäinen luku?

Ensimmäisen luvun tilapäiseen tallennukseen tarvitaan muuttuja.

  • Lisätään muuttuja (FirstNumber) lomakkeen private osioon.
  
  private
    { private declarations }
    SelectedOperation: TOperationType;
    FirstNumber: longint;
    procedure AddDigit(const pDigit: byte);

Mikä oli toinen luku?

  • Lisätään myös muuttuja SecondNumber lomakkeen private osioon (samaan missä on FirstNumber) ja tehdään siitä myös longint tyyppinen.

Mitähän seuraavaksi?

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ä.

  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "+". Kehitysympäristö luo tapahtumankäsittelijän ja tekstikursori on sijoitettu tyhjälle riville begin end lohkon sisään.

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.

  • Mene lomakkeen private osioon ja lisää uusi aliohjelma: StoreOperation.
  
  private
    { private declarations }
    SelectedOperation: TOperationType;
    FirstNumber: longint;
    SecondNumber: longint;
    procedure AddDigit(const pDigit: byte);
    procedure StoreOperation(const pOperation: TOperationType);
  • Sijoita vilkkuva tekstikursori äskettäin tehdylle uudelle riville.
  • Paina Ctrl+ Shift +C (Tiedät jo mitä nyt tapahtuu…).

Aliohjelmassa StoreOperation on tehtävä kaksi asiaa: tallentaa toiminto ja tallentaa luku, joka on näytössä, jolloin sitä voidaan käyttää myöhemmin.

  • Lisää seuraava koodi viimeksi luodulle aliohjelmalle:
procedure TForm1.StoreOperation(const pOperation: TOperationType);
begin
  // tallentaa toiminnon
  SelectedOperation := pOperation;

  // tallentaa luvun
  FirstNumber := StrToInt(edDisplay.Text);
end;

Ok, takaisin "+" -painikkeeseen:

  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "+".
  • Lisää seuraava koodi: StoreOperation(otPlus);
  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "-".
  • Lisää seuraava koodi: StoreOperation(otMinus);
  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "*".
  • Lisää seuraava koodi: StoreOperation(otMultiply);
  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "/".
  • Lisää seuraava koodi: StoreOperation(otDivide);

Nyt hyvä testata ohjelmaa ja katsoa mitä tapahtuu:

  • Suorita ohjelma (paina F9 )
  • Anna luku (esim. 21267)
  • Paina '+'-painiketta
  • Anna seuraava luku (esim. 31170)

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.

  • Mene lomakkeen private osioon ja lisää uusi muuttuja: doClearDisplay. Tämä boolean muuttujaa kertoo milloin tehdään näytön tyhjennys.
  private
    { private declarations }
    SelectedOperation: TOperationType;
    FirstNumber: longint;
    SecondNumber: longint;
    doClearDisplay: boolean;
    procedure AddDigit(const pDigit: byte);
    procedure StoreOperation(const pOperation: TOperationType);
  • Sijoita vilkkuva tekstikursori StoreOperation riville.
  • Paina Ctrl+ Shift+: tämä siirtää kohdistimen aliohjelman StoreOperation runkoon.
  • 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:
procedure TForm1.StoreOperation(const pOperation: TOperationType);
begin
  // tallentaa toiminnon
  SelectedOperation := pOperation;
  // tallentaa luvun
  FirstNumber := StrToInt(edDisplay.Text);
  // Näytön muistiin että täytyy aloittaa uusi luku
  doClearDisplay := true; 
end;
  • Ja missä parempi tyhjentää näytön kuin AddDigit aliohjelma? Muuta koodia seuraavanlaiseksi:
procedure TForm1.AddDigit(const pDigit: byte);
begin
  // Täytyykö näyttö tyhjentää ensin?
  if doClearDisplay then
  begin
    edDisplay.Text := '0';   // Laitetaan näyttöön nolla
    doClearDisplay := false; // Tyhjennys tehty
  end;

  // Rajoittaa numeroiden määrän
  if length(edDisplay.Text) < 8 then
  begin
    // Poistaa etunollan lisättäessä numeroa
    if edDisplay.Text = '0' then
      edDisplay.Text := IntToStr(pDigit)
    else
      edDisplay.Text := edDisplay.Text + IntToStr(pDigit);
  end;   
end;

Nyt hyvä testata ohjelmaa ja katsoa mitä tapahtuu:

  • Suorita ohjelma (paina F9 )
  • Anna luku
  • Paina toiminnon näppäintä.
  • Syötä toinen luku.
  • Lopeta ohjelma.

Jo ollaan aika pitkällä: voidaan kirjoittaa numeroita ja valita toiminto. Nyt on aika tehdä todellisia laskelmia.


Tehdään laskutoimitukset

Nyt kun on tallennettu luvut ja toiminta, on aika tehdä todellisia laskelmia. Aloitetaan helppolla: yhteenlaskulla.

  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "=" (tapahtumakäsittelijä luodaan).
  • Täydennä aliohjelma tälläiseksi:
procedure TForm1.btnCalculateClick(Sender: TObject);
var result: longint;
begin
  case SelectedOperation of
    otPlus: begin
              // Nouda toinen luku
              SecondNumber := StrToInt(edDisplay.Text);
              // Laske lasku
              result := FirstNumber + SecondNumber;
              // Näytettävä tulos
              edDisplay.Text := IntToStr(result);  
            end;
  end;
end;

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 of valintarakennetta.


Nyt on toimiva laskin (joka voi vain lisätä kaksi lukua):

  • Suorita ohjelma (paina F9 )
  • Anna luku
  • Paina +-painiketta.
  • Syötä toinen luku.
  • Paina '=' jolloin kahden luvun summa näkyy.
  • Lopeta ohjelma.

Nyt voisi lisätä kolme muuta puuttuvaa toimintoa ( '-', '*' ja '/'). Mutta ei vielä, on parantamisen varaa. Katsotaan seuraava lausetta:

SecondNumber := StrToInt(edDisplay.Text);

Olemme nähneet tämän tapaisen lauseen ennenkin: Aliohjelma StoreOperation sisältää jotain vastaavaa:

FirstNumber := StrToInt(edDisplay.Text);

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.

  • Lähdekoodieditorissa siirrytään paikkaan, jossa on lomakkeen private osio ja lisätään uusi funktio GetDisplayValue:
   
private
    { private declarations }
    SelectedOperation: TOperationType;
    FirstNumber: longint;
    SecondNumber: longint;
    doClearDisplay: boolean;
    procedure AddDigit(const pDigit: byte);
    procedure StoreOperation(const pOperation: TOperationType);
    function GetDisplayValue: longint;
  • Sijoita vilkkuva tekstikursori äskettäin tehdylle uudelle riville.
  • Paina Ctrl+ Shift+C
  • Täydennä lähdekoodi seuraavanlaiseksi (eli se poimii arvon, joka on näyttökentässä):
function TForm1.GetDisplayValue: longint;
begin
  result := StrToInt(edDisplay.Text);
end;
  • Paikallista lause (etsi rivi): FirstNumber: = StrToInt (edDisplay.Text);
  • Muuta se: FirstNumber := GetDisplayValue;

Jonkin verran koodin uudelleen kirjoittamista, takaisin laskentaan.

  • Paikallista lause (etsi rivi): SecondNumber := StrToInt(edDisplay.Text);
  • Muuta se: SecondNumber := GetDisplayValue;

Nyt katso seuraavat lausetta:

              // Nouda toinen luku
              SecondNumber := GetDisplayValue;
              // Laske lasku
              result := FirstNumber + SecondNumber;

Muuttujaa SecondNumber käytetään tallentamaan arvo näyttöruudusta. Kuitenkin se ei ole välttämättä tarpeen. Edellä oleva koodi voidaan yksinkertaistaa:

              // Laske lasku
              result := FirstNumber + GetDisplayValue;

Nyt katsotaan seuraavia lauseita:

              // Laske lasku
              result := FirstNumber + GetDisplayValue;
              // Näytettävä tulos 
              edDisplay.Text := IntToStr(result);

Sama koskee myös result muuttujaa. Edellä oleva koodi voidaan yksinkertaistaa:

              // Näytettävä tulos 
              edDisplay.Text := IntToStr(FirstNumber + GetDisplayValue);

Nyt voimme lisätä kolme jäljellä olevaa toimintaa.

  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "=" (siirrytään tapahtumakäsittelijään).
  • Muuta aliohjelma tälläiseksi:
procedure TForm1.btnCalculateClick(Sender: TObject);
begin
  case SelectedOperation of
    otPlus     : edDisplay.Text := IntToStr(FirstNumber + GetDisplayValue);
    otMinus    : edDisplay.Text := IntToStr(FirstNumber - GetDisplayValue);
    otMultiply : edDisplay.Text := IntToStr(FirstNumber * GetDisplayValue);
    otDivide   : edDisplay.Text := IntToStr(FirstNumber div GetDisplayValue);
  end;
end;

Nyt on toimiva laskin kaikille neljälle toiminnolle:

  • Suorita ohjelma (paina F9 )
  • Anna luku
  • Paina toiminnon näppäintä.
  • Syötä toinen luku.
  • Paina "=" jolloin tulos näytetään.
  • Lopeta ohjelma.


Intermezzo

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.

Katsotaanpa ensin lisätä toista aliohjelmaa, vain huvin vuoksi (no, ei enempää tietenkään :-)):

  • Mene lomakkeen private osioon ja lisää uusi aliohjelma: SetDisplayValue.
  
  private
    { private declarations }
    SelectedOperation: TOperationType;
    FirstNumber: longint;
    SecondNumber: longint;
    doClearDisplay: boolean;
    procedure AddDigit(const pDigit: byte);
    procedure StoreOperation(const pOperation: TOperationType);
    function GetDisplayValue: longint;
    procedure SetDisplayValue(const pValue: longint);
  • Sijoita vilkkuva tekstikursori äskettäin tehdylle uudelle riville.
  • Paina Ctrl+ Shift+C
  • Täydennä lähdekoodi (joka antaa näytölle uuden arvon) seuraavanlaiseksi:
procedure TForm1.SetDisplayValue(const pValue: longint);
begin
  edDisplay.Text := IntToStr(pValue);
end;

Edellä oleva koodi pitäisi näyttää aika lailla tutulta. Tutustu aliohjelmaan, joka tekee kaikki laskelmat:

procedure TForm1.btnCalculateClick(Sender: TObject);
begin
  case SelectedOperation of
    otPlus     : edDisplay.Text := IntToStr(FirstNumber + GetDisplayValue);
    otMinus    : edDisplay.Text := IntToStr(FirstNumber - GetDisplayValue);
    otMultiply : edDisplay.Text := IntToStr(FirstNumber * GetDisplayValue);
    otDivide   : edDisplay.Text := IntToStr(FirstNumber div GetDisplayValue);
  end;
end;

Tämä aliohjelma voidaan nyt yksinkertaistaa.

  • Muuta lähdekoodiksi:
procedure TForm1.btnCalculateClick(Sender: TObject);
begin
  case SelectedOperation of
    otPlus     : SetDisplayValue(FirstNumber + GetDisplayValue);
    otMinus    : SetDisplayValue(FirstNumber - GetDisplayValue);
    otMultiply : SetDisplayValue(FirstNumber * GetDisplayValue);
    otDivide   : SetDisplayValue(FirstNumber div GetDisplayValue);
  end;
end;

Selvittämättömiä asioita

On pari asiaa, jotka pitää vielä tehdä: toteuttaa kaksi painiketta ja tehdä laskin hieman vankempi.


"+/-"- painike

  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "+/-" (luodaan tapahtumakäsittelijä).
  • Täydennä aliohjelma seuraavanlaiseksi:
procedure TForm1.btnPlusMinusClick(Sender: TObject);
begin
  SetDisplayValue(0 - GetDisplayValue);
end;

Katso työn hedelmät! Käytetään uudelleen aliohjelmaa SetDisplayValue ja funktiota GetDisplayValue. Ne toteuttavat vastalukupainikkeen toiminnon.

Kokeile ajamalla ohjelma ja paina "+/-" -painiketta.

"C"-painike

  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "C" (luodaan tapahtumakäsittelijä).
  • Täydennä aliohjelma seuraavanlaiseksi:
procedure TForm1.btnClearClick(Sender: TObject);
begin
  SetDisplayValue(0);          // Aloittaa alusta
  SelectedOperation := otNone; // Toimintoa ei ole vielä valittu
  doClearDisplay := false;     // Näyttö on nyt nollattu
end;

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.

Nollalla jako

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).

  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "=" (Siirrytään tapahtumakäsittelijään).
  • Päivitä otDivide lause:
procedure TForm1.btnCalculateClick(Sender: TObject);
begin
  case SelectedOperation of
    otPlus     : SetDisplayValue(FirstNumber + GetDisplayValue);
    otMinus    : SetDisplayValue(FirstNumber - GetDisplayValue);
    otMultiply : SetDisplayValue(FirstNumber * GetDisplayValue);
    otDivide   : if GetDisplayValue <> 0 then
                       SetDisplayValue(FirstNumber div GetDisplayValue)
                   else
                     begin
                       // Näytä virheviesti käyttäjälle
                       MessageDlg('On mahdotonta jakaa numerolla nolla(0)!', mtWarning, [mbCancel],0);
                       // Resetoidaan laskin. Aloitetaan puhtaalta pöydältä
                       btnClearClick(nil);
                     end;
  end;
end;

Huomionarvoisia asioita:

  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.
  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ää.

Ylivuodot

  • Käynnistä laskin
  • Anna 99999999 ensimmäisenä lukuna(8 numeroa)
  • Paina painiketta "*"
  • Anna 99999999 toisena lukuna
  • Paina painiketta '='

Nyt kaksi asiaa olisi voinut tapahtua:

  1. Sovellus antaa väärän tuloksen (jotain 1674919425).
  2. Sovellus nostaa virhe.

Jos se on ensimmäinen vaihtoehto sitten ylivuoto virheet on poistettu projektista. Ne sallitaan rastittamalla ylivuoto ruutu:

  • Valitse valikosta Projekti / Projektikohtaiset asetukset...
  • Valitse puunäkymästä kääntäjän asetukset / Virheenjäljitys.
  • Rastita Ylivuoto (-Co) kohta (katso kuva alla).
  • Valitse OK.

tutcal compiler overflow.png

Nyt kun ajaa ohjelmaa uudelleen niin tapahtuu ylivuotoja.

Jos se oli toinen vaihtoehto tämä tarkoittaa, että täytyy lisätä 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.


  • Mene lomakkeelle.
  • Tuplaklikkaa painiketta "=" (Siirrytään tapahtumakäsittelijään).
  • Päivitä aliohjelma seuraavanlaiseksi:
procedure TForm1.btnCalculateClick(Sender: TObject);
begin
  // Napataan mikä tahansa ylivuotovirhe
  try
    case SelectedOperation of
      otPlus     : SetDisplayValue(FirstNumber + GetDisplayValue);
      otMinus    : SetDisplayValue(FirstNumber - GetDisplayValue);
      otMultiply : SetDisplayValue(FirstNumber * GetDisplayValue);
      otDivide   : if GetDisplayValue <> 0 then
                     SetDisplayValue(FirstNumber div GetDisplayValue)
                   else
                     begin
                       // Näytä virheviesti käyttäjälle
                       MessageDlg('On mahdotonta jakaa numerolla nolla(0)!', mtWarning, [mbCancel],0);
                       // Resetoidaan laskin. Aloitetaan puhtaalta pöydältä
                       btnClearClick(nil);
                     end
    end;
  except
    on E: EIntOverflow do
      begin
        // Näytetään virheviesti
        MessageDlg('Laskelman tulos oli liian iso laskimen käsiteltäväksi!', mtWarning, [mbCancel], 0);
        // Resetoidaan laskin. Aloitetaan puhtaalta pöydältä
        btnClearClick(nil);
      end
  end
end;

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.


Hienosäätö

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.

  • Klikkaa viesti Note: Private field "TForm1.SecondNumber" is never used.
  • Poista longint muuttuja SecondNumber.

Heti kun demo Laskin käynnistetään nähdään että numero 0 on valittuna näytössä (katso kuva alla).


tutcal calculator focus.png

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.

  • Mene lomakkeelle.
  • Valitse näytön ohjaus (klikkaa edDisplay).
  • Komponenttimuokkaimessa muuta ominaisuus ReadOnly arvoon 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.
  • Muuta TabStop arvoon false. Nyt on mahdotonta päästä näyttökenttään näppäimistöllä ja näyttö kenttä ei korostettu enää.

Suorita ohjelma nähdä näiden muutosten jälkeen.