- GKO, luennot 21.-22.5.2004
- Tiedostot
- Delphi Help: programming with Delphi, files, working with
- Lähestymistapoja tiedostonkäsittelyyn
- vanha tapa: Object (turbo) Pascalin standardifunktiot
- teksti: readln, writeln
- binääritiedostot: blockread, blockwrite
- voidaan tehdä myös 'rakenteisia' tiedostoja, jotka koostuvat tietueista
- uusi tapa: tiedosto- ja muut tietovirrat (vrt. c++ ja java)
- TStream ja sen aliluokat
- tiedon lukeminen palloittain, virta toimii puskurina
- Tavallisten tiedostojen lisäksi myös komponentit ja TPersistent-oliot (komponenttien propertyina) voivat ladata ja tallentaa itsensä virtaan
- TStream-luokka sisältää metodit ReadComponent ja WriteComponent
- Tietokantasovelluksissa BLOB-tyylisten kenttien sisältöä käsitellään tietovirroilla
- winAPI:n tiedostofunktiot (sysutils-unitissa)
- filecreate, fileopen...
- tiedostoihin viitataan kahvojen (handle) avulla
- monet komponentit (esim. TStringList) tarjoavat tiedostonkäsittelymetodit
- Lyhyet asetus/käyttäjätiedot kannattaa tallettaa INI-tiedostoihin tai rekisteriin
- Raskain (ja koodaajan kannalta helpoin) tapa tiedostonkäsittelyyn: tietokannan käyttö
- Esimerkki: lue
- Esimerkki: komponentin lataus/tallennus
- Sovelluksen ja käyttäjätietojen tallennus
- INI-tiedostot
- TIniFile-luokka
- Vanha (win16:sta alkaen), mutta edelleen toimiva tapa konfigurointitietojen tallennukseen
- Sisältää osioita, jotka edellen sisältävät avain/arvo-pareja
- Huom. INI-tiedostoja etsitään oletuksena windows-hakemistosta
- Käsiteltäessä INI-tiedostoa samassa hakemistossa kuin käynnistettävä tiedosto, polku on merkittävä erikseen tiedoston nimeen
- .\ alkuun (windows), tai
- ParamStr(0) alkuun (windows), tai
- Application.ExeName
- getCurrentDir-funktiosta saattaa myös olla apua...
- ParamStr:ssa ja ExeNamessa EXE-tiedoston nimi voidaan poistaa ExtractFileDir-funktiolla
- Windowsin rekisteri
- TRegistry
- TRegistryIniFile
- INI-tiedostojen 'näköinen' rajapinta rekisteriin
- Rekisteriin kannattaa tallettaa tietoja, jos sovelluksella on useita käyttäjiä ja heillä omat asetustiedostonsa
- Rekisteriin kannattaa tallettaa mahdollisimman vähän tietoja (jos vain mahdollista, käytä ennemmin INI-tiedostoja)
- Windowsin rekisteri kasvaa kasvamistaan turhista rekisterimerkinnöistä
- Erityisesti ohjelmat, jotka on jo uninstalloitu, saattavat jättää rekisteriin omia tietojaan
- Virheiden käsittely
- Poikkeukset
- Luokkia, jotka peritään Exception-luokasta
- Delphi Help: programming with Delphi, exception handling, overview
- Jaetaan kahteen pääryhmään järjestelmän poikkeukset ja Delphi-poikkeukset
- Windowsin pääohjelmasilmukka tarjoaa peruskäsittelyn kaikille poikkeuksille
- ohjelma ei 'kaadu', vaikka sitä käytettäessä ilmenisi käsittelemätön poikkeus
- yleensä virheet täytyy kuitenkin käsitellä 'omassa koodissa' lähellä poikkeuksen aiheuttajaa
- syntaksi: try/except/finally
- Loogiset tarkastukset l. väittämät (assert)
- käytetään kehitysaikana varmistamaan, ettei ohjelmaan ole päässyt loogisia virheitä
- kääntäjän optioilla assertit voidaan jättää kääntämättä, joten julkaistavan ohjelman suorituskyky ei kärsi väittämistä
- näitä pitäisi olla ohjelmissa huomattavasti nykyistä enemmän!
- ensimmäinen askel kohti ohjelmien formaalia määritystä
- funktion alussa väittämillä voidaan tarkistaa esiehdot, joiden on oltava voimassa funktioon tultaessa
- esim. tyhjälle pinolle ei voida tehdä POP-operaatiota
- funktion lopussa voidaan tarkistaa jälkiehdot, joiden on oltava voimassa funktion jälkeen ('mitä funktio lupaa toteuttaa')
- esim. POP-operaation jälkeen pinon alkioiden lukumäärä vähenee yhdellä
- lisää formaalit menetelmät -kurssilla...
- eivät korvaa poikkeuskäsittelyä, vaan ovat testauksen apuväline
- esim. tiedoston olemassaolon tarkistusta ei voi laittaa väittämäksi, koska tiedosto on sovelluksesta riippumaton resurssi
- OutputDebugString
- WinAPI:n funktio, sovellus lähettää viestin debuggerille
- Korvaa DOS (ja valitettavan monista WWW)-ohjelmista tutun tavan kirjoittaa ruutuun 'debug-merkkijonoja', kuten muuttujien arvoja
- Näkyvät Delphissa Events-debugikkunassa
- Huom. hidastavat ohjelman suoritusta hieman, joten ei kannata käyttää jatkuvasti (ifdef-vakiolla funktion kääntämisen voi toki asettaa ehdolliseksi)
- Esimerkki: errorlib
- Lokitiedostot
- C-kieli ja tapahtumapohjainen ohjelmointi
- Graafinen käyttöliittymä == suorakäyttöliittymä (vs. peräkkäinen) - vrt. johdantoluennon materiaali
- esim. komentorivin EDIT-ohjelma graafisena käyttöliittymänä
- Materiaali: Windows-ohjelmointi C-kielellä, luvut 1-2
- esimerkki: dos-autolaskuri
- 1. switch/case-pääohjelmasilmukka (laskuri.c)
- 2. viestinvälitys ascii-koodeina (laskuri2.c)
- 3. käyttöliittymä ja komennot taulukoihin (laskuri3.c)
- 4. näppäimistön ja hiiren samanaikainen käsittely (laskurh.c, ei toimi c++ -builderissa!)
- 5. piirtotapahtuma mukaan (laskurh2.c)
- Toimintojen käsittely
- Delphi help: Programming with delphi, organizing actions for toolbars and menus (hae: actions)
- Toiminto: yhteen tai useampaan (yleensä visuaaliseen) komponenttiin liittyvä yhteinen tapahtumakäsittelijä
- Toiminto on kapseloitu TAction-luokasta perittyyn olioon, jonka onExecute-tapahtumaa kutsutaan toiminnon lauetessa
- Toiminto laukeaa esim. menua tai painiketta painettaessa (sisältävät action-propertyt) tai tietokantaa käsiteltäessä
- Tällöin esim. päävalikko, työkalupalkin nappulat ja ponnahdusvalikot voidaan tehdä samoilla toiminnoilla ilman erillisiä tapahtumakäsittelijöitä
- onUpdate-tapahtumaa kutsutaan jatkuvasti sovellusta ajettaessa, jolloin käyttäjä voi esim. säätää käyttöliittymäkomponenttien näkyvyyttä ja enabled-ominaisuutta sovelluksen tilan mukaan
- yhtenäinen ratkaisu käyttöliittymäkomponenttien tilan seuraamiseen
- esim. windowsin notepadissa cut/copy/paste-menuitemit ovat päällä vain, kun lomakkeella on valittua tekstiä
- Delphi sisältää joukon esimääriteltyjä toimintoluokkia, esim. cut/copy/paste ja tietokannan vakiotapahtumat
- toimintaluokkiin on kirjoitettu valmiiksi toimintoon kuuluva koodi (esim. copy-toiminto kopioi lauetessaan valitun alueen leiketauluun)
- omia toimintoluokkia voi määritellä itse TAction-luokasta perimällä
- Actionlistit ja ActionBandit
- Actionlist: käyttöliittymän tai sovelluksen tapahtumien (tai toimintojen, Action) keskitetty hallinta yhdessä listassa niin, että monella kontrollilla voi olla sama toiminto
- Action-sekvenssi (ks. Programming with delphi)
- ActionBand: "kustomoitava" actionlist
- ei CLX:ssä
- mahdollistaa harvoin käytettyjen menuitemien automaattisen piilotuksen, win xp-tyyliset menut ja valmiin käyttöliittymän menujen kustomointiin
- (subjektiivinen mielipide: automaattinen piilotus on ehkä win2k:n ja myöhempien TURHIN ja rasittavin ominaisuus, jonka tosin onneksi saa pois päältä....)