Object Pascal Pascal kielen oliolaajennus (Inprise/Borland:n oma) luokat Voit uudelleenkäyttää luomiasi objekteja esim. komponentteja Periytyminen Kielioppia: toisin kuin Javassa Ei eroa isojen ja pienien kirjainten välillä ISO on sama kuin iso tai iso Merkkijonovakiot määritellään yksinkertaisten lainausmerkkien sisällä esim. vakio Merkkivakio on yhden merkin mittainen merkkijono esim. 'a' Sijoitusoperaattori := Yhtäsuuruus = Erisuuruus <> Ei-operaattori not Begin-end korvaa {} Kommentointi { }, // tai (* *) 1 2 3 Delphi ohjelmien rakenteesta Ohjelma koostuu lähdekoodia sisältävistä käännösyksiköistä (units), jotka ovat kukin omassa tiedostossaan Käännösyksiköt mahdollistavat suurien ohjelmien jakamisen pienempiin moduuleihin, joita voidaan editoida yksitellen 4 Jokainen ohjelma koostuu yhdestä pääohjelmasta, joka sisältyy projektitiedostoon (.dpr) yhdestä tai useammasta käännösyksiköstä (*.pas) Jokaista lomaketta (form) kohti on olemassa yksi käännösyksikkö Ohjelmaansa voi lisätä käännösyksiköitä, jotka eivät liity mihinkään lomakkeeseen ohjelmalogiikka tulisi sijoittaa tällaisiin yksiköihin 5 Pääohjelman rakenne program Nimi; //ohjelman nimi //mahdollinen uses-lohko, muuttujien esittelyt //sekä mahdolliset parametrit kääntäjälle //pääohjelma alkaa //ohjelmakoodi end. //pääohjelma loppuu (huomaa piste) 6
Pääohjelma esim. (konsoli) Pääohjelman esim. (GUI) Käännösyksikön rakenne program Nimi; //ohjelman nimi program Salakirjoitus; //ohjelman nimi unit Nimi; //yksikön nimi {$APPTYPE CONSOLE} //parametri kääntäjälle uses SysUtils; //tarvittaviin yksiköihin viittaukset var MJono: String; //muuttujien esittely //pääohjelma alkaa MJono := 'Hello world!'; WriteLn(Mjono); end. //pääohjelma loppuu 7 uses //tarvittaviin yksiköihin viittaukset Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} //parametri kääntäjälle //pääohjelma alkaa Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. //pääohjelma loppuu 8 interface //esittelyosa //Muiden yksiköiden käyttöön tarjottavien //vakioiden, muuttujien, tyyppien, proseduurien ja //funktioiden esittelyt. Myös uses-lohko. 9 implementation //toteutusosa //Interface-lohkossa esiteltyjen proseduurien ja //funktioiden toteutukset eli ohjelmakoodi. //Lisäksi tässä osassa voi olla yksikön omaan //käyttöön tarkoitettujen vakioiden, tyyppien, //muuttujien, proseduurien ja funktioiden //esittelyt. end. //yksikkö loppuu Muuttujat Perustietotyypit Integer: kokonaislukutyyppi 32-bit longint ( 2147483648.. 2147483647) Char: merkkityyppi, voi sisältää yhden merkin Boolean: totuusarvo, true tai false Real: reaalilukutyyppi eri versioita String: merkkijonotyyppi eri versioita Muuttujien esittely var-lohkossa Var-lohko voi esiintyä yksikkötasolla (esim. interface-osassa) paikallisella tasolla proseduurin tai funktion var-lohkossa 10 11 12
Tyypit Uudet tyypit määritellään type-lohkossa Delphin valmiit tyyppinimet alkavat T-kirjaimella, samaa tapaa voi käyttää omassa nimeämisessäkin type TMyString = String; var S: TMyString; S := 'Halloota mualima!' Lueteltu tyyppi (enumerated type) Esim. lueteltu tyyppi TKorttiMaa, jonka mahdollisia arvoja ovat hertta, ruutu, risti ja pata type TKorttiMaa = (hertta, ruutu, risti, pata); var maa: TKorttiMaa; maa := ruutu; maa := succ(maa); //seuraava listan mukainen arvo if (maa = risti) then Tietueet Kokoelma toisiinsa liittyviä tietoja, jotka on varastoitu yhteen tietorakenteeseen Esitellään record-avainsanan kanssa typelohkossa type Tietuetyypinnimi = record kenttä1: tietotyyppi; kenttä2: tietotyyppi; kenttän: tietotyyppi; 13 14 15 program tietueohj; type Henkilotiedot = record Nimi : String; Osoite : String; Ika : Integer; var Tietue : Henkilotiedot; Tietue.Nimi := 'Matti'; Tietue.Ika := 55; end. 16 Tyyppikonversiot IntToStr: kokonaisluku merkkijono StrToInt: merkkijono kokonaisluku CurrToStr: valuutta merkkijono StrToCurr: merkkijono valuutta TimeToStr: DateTime merkkijono StrToDate: merkkijono DateTime FloatToStr: liukuluku merkkijono StrToFloat: merkkijono liukuluku Int: liukuluku kokonaisluku Round: liukuluku kokonaisluku (pyöristys) Chr: kokonaisluku (ASCII-koodi) Char 17 Ord: alkio järjestysnro Ord('A') -> 65 Chr(65) -> 'A' Ord(risti) -> 3 Esimerkki tyyppikonversiosta: //Merkkijonon muunnos kokonaisluvuksi //laskutoimitusta varten luku := StrToInt(Edit1.text); luku := luku + 5; Label1.caption := IntToStr(luku); 18
Vakiot Arvo määrätään kerran ja sitä ei sen jälkeen muuteta Määrittely tapahtuu const-lohkossa const OletusIka = 20; Vakion esittelyssä käytetään yhtäsuuruusmerkkiä if-lause Valintalauseet if ehtolause then lause else lause; if (luku < 4 and luku > 2) then Edit1.text := 'Luku on kolme'; luku := 0; end //Huom! Ei puolipistettä, jos else-lause else //ei pakollinen osa Edit1.text := 'Luku on jotain muuta'; case-lause case lauseke of arvovaihtoehto1: lause; arvovaihtoehto2: lause;.. arvovaihtoehton: lause; else lause; case Kluku1 of //lausekkeen oltava ordinaali 0: Edit1.text := 'Nolla'; 1,2: Edit1.text := 'Yksi tai kaksi'; 3..6: Edit1.text := 'Kolmesta kuuteen'; else Edit1.text := 'Jokin muu'; //ei pakollinen 19 20 21 Toistolauseet repeat until, while ja for repeat lause until ehtolause while ehto do lause for indeksi:=alaraja to yläraja do lause for indeksi:=yläraja downto alaraja do lause 22 vastaus := 0; repeat vastaus := vastaus + 1; until vastaus > 10; while vastaus <= 20 do vastaus := vastaus + 2; vastaus := vastaus - 1; for i:=1 to 10 do vastaus := vastaus*i; 23 Aliohjelmat Aliohjelmatyyppejä ovat proseduurit (eivät palauta mitään) funktiot (palauttavat arvon) Parametrit erotetaan puolipisteellä (;) peräkkäiset samantyyppiset vaihtoehtoisesti pilkulla (a,b,c: tyyppi) Proseduurit Kun parametrin nimen edessä var-sana, ns. muuttujaparametri const-sana, parametrin arvoa ei voi muuttaa Proseduurista poistuminen kesken: exit; 24
procedure testi(luku1: Integer; var luku2: Integer; const luku3: Integer); luku1 := luku1 + 50; luku2 := luku2 + 50; //muuttaa kutsussa käytetyn //muuttujan arvoa //luku3 := luku3 + 50; //ei mene kääntäjästä läpi //pääohjelma //Kluku1, Kluku2, Kluku3 = 10 testi(kluku1, Kluku2, Kluku3) //Kluku1: 10, Kluku2: 60, Kluku3: 10 end. Funktiot Arvo palautetaan sijoittamalla se funktion nimeen tai result-muuttujaan, sijoitus ei lopeta funktion suorittamista (Javan return-kutsu) Parametrit kuten proseduureissa function testi2(luku1: Integer) : Integer; result := luku1 * 5; Proseduurin tai funktion ylikuormitus Sama nimi, mutta eri parametrit ja/tai eri tyyppinen palautusarvo procedure Store(X: Longint); overload; procedure Store(X: Shortint); overload; function Divide(X, Y: Real): Real; overload; function Divide(X, Y: Integer): Integer; overload; 25 Edit1.text := IntToStr(testi2(5)); 26 27 Poikkeuksien hallinta try.. finally suorittaa try-osan ja riippumatta kuinka sen suoritus päättyy, suoritetaan finally-osa try.. except suorittaa try-osan ja poikkeuksien sattuessa except-osan procedure TForm1.Button1Click(Sender : TObject); var i : Integer; try i := StrToInt(Edit1.Text); except on E:exception do ShowMessage('Virhe: '+E.message); 28 29