Datan tallentaminen, lataaminen ja siirtäminen

Koko: px
Aloita esitys sivulta:

Download "Datan tallentaminen, lataaminen ja siirtäminen"

Transkriptio

1 Datan tallentaminen, lataaminen ja siirtäminen OSA VI 547 LUKU LUKU Datan tallentaminen, lataaminen ja siirtäminen Dokumentin tietojen tallentaminen ja lataaminen Tiedostojen luominen, lukeminen ja kirjoittaminen Tiedon siirtäminen leikepöydälle ja leikepöydältä

2 548 Tiedostojen käsittely valintaikkunasovelluksissa Valintaikkunasovelluksen eivät tavallisesti tarvitse serialisoinnin käyttöä - tavallisesti riittää CFilen tukema suora tiedostojen käsittely (josta lisää myöhemmin tässä luvussa). Valintaikkunsovellukset voivat kuitenkin käyttää serialisointia CArchive-luokan kautta. Tätä varten valintaikkunaan joudutaan toteuttamaan oma käyttöliittymä serialisoinnin aloittamista varten. Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen Serialisoinnin käyttö Serialisointi on tekniikka, jolla sovelluksen data saadaan peräkkäiseksi luetteloksi dataelementtejä, sekä saadaan ne tallennettua levylle tai siirrettyä toiseen ohjelmaan. Ohjelman ladatessa uudelleen serialisoidun tiedon tai hyväksyessä toiselta ohjelmalta tulevan tiedon, se voi lukea nämä dataelementit peräkkäin ja muodostaa niistä rakenteisia ja vuorovaikutteisia muistiolioita. SDI- ja MDI-sovellusrungoissa saadaan käyttöön serialisointi ja tiedostonkäsittely joudut ainoastaan tekemään sovelluksesi datan itsensä serialisoivaksi sovellusrungon sitä pyytäessä. Tiedostoja käsittelevän SDI-sovellusrungon luominen Luodaksesi tavallisen dataolioita luovan, käyttävän ja CDocumentluokasta peritystä luokasta serialisoivan SDI-sovelluksen voit käyttää tuttua AppWizardin New Project toimintoa. Joudut huomioimaan serialisoinnin uutta projektia luotaessa ainoastaan dokumenttimallin tekstiasetusten kohdalla (Document Template String). Nämä tekstiasetukset saadaan tehtyä MFC AppWizardin vaiheessa Step 4 napauttamalla Advanced-painiketta. Tällöin saadaan esiin Advanced Options ikkuna (kuva 23.1), josta voit asettaa dokumenttimallikohtaiset tekstitiedot: File extension voit määrittää tiedostotunnisteen muuttamalla File extension ruudun sisältöä. Tähän kelpaavat kaikki aakkosnumeeriset merkit. Sovellusrungon tallettaessa dokumenttisi tiedostoksi käytetään sen nimessä tätä tunnistetta. Sovellusrungon tiedostosuodattimet Advanced Options -valintaikkunan valinnat tallennetaan IDR_MAINFRAMEmerkkijonoresurssiin. Voit muuttaa näitä asetuksia projektin luomisen jälkeen muokkaamalla ResourceView-sivulta löytyvää IDR_MAINFRAME-merkkijonoresurssia (String Table). File type ID Voit määrittää järjestelmärekisteriä varten dokumenttityypin, jotta sovellukset voisivat liittää sovelluksesi tämän tyyppisiin tiedostoihin. Tavallisesti tähän jätetään sovelluksen nimeen perustuva oletusarvo. Näin sovelluksesi saadaan käynnistymään automaattisesti ja lataamaan tiedosto, jota kaksoisnapautetaan työpöydällä tai Resurssienhallinnassa. Filter name Voit määrittää tiedostotunnisteellesi oletussuotimen esimerkiksi tiedoston avaamisikkunassa käytettäväksi.

3 Datan tallentaminen, lataaminen ja siirtäminen File type name Tämä on File type ID tunnisteeseen liittyvä selkokielisempi nimi käytettäväksi muiden sovelluksien kuvatessa dokumenttityyppiäsi. Näitä rekisteröityjä nimiä saat esiin työpöydän pikavalikon Uusi-valikosta (New). Tätä rekisteröintiä käsitellään myöhemmin tässä luvussa. File new name Voit määrittää oletusnimen tiedostoille, jotka tallennetaan nimettöminä. Tee siis serialisoinnin havainnollistamista varten AppWizardilla uusi SDI-projekti nimeltään Persist. Projektia luodessa hyväksy AppWizardin oletusasetukset vaiheissa Step 1 Step 3 Next-painiketta napauttamalla. Napauta vaiheessa Step 4 Advanced-painiketta, jolloin saat esiin Advanced Options ikkunan. Aseta Persist-esimerkin tiedostotunnisteeksi (File extension) blb, jolloin sovelluksen luomista tiedostoista tulee.blb-päätteisiä (kuva 23.1). OSA VI LUKU KUVA 23.1 Tiedostotyyppisuotimen asettaminen Advanced Options ikkunassa. KATSO MYÖS Lisätietoja SDI-sovellusten luomisesta luvusta 12. Merkkijonoresurssien muokkaaminen luvussa 2. Serialisoitavien dataolioiden luominen Kaikilla MFC:n CObject-luokasta periytyvillä luokilla on Serialize()-virtuaalifunktio, jonka voit korvata sovelluksesi luokassa

4 550 Siirrä tietoa verkon kautta CArchiven avulla Voit käyttää CArchive-luokkaa yhdessä CSocket- ja CSocketFile-luokkien kanssa. Näin voit siirtää tietoa lähiverkon koneesta toiseen tai jopa Internetissä. Serialisointiskeemat ja tietokantaskeemat Samasta käsitteestä huolimatta serialisointiskeemat ovat hyvin erilaisia tietokantaskeemoista. Tietokantaskeemoissa on tieto tietokannan taulujen kentistä ja serialisointiskeemoissa ainoastaan luokan tyypistä ja versiosta. Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen ja pääset tallettamaan olion jäsenmuuttujia levytiedostoon. Kun käyttäjä valitsee SDI- tai MDI-sovelluksessa File Save tai File Open (Tiedosto Tallenna, Tiedosto Avaa), sovellusrunko kutsuu automaattisesti dokumentin Serialize()-funktiota dokumentin dataolioiden tallentamista tai lataamista varten. MFC:n CArchive-luokka vastaa CObjectista johdettujen olioiden serialisoimisesta CArchive-luokkaan upotettuun tiedostojäsenmuuttujaan (tai muuttujasta). Sovellusrunko muodostaa CArchive-olion ja liittää sen tiedostoon, jota käyttäjä on lataamassa tai tallentamassa. Voit korvata dokumenttiluokkasi (joka on johdettu CObjectista) Serialize()-funktion. Tallennettaessa tai ladattaessa dokumenttisi korvatulle Serialize()- funktiolle välitetään parametri ar, joka on sovellusrungon luoma CArchive-olio. Tähän CArchive-olioon sisältyy upotettu tiedostojäsenmuuttuja, joka on liitetty tallennettavaan tai ladattavaan levytiedostoon. Dokumenttiluokkasi Serialize()-funktiosta joudut kutsumaan sovelluksesi kaikkien olioiden Serialize()-funktioita ja välittämään sille CArchive-olion (ar), jonka dokumenttisi Serialize() sai sovellusrungolta. Kun dokumentin tietoja tallennetaan, kunkin serialisoitavan olion data luetaan ja se tallennetaan CArchive-olioon liittyvään tiedostoon. Kun dokumentin tietoja ladataan, data luetaan CArchive-olioon liittyvästä levytiedostosta ja asetetaan takaisin dataolioihin kutsumalla olioiden omia Serialize()-funktioita. Serialisoinnin luomaa levytiedostoa kutsutaan serialisoiduksi arkistotiedostoksi (serialized archive file) ja siihen on tallennettu jokaisen sovelluksen olion data sekä olion tyyppi ja versiotiedot. Versionumeron avulla voit pitää yllä tietoa olion mahdollisesti muuttuvasta rakenteesta sovelluksen kehittyessä. Versio- ja tyyppitietoja nimitetään usein skeemaksi (schema). Voit johtaa sovelluksesi luokat CObjectista ja käyttää serialisointitoimintoja lisäämällä luokan määrittelyyn DECLARE_SERIAL-makron ja vastaavan IMPLEMENT_SERIAL-makron sen toteutuskoodiin. Nämä makrot korvaavat tavalliset CObjectista johdetuissa luokissa käytetyt DECLARE_DYNCREATE- ja IMPLEMENT_DYNCREATE-makrot lisäten serialisointia nopeuttavaa koodia.

5 Datan tallentaminen, lataaminen ja siirtäminen Serialisoitavan luokan määrittely Mikäli sovelluksesi tarvitsee erityisiä dataolioita, joudut luomaan omat sovelluskohtaiset luokkasi tuon datan kuvaamiseen ja käsittelyyn. Tämän jälkeen voit lisätä uuden luokkasi määrittelyyn serialisointimakrot ja toiminnot kunkin olion datan tallentamiseksi ja lataamiseksi. Voit luoda uuden header-tiedoston (.h) ja toteutustiedoston (.cpp) luokan määrittelylle ja toteutuskoodille. OSA VI LUKU Uuden header-tiedoston luominen luokan määrittelylle 1. Valitse Developer Studion File-valikosta New aivan kuten uutta projektia luotaessa. 2. Valitse New-valintaikkunan Files-välilehdellä C/C++ Header File uuden tiedoston luomiseksi. 3. Anna uudelle header-tiedostolle nimi File Name ruutuun (tässä blob.h). 4. Jos Add to Project valinta on asetettu (kuten oletuksena on), uusi tyhjä header-tiedosto lisätään projektiin automaattisesti ja se näytetään editorin ikkunassa. Varmista siis, että valinta on rastitettu. 5. Lisää uusi header-tiedosto projektiin ja aloita sen muokkaus valitsemalla OK. Listauksessa 23.1 esitetään yksinkertaisen serialisoitavan olion määrittely. Tämä luokka on normaali CObjectista johdettu luokka, johon DECLARE_SERIAL-makro lisää MFC:n serialisoinnin vaatiman osan. LISTAUS 23.1 LST23_1.CPP blob.h, Blob-dataolion luokkamäärittely 1 // ** Ensure the class isn't declared twice 2 #ifndef _BLOB_H 3 #define _BLOB_H 4 5 // ** Derive a CBlob class from CObject 6 class CBlob : public CObject 7 { 8 // ** Include the Serialization functions 9 DECLARE_SERIAL(CBlob); public: 12 1 DECLARE_SERIAL-makro tarjoaa avattuna kaiken sovellusrungon serialisoinnille tarvittavan tuen.

6 552 2 Yhden Blob-olion (täplän) piirtämiseen tarvittavat attribuutit. Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen 13 // ** Declare two constructors 14 CBlob(); 15 CBlob(CPoint ptposition); // ** Declare a drawing function 18 void Draw(CDC* pdc); // ** Declare the attributes 21 CPoint m_ptposition; 2 22 COLORREF m_crcolor; 23 int m_nsize; 24 unsigned m_nshape; 25 }; #endif // _BLOB_H Riviltä 6 nähdään, että uusi CBlob-luokka on johdettu CObjectkantaluokasta. Kaikki MFC-yhteensopivat luokat kannattaa johtaa CObjectista, koska CObject tarjoaa yleisenä kantaluokkana muitakin hyödyllisiä MFC-ominaisuuksia, kuten ajonaikaiset luokkatiedot. Näiden tietojen avulla MFC voi päätellä, mihin luokkaan olio kuuluu. Nämä tiedot on tallennettu olion datan yhteyteen, joten tietoja ladattaessa voidaan luoda myös oikeanlaiset oliot. Rivin 9 DECLARE_SERIAL-makro lisää serialisoinnin toiminnan vaatiman koodin. Riveillä 14 ja 15 on määritelty kaksi muodostinta. Rivin 14 versio toimii ilman parametrejä ja sitä sovellusrunko käyttää olioiden luomiseen lennossa ladattaessa tietoja levyltä. Rivin 15 versiolla luodaan olio ja sen koordinaattijäsen alustetaan automaattisesti CPoint-parametristä. Tämä helpottaa olioiden luomista hiiren napautuksen perusteella, kuten tulet myöhemmin huomaamaan. Rivillä 18 määritellään Draw()-funktio, jonka toteutuskoodi löytyy.cpp-tiedostosta. Rivien 21 ja 23 muuttujat joudutaan serialisoimaan oliota ladattaessa tai tallennettaessa. Serialisoitavan luokan toteutus Määriteltyäsi uuden luokan joudut kirjoittamaan vastaavan toteutuskoodin luokan määrittelyssä esitellyn datan muodostamiseen (alustamiseen) ja muokkaamiseen.

7 Datan tallentaminen, lataaminen ja siirtäminen OSA VI LUKU Uuden.cpp-tiedoston luominen luokan toteuttamiseen 1. Valitse Developer Studion File-valikosta New aivan kuten uutta projektia luotaessa. 2. Valitse New-valintaikkunan Files-välilehdellä C/C++ Implementation File uuden tiedoston luomiseksi. 3. Anna uudelle toteutustiedostolle nimi File Name ruutuun (tässä blob.cpp). 4. Jos Add to Project valinta on asetettu (kuten oletuksena on) uusi tyhjä toteutus-tiedosto lisätään projektiin automaattisesti ja se näytetään editorin ikkunassa. Varmista siis, että valinta on rastitettu. 5. Lisää uusi toteutustiedosto projektiin ja aloita sen muokkaus valitsemalla OK. Serialisoitavalla luokalla on oltava yleinen - eli parametriton muodostin. Tällä muodostimella oliot luodaan levytiedostosta serialisoitaessa. MFC sovellusrunko voi tällöin kutsua kaiken tyyppisten olioiden yleistä muodostinta niiden luomiseksi ladattaessa tietoja tiedostosta. Yleisellä muodostimella sovellusrunko voi luoda minkä tahansa serialisoitavan luokan ilmentymän ja luottaa sitten sovelluksen omien Serialize()-funktioiden toteutusten alustavan uuden olion jäsenmuuttujien arvot. Voit lisäksi toteuttaa muita muodostimia, joilla voit luoda olioita halutuin alkutiedoin. Jokaisen serialisoitavan olion toteutuskoodissasi tulee olla myös IMPLEMENT_SERIAL-makro. Tämä makro tarvitsee kolme parametriä. Ensimmäinen on itse luokan nimi, toinen sen kantaluokka ja kolmas (wschema) on versionumeroa kuvaava UINT-arvo. Jos lisäät luokkaasi uusia jäsenmuuttujia ja haluat serialisoida ne, voit kasvattaa versionumeroa ja valinnaisesti jopa tarkistaa sen, jos haluat säilyttää yhteensopivuuden vanhempiin serialisointitiedostoihin. CBlob-esimerkkiluokan toteutus on esitetty listauksessa Esimerkkitoteutus esittää IMPLEMENT_SERIAL-makron ja useita muodostimia sekä koodin, jolla olio saadaan piirtämään itsensä. Työskentely Visual Source Safen kanssa Jos käytetät integroitua versionhallintajärjestelmää, kuten Visual Source Safea, sinulta kysytään, haluatko lisätä uuden lähdekooditiedoston Source Safe -projektiin (mikä kannattaa tehdä). Versionhallintaohjelmiston avulla voidaan seurata eri ohjelmaversioita ja muutoksia lähdekooditiedostoissa, jolloin aiempaan versioon palaaminen tulee mahdolliseksi. Tämä on erityisen hyödyllistä, kun samassa projektissa työskentelee useita ohjelmoijia, koska versionhallintaohjelmisto estää saman lähdekooditiedoston muuttamisen yhtäaikaa estäen tehtyjen muutosten päällekirjoittamisen. Versioiden hallitseminen Jos teet kaupallisia serialisointia käyttäviä sovelluksia, on hyvin tärkeää ylläpitää jokaisen eri tiedoston/olion skeemanumeroa niiden sovittamiseksi yhteen vanhempien versioiden kanssa. Muussa tapauksessa saatat joutua hämmentävään tilanteeseen, kun asiakkaan ohjelmaversiota päivitettäessä sovelluksen kaikki vanhat datatiedostot tulevat ylikirjoitetuiksi.

8 554 Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen LISTAUS 23.2 LST23_2.CPP blob.cpp, Blob-dataolion luokkatoteutus 1 // ** include the standard header 2 #include "stdafx.h" 3 #include "blob.h" 4 // ** Add the implementation for serialization 5 IMPLEMENT_SERIAL(CBlob,CObject,1) 6 // ** Implement the default constructor 7 CBlob::CBlob() 8 { 9 } 1 Tällä muodostimella voidaan täpläolio luoda hiiren napautuspaikkaan ja asettaa sen arvot satunnaisiksi. 2 Draw()-funktiolla jokainen täpläolio voi piirtää itsensä saatuaan piirtopintaosoittimen näkymän OnDraw()-funktiolta. 10 // ** Implement the position constructor 11 CBlob::CBlob(CPoint ptposition) 1 12 { 13 // ** Set the random seed 14 srand(gettickcount()); 15 // ** Set the position to the specified position 16 m_ptposition = ptposition; 17 // ** Set the attributes to random values 18 m_crcolor= RGB(rand()%255,rand()%255,rand()%255); 19 m_nsize = 10 + rand()%30; 20 m_nshape = rand(); 21 } 22 void CBlob::Draw(CDC* pdc) 2 23 { 24 // ** Create and select a colored brush 25 CBrush brdraw(m_crcolor); 26 CBrush* poldbrush = pdc->selectobject(&brdraw); 27 CPen* poldpen = 28 (CPen*)pDC->SelectStockObject(NULL_PEN); 29 // ** See the random generator to the shape 30 srand(m_nshape); 31 for(int n=0;n<3;n++) 32 { 33 // ** Set the blob position and random shift 34 CPoint ptblob(m_ptposition); 35 ptblob += CPoint(rand()%m_nSize,rand()%m_nSize); 36 // ** Create and draw a rectangle to the blob size 37 CRect rcblob(ptblob,ptblob); 38 rcblob.inflaterect(m_nsize,m_nsize); 39 pdc->ellipse(rcblob); 40 } 41

9 Datan tallentaminen, lataaminen ja siirtäminen OSA VI LUKU // ** Reselect the GDI Objects 43 pdc->selectobject(poldbrush); 44 pdc->selectobject(poldpen); 45 } Rivien 2 ja 3 #include-lauseilla määrätään kääntäjä ottamaan mukaan luokan ja MFC-luokkien määrittely. Rivin 5 IMPLEMENT_SERIAL()- makro täydentää luokan määrittelyssä käytetyn DECLARE_SERIAL()- makron. Oletusmuodostin määritellään rivillä 7. Tiedostoa ladattaessa serialisointitoiminto voi luoda nämä oliot oletusmuodostimen avulla ja alustaa ilmentymät tiedostosta luetulla datalla. Oma muodostin määritellään rivillä 11 olioiden luomiseksi hiiren napautuspaikan ja satunnaisten attribuuttiarvojen mukaisesti. Riviltä 22 alkava Draw()-funktio voi sitten piirtää nämä oliot parametrinä saamaansa näkymän piirtopintaosoitinta käyttäen. Dokumentin tietojen säilyttäminen ajon aikana Määriteltyäsi sovelluksesi luokat joudut luomaan luokista ilmentymiä (eli olioita) edustamaan käyttäjän tietoja yksittäisinä olioina. Jos luot olioita, joudut pitämään yllä tietoja niistä voidaksesi muokata dataa, ladata ja tallentaa niitä ja lopuksi tuhota ne. Kun lataat tai tallennat dokumentin dataa, joudut käymään läpi kaikki tallennettavat tiedot ja serialisoimaan jokaisen olion kerrallaan. MFC-kirjastossa on luokkia, jotka helpottavat näiden olioiden seuraamista ja tukevat serialisointia, joten ne käyvät läpi automaattisesti ilmentymät. Eräs näistä on CObArray-luokka, joka kuuluu MFC:n kokoelmaluokkiin (collection). Kyseessä on kasvatettava taulukko, joka on suunniteltu CObjectista johdettujen luokkien tallentamiseen eli se saattaa sopia kaikille määrittämillesi dataolioille. Sen lisäksi luokka ymmärtää serialisointia ja auttaa dokumentin tietojen serialisoinnissa. Voit lisätä CObArray-olion CPersistDoc-dokumenttiluokan määrittelyyn //Attributes-kommentin ja public:-määrittelyn alle näin: // Attributes public: CObArray m_blobarray(); Tämä uusi m_blobarray-olio voi nyt säilyttää ja seurata CObjectista johdettuja luokkia (kuten CBlobia). Tyyppiturvallisten mallitaulukoiden käyttö CObArray ei ole tyyppiturvallinen, koska se hyväksyy mukisematta minkä tahansa CObjectista johdetun olion. Toisinaan tällainen toiminta on paikallaan, mutta joskus taulukkoon halutaan tallentaa ainoastaan tietyntyyppisiä olioita. Tyyppien käyttöön voidaan pakottaa useiden mallien, esimerkiksi CTypedPtrArray, käytöllä. Vääräntyyppisen olion lisäämisen yrittäminen antaa tällöin assertion failed -varoitussanoman.

10 556 Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen Olioiden säilyttämisen lisäksi dokumentti joutuu tuhoamaan ne käyttäjän sulkiessa sovelluksen. Voit toteuttaa tämän lisäämällä listauksen 23.3 funktion sekä vastaavan määrittelyn luokan määrittelyyn: void DeleteBlobs(); LISTAUS 23.3 LST23_3.CPP DeleteBlobs()-luokan toteutus ja käyttö kaikkien varattujen Blob-olioiden poistamiseksi 1 DeleteBlobs()-funktio käy läpi kaikki täplät ja tuhoaa olioilmentymän varaaman muistin ja tyhjentää lopuksi olioita sisältävän taulukon. 2 Uuden dokumentin on tuhottava vanhat täplät, koska SDI-sovellusrunko käyttää samaa dokumenttioliota uudelleen. 1 void CPersistDoc::DeleteBlobs() 1 2 { 3 // ** Delete the allocated blobs 4 for(int i=0;i<m_blobarray.getsize();i++) 5 delete m_blobarray.getat(i); 6 m_blobarray.removeall(); 7 } 8 CPersistDoc::~CPersistDoc() 9 { 10 DeleteBlobs(); 11 } 12 BOOL CPersistDoc::OnNewDocument() 13 { 14 if (!CDocument::OnNewDocument()) 15 return FALSE; 16 // TODO: add reinitialization code here 17 // (SDI documents will reuse this document) 18 DeleteBlobs(); 2 19 return TRUE; 20 } Tämän funktion toteutus on esitetty listauksen 23.3 riveillä 1 7. DeleteBlobs()-funktio käy läpi kaikki CObArrayn CBlob-oliot ja tuhoaa jokaisen kerrallaan. Tämän jälkeen itse taulukko nollataan kutsumalla sen RemoveAll()-funktiota. Kun itse dokumentti tuhotaan, kutsutaan dokumentin tuhoajafunktiota (destructor) ja se on oikea paikka kutsua käytettävien dataolioiden tuhoamisfunktioita (rivi 10). Käyttäjä voi toki luoda uuden dokumentin vielä vanhan ollessa avoinna ja tällöin sovellusrunko ottaa vanhan dokumentin uuteen käyttöön. Tässä tapauksessa dokumentissa sijaitsevat dataoliot joudutaan nollaamaan. Voit tehdä toimet CPersistDoc::OnNewDocument()-funktiossa kutsumalla

11 Datan tallentaminen, lataaminen ja siirtäminen DeleteBlobs()-funktiota, kuten rivillä 18 on tehty. OSA VI LUKU Olemme käsitelleet dataolioiden säilyttämisen ja tuhoamisen, mutta käyttäjälle tarvitaan myös keinot uusien olioiden luomiseksi ja dokumenttiin lisäämiseksi. Miten se tehdään, vaihtelee varmaankin sovelluskohtaisesti ja riippuu myös käyttöliittymästä. Luotuasi uuden dataolion voit lisätä sen sitten säilöluokkaan, kuten CObArray. CObArray-luokassa on Add()-funktio, joka tarvitsee ainoastaan yhden parametrin, osoittimen uuteen olioon. Yksinkertaisin tapa luoda noita olioita esimerkkiohjelmassa on antaa käyttäjän napauttaa hiiren painiketta missä tahansa kohden näkymää ja luoda CBlob-olio hiiren napautuksessa käytettyjen koordinaattien mukaan. Tätä varten tarvitset OnLButtonDown()- sanomankäsittelijäfunktion. Sen luominen käy luvussa 19 esitetyn ilmoitussanoman käsittelijän lisäämisohjeiden mukaan. CObArrayn käyttö Add()-jäsenfunktiolla lisäämisen sijaan haluttuun paikkaan CObArray()-taulukkoa voidaan lisätä olio InsertAt()-funktiolla (antamalla parametreinä haluttu paikka ja osoitin olioon). Luokalla on myös vastaava poistofunktio RemoveAt() sekä muuttamis- ja lukemisfunktiot SetAt() ja GetAt(). Lisää seuraavat rivit OnLButtonDown()-käsittelijään luodaksesi uuden blob-olio point-parametrin perusteella ja lisätäksesi sen dokumentissa olevaan m_blobarray-taulukkoon (//TODO-kommenttien jälkeen). GetDocument()->m_BlobArray.Add(new CBlob(point)); Invalidate(); Invalidate()-funktio saa aikaan näkymän ja myös uusien olioiden uudelleenpiirtämisen listauksen 23.4 koodin avulla. LISTAUS 23.4 LST23_4.CPP Täplien piirtäminen OnDraw()-funktiosta 1 void CPersistView::OnDraw(CDC* pdc) 2 { 3 CPersistDoc* pdoc = GetDocument(); 4 ASSERT_VALID(pDoc); 5 6 // TODO: add draw code for native data here 7 8 for(int i=0;i<pdoc->m_blobarray.getsize();i++) 1 9 { 10 CBlob* pblob = (CBlob*)pDoc->m_BlobArray.GetAt(i); 11 pblob->draw(pdc); 12 } 13 } 1 Näkymä yksinkertaisesti käy läpi kaikki täplät (blob-oliot) ja pyytää kutakin piirtämään itsensä. Listauksessa 23.4 oliot käydään läpi riveillä 8 12 ja jokaisen olion Draw()-funktiota kutsutaan (rivi 11). Kääntäjä tarvitsee lisäksi luokan määrittelyn:

12 558 Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen #include blob.h Voit lisätä tämän muiden #include-lauseiden jälkeen PersistView.cpp tiedostoon. Kun käännät ja ajat sovelluksesi, voit napauttaa hiiren vasemmalla painikkeella näkymäikkunassa ja lisätä uusia täpliä (blob), kuten kuva 23.2 osoittaa. KUVA 23.2 Blob-olioiden näyttäminen Persist-sovelluksesta KATSO MYÖS Lisätietoja dokumentista ja dokumentin datasta luvusta 12. Täytettyjen muotojen piirtäminen piirtopinnalle luvussa 16. Dataolioiden serialisointi Jotta voisit serialisoida dataoliosi, joudut lisäämään luokkaasi Serialize()-funktion, jolla jäsenmuuttujista muodostetaan peräkkäinen luettelo, joka voidaan ladata tiedostosta tai tallentaa tiedostoon. Serialize()-virtuaalifunktio on määritelty seuraavasti: // ** Add the Serialize Override virtual void Serialize(CArchive& ar);

13 Datan tallentaminen, lataaminen ja siirtäminen Edellä esitetty Serialize()-funktion määrittely lisätään luokan määrittelytiedostoon (esimerkiksi blob.h). Vastaava Serialize()- funktion toteutuskoodi tulee sitten lisätä luokan toteutustiedostoon (esimerkiksi blob.cpp). Levytiedosto on upotettu CArchive-olioon, jonka Serialize()- funktio saa parametrinä sovellusrungolta. OSA VI LUKU CArchive-olion avulla dokumentin data saadaan helposti luetteloksi ja siinä on tieto tiedonsiirron suunnasta eli tallennetaanko tietoja vai ladataanko niitä. Käyttäjän valitessa dokumentin lataamisen tai tallentamisen sovellusrunko luo automaattisesti CArchive-olion ja avaa tiedoston valmiiksi tiedonsiirtoa varten. Sen jälkeen se kutsuu dokumentin omaa Serialize()-funktiota välittäen sille CArchive-olion parametrinä. CArchive-luokkaan on määritelty useita toimintoja, kuten operaattorit << ja >>. Näitä käytetään datan siirtämiseen CArchive-olioon (tiedostoon). Operaattoreilla voidaan tallentaa arvo näin: ar << m_myvar ja ladata arvo tiedostosta näin: Virtuaalifunktioiden lisääminen omiin luokkiin Jos olet käyttänyt ClassViewsivun pikavalikosta saatavaa New Virtual Override -valintaikkunaa, huomaat, ettei sillä voi lisätä virtuaalifunktioita omiin luokkiin. Joudut sen sijaan lisäämään manuaalisesti funktion määrittely- ja toteutuskoodin luokkasi määrittelytiedostoon (.h) ja toteutustiedostoon (.cpp) tekstieditoria käyttäen. ar >> m_myvar Kun kirjoitat olion Serialize()-funktiota, voit tutkia, tallennetaanko vai ladataanko oliota käyttämällä CArchive-olion jäsenfunktioita IsStoring() ja IsLoading(). Tavallisesti kukin jäsenmuuttuja tallennetaan tai ladataan omalla << tai >>-operaattoria käyttävällä rivillään. Tämä on esitetty CBlob-esimerkkioliolle listauksessa LISTAUS 23.5 LST23_5.CPP Serialisoinnin toteutuksen lisääminen CBlob-luokkaan 1 void CBlob::Serialize(CArchive& ar) 2 { 3 CObject::Serialize(ar); 4 if (ar.isstoring()) 5 { 6 ar << m_ptposition; 1 7 ar << m_crcolor; 8 ar << m_nsize; 9 ar << m_nshape; 10 } 11 else 12 { 13 ar >> m_ptposition; 1 14 ar >> m_crcolor; 15 ar >> m_nsize; 16 ar >> m_nshape; 17 } 18 } 1 Tallennettaessa jäsenmuuttujat lisätään arkistoon (Archive). 2 Ladattaessa arkisto puretaan jäsenmuuttujiin.

14 560 Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen Listauksen 23.5 rivillä 4 kutsutaan CArchive-luokan jäsenfunktiota IsStoring() selvittämään, tallentaako vai lataako CArchive-olio dataa. Tallennettaessa data tulee siirtää CArchive-olioon ja ladatessa lukea se siitä. Datan tallennus tehdään riveillä 6 9. <<-operaattori välittää blob-luokan kunkin jäsenen CArchive-oliolle, jossa arvo lisätään levytiedostoon. Sama tehdään päinvastoin riveillä ja >>-operaattori alustaa jäsenmuuttujan CArchive-oliosta luetulla arvolla. Joudut kutsumaan jokaisen dokumenttisi olion Serialize()-funktiota olion tallentamiseksi tai lataamiseksi. Tämä käy muokkaamalla dokumentin omaa Serialize()-funktiota kutsumaan olioiden Serialize()-funktioita. Dokumentin tietojen serialisoiminen Useimmat sovellukset todennäköisesti tallentavat esimerkkiämme enemmän ja mutkikkaampia tietoja. Joka tapauksessa dokumentin Serialize()-funktio tarjoaa hyvän aloituspisteen koko sovelluksen tietojen tallentamiselle. Joudut todennäköisesti lisäämään dokumentin Serialize()-funktioon useita taulukoita tai kehittyneempiä kokoelmaolioita sovelluksesi tietojen tallentamiseksi ja lataamiseksi. Olioiden säilyttäminen CObArray-taulukossa (kuten esimerkin m_blobarrayssä) tekee tästä huomattavasti helpompaa. CObArray tukee serialisointia ja se osaa käydä läpi säilyttämänsä oliot ja tallentaa ne. Vastaavasti uutta dokumenttia levyltä avattaessa CObArray-olio huomaa, kuinka monta oliota se tulee säilyttämään ja minkä tyyppisiä ne ovat, joten se osaa luoda oliot puolestasi (sillä oletusmuodostimella) ja kustua sitten kunkin olion Serialize()-funktiota olion tietojen alustamiseksi tiedostosta. Tämä tarkoittaa, että joudut kutsumaan ainoastaan oliotaulukon Serialize()-funktiota, esimerkiksi näin: void CPersistDoc::Serialize(CArchive& ar) { m_blobarray.serialize(ar); } Voit tehdä nämä muutokset esimerkkiohjelmaan ja kääntää ja ajaa sen nähdäksesi, kuinka serialisointikoodi lataa ja tallentaa täpläolioita (blob). Seuraavaksi esitellään esimerkkiohjelman täpläolioiden tallentaminen ja lataaminen. Piirrä ohjelmalla muutamia täpliä ikkunassa napauttamalla. Valitse sitten File-valikosta Save As. Sovellusrunko avaa automaattisesti Save As valintaikkunan, jossa voit muuttaa tiedoston oletusnimen Untitled.blb valitsemaksi blob-tiedostoksi. Jos muutat nimen ja napautat Save, serialisointi tehdään ja täplätiedot tallentuvat levylle. Voit varmistaa tämän sulkemalla sovelluksen, käynnistämällä sen uudelleen ja valitsemalla File-valikosta Open. Koska AppWizardissa tiedostotyypiksi määrättiin.blb, näet aluksi ainoastaan blob-tiedostot, joten tallentamasi tiedoston tulisi olla ainoa valittavissa oleva. Valitse se ja lataa se uudelleen sovellukseen Open-painikkeella. Nyt aiemmin

15 Datan tallentaminen, lataaminen ja siirtäminen piirtämäsi täplät ovat ikkunassa jälleen omilla paikoillaan. Voit nyt luoda uusia täpliä ja tallentaa ne uudelleen tai luoda uuden dokumentin ja tallentaa sen eri nimelle ja käsitellä tiedostoja kuten muissakin sovelluksissa. Voit sulkea tietokoneesi ja tulla takaisin kahden viikon päästä samat täplät ovat yhä samoissa paikoissa, mihin ne edellisellä kerralla piirsit. OSA VI LUKU Viimeksi avattujen tiedostojen luettelon käyttö Sovellusrunko tarjoaa vielä kaiken edellisen lisäksi luettelon viimeksi avatuista tiedostoista. Jos olet tallentanut useita eri nimisiä blobtiedostoja, olet saattanut huomata File-vaikossa luettelon viimeksi avatuista tiedostoista. Voit helposti valita minkä tahansa näistä avattavaksi suoraan valikosta. Dokumenttityyppien rekisteröiminen Olet varmaan kokenut, kuinka suoraan dokumenttitiedoston nimeä kaksoisnapauttamalla saadaan avattua dokumenttiin liitetty Windowssovellus. Kyseessä on rekisteröityjen tiedostotyyppien käyttö; lisäämällä sovellukseen pari koodiriviä saat samat toiminnot omaan sovellukseesi. Nämä koodirivit tulee lisätä sovellusluokkasi ( App) InitInstance()-funktioon välittömästi AddDocTemplate(pDocTemplate); -rivin jälkeen: CRecentFileList-luokan käyttö SDI- ja MDI-vakiosovellukset käyttävät CRecentFileList-luokkaa viimeksi avattujen tiedostojen luettelona. Voit käyttää tätä luokkaa suoraan (eikä sovellusrungon kautta) toteuttamaan oman viimeksi käytettyjen tiedstojen luettelon ja liittämään sen omiin valikkoihin. CRecentFileList-luokalle voidaan määrittää kunkin tiedoston näytettävä nimi ja tiedostopolku. Se osaa automaattisesti päivittää valikkoa tiedoston lisäämiseksi tai poistamiseksi. RegisterShellFileTypes(); EnableShellOpen(); KATSO MYÖS Lisätietoja dokumentista ja sen datasta luvussa 12. Tiedostojen käsittely SDI- ja MDI-sovelluksissa, jotka joutuvat tallentamaan dokumentin tietoja, on serialisointi erittäin käyttökelpoinen menettely. Joskus tiedostoja joudutaan kuitenkin luomaan, lukemaan ja kirjoittamaan suoraan. MFC-kirjasto tarjoaa käyttöön levytiedoston paketoivan luokan CFile. Tähän luokkaan kätkeytyvät kaikki tiedosto-operaatiot sekä tiedostoon liittyvät attribuutit. Luomalla ja käyttämällä CFile-olioita voit myös luoda, lukea ja kirjoittaa levytiedostoja CFile-luokan funktioiden avulla.

16 562 Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen Käytitpä sitten dokumentin datan serialisointia tai suoraan tiedostoon kirjoittamista, päädyt kuitenkin käyttämään CFile-luokkaa tai siitä johdettua luokkaa. Serialisoinnin käyttämä CArchive-luokka yhdistyy CFile-olioon varsinaista dokumentin tietojen lukemista tai kirjoittamista varten. Tässä kappaleessa esitetään, kuinka CFiletoimii sekä tutustutaan CFile-luokan spesifisempiin versioihin. Tiedostokahvat Useiden MFC-luokkien tavoin myös CFile-luokka paketoi Win32-tiedostokahvan. Voit käyttää tätä kahvaa suoraan CFileolion m_hfile-jäsenmuuttujasta. Ellei tiedostoa ole avattu tai luotu, kahvan arvo on CFile::hFileNull, muutoin siinä on nykyisen tiedoston kahva. CFile-luokan käyttö Saat muodostettua CFile-olion kolmella tavalla. Yksinkertaisin muodostin ei tarvitse parametrejä ja luo avaamattoman tiedosto-olion, jonka Open()-funktiota kutsutaan myöhemmin levytiedoston luomiseksi tai avaamiseksi. Toinen muodostinversio käyttää yhtä parametriä (hfile-kahva), jonka tulee olla valmiiksi avattu tiedosto. Tällä voidaan ottaa käyttöön CFile-olio jo valmiiksi avatulle tiedostolle. Kolmas muodostinversio käyttää kahta parametriä: ensimmäinen on avattavan tai luotavan tiedoston nimi ja hakemistopolku ja toinen yhdistelmä mahdollisista tiedostonavauslipuista. Tiedostojen avaaminen Eräs kaikkein tärkeimmistä tiedostonkäsittelytoimista on aluksi tehtävä tiedoston avaaminen. Määrittämällä avaamislippuja kerrot etukäteen, kuinka haluat annettua tiedostonimeä käsiteltävän. Tahdot ehkä aina luoda uuden tiedoston, avata tiedoston ainoastaan luettavaksi (readonly) tai sekä luettavaksi että kirjoitettavaksi. Voit antaa Open()- funktiolle toisena parametrinä (nopenflags) useita erilaisia lukemiseen ja kirjoittamiseen liittyviä lippuja (taulukko 23.1). Ensimmäinen Open()-funktion parametri on avattavan tai luotavan tiedoston nimi. Voit haluttaessa yhdistää joitakin lippujen arvoja, esimerkiksi näin: CFile filemyfile; FileMyFile.Open( MyFile.txt, CFile::modeCreate + CFile::modeNoTruncate); Näillä lipuilla avataan tiedosto MyFile.txt, mikäli se on jo olemassa; muutoin luodaan samanniminen uusi tiedosto. Mikäli olisi käytetty ainoastaan lippua CFile::modeCreate, uusi tiedosto olisi luotu, vaikka vanhakin olisi ollut olemassa, joten CFile::modeNoTruncatelippu muuttaa CFile::modeCreate-lipun vaikutusta siten, ettei tiedostoja typistetä (truncate) nollan tavun mittaisiksi. Tässä liput on yhdistetty +-operaattorilla, mutta yhtä hyvin olisi voitu käyttää - operaattoria (TAI), esimerkiksi näin: CFile filemyfile;

17 Datan tallentaminen, lataaminen ja siirtäminen FileMyFile.Open( MyFile.txt, CFile::modeCreate CFile::modeNoTruncate); Tämä koodi toimii aivan samoin kuin edellinenkin, koska liput ovat bittikohtaista tietoa ja looginen TAI yhdistää ne aivan samoin kuin yhteenlaskukin. OSA VI LUKU Jos tiedoston avaaminen onnistuu, Open()-funktio palauttaa TRUEarvon FALSE-paluuarvo tarkoittaa avaamisen epäonnistumista. Open()-funktiolle voidaan valinnaisesti välittää kolmantena parametrinä CFileException-osoitin, jonka osoittamassa CFileException-oliossa on funktion suorittamisen jälkeen tiedot avaamisen mahdollisen epäonnistumisen syistä. TAULUKKO 23.1 Tiedoston avaamiseen tarkoitetut CFile::Open()-funktiolle syötettävät liput Lippu CFile::modeCreate CFile::modeNoTruncate CFile::modeRead CFile::modeWrite CFile::modeReadWrite CFile::shareDenyNone CFile::shareExclusive CFile::shareDenyRead CFile::shareDenyWrite CFile::typeText CFile::typeBinary Kuvaus Luo aina uuden tiedoston (vaikka samanniminen tiedosto olisi olemassa). Tämä lippu voidaan yhdistää CFile::modeCreatelipun kanssa haluttaessa luoda uusi tiedosto, mikäli samannimistä ei ole olemassa ja muuten avata nimetty tiedosto. Tiedosto avataan vain luettavaksi siihen ei voi kirjoittaa. Tiedosto avataan vain kirjoitettavaksi siitä ei voi lukea. Tiedosto avataan sekä lukemista että kirjoitta mista varten. Muut prosessit voivat lukea ja kirjoittaa tiedostoon. Muut prosessit eivät voi lukea ja kirjoittaa tiedostoon. Muut prosessit eivät voi lukea avatusta tiedostosta. Muut prosessit eivät voi kirjoittaa avattuun tiedostoon. Jotkut johdetuista luokista hyödyntävät tätä tekstinkäsittelyyn. Ei muokkaa merkkejä tiedostosta luettaessa tai siihen kirjoitettaessa. Jotkut johdetuista luokista vaativat tämän lipun. CFileException-olion käyttö Jos tiedostoa avattaessa sattuu virhe, välitetään ohjelmalle CFileException-olio. Virheen syy voidaan lukea CFileExceptionolion m_cause-jäsenmuuttujasta (CFileException-olion omat numerokoodit) tai m_ioserrorjäsenmuuttujasta (käyttöjärjestelmän virhekoodit). Tavallisimpia m_cause-muuttujan arvoja ovat CFileException::fileNotFound, CFileException::accessDenied ja CFileException::diskFull.

18 564 Puskurin lopun ohi lukeminen Ole tarkkana, ettet pyydä Read()- toimintoa lukemaan enempää tavuja kuin puskuriisi mahtuu. Tällaisessa tapauksessa saatetaan kirjoittaa ohjelman muiden osien päälle ja saadaan varmasti ohjelma kaatumaan tai muita ennakoimattomia ongelmia. Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen Tiedoston lukeminen ja kirjoittaminen Kun tiedosto on avattu, voit lukea sitä ja kirjoittaa siihen avausmoodin mukaisesti. Lukemista ja kirjoittamista varten CFile-luokassa on Read()- ja Write()-funktiot sekä niihin liitetty tiedosto-osoitin. Kun tiedosto on avattu, osoitetaan tiedoston alkuun. Jos tiedostosta luetaan 200 tavua, paikkaa päivitetään ja seuraava Read()-funktio lukeekin tietoa 200 tavun päästä tiedoston alusta. Tässä luvussa esitetään myöhemmin, kuinka tiedosto-osoitinta voidaan muokata. Tyypillinen Read()-funktion käyttö näyttäisi esimerkiksi tältä: CFile myfile( MyFile.txt,CFile::modeRead); char armyreadbuffer[200]; UINT ubytesread = myfile.read(armyreadbuffer,sizeof(armyreadbuffer)); Read()-funktio saa kaksi parametriä. Ensimmäinen on kohdepuskurin osoite. Tähän puskuriin kirjoitetaan kaikki luettu tieto. Toinen parametri kertoo Read()-funktiolle, kuinka monta tavua halutaan lukea; tavuja voi olla vain muutama tai sitten esimerkin tapaan vaikkapa puskurin koko. Kun Read()-funktio on suoritettu, palautetaan luettujen tavujen määrä. Tämä voi olla sama kuin niiden tavujen määrä, jotka oli määrä lukea tai tiedoston loppu kohdattaessa vähemmän mikä kertoo, että kaikki saatavilla olevat tavut oli luettu. Jos paluuarvo on nolla, tiedostossa ei ole jäljellä tavuja luettavaksi. Tämä voidaan kokeilla käytännössä yksinkertaisella valintaikkunapohjaisella (dialog-based) editorisovelluksella. Lisäät siis koodia valintaikkunan OnInitDialog()-käsittelijäfunktioon tekstin lukemiseksi tiedostosta, sen muokkaamiseksi ja tallentamiseksi takaisin tiedostoon OK-painiketta painettaessa. Ohjeet tämän FileEdit-valintaikkunasovelluksen tekemiseksi AppWizardilla löydät luvusta 5. Tämän jälkeen lisäät suuren tekstiruudun (edit control) pääikkunaan ja asetat sen MultiLine-tyylin käytettäväksi. Liitä vielä ClassWizardilla CString-tyyppinen m_editbox-muuttuja tekstiruutuun (ohjeet myös luvussa 5). Kun olet lisännyt listauksen 23.6 koodin CFileEditDlg-luokan OnInitDialog()-funktioon, voit lukea tekstin ohjelmaan kiinteästi koodatusta C:\MyFile.txt-tiedostosta.

19 Datan tallentaminen, lataaminen ja siirtäminen LISTAUS 23.6 LST23_6.CPP - Tiedoston sisällön lukeminen tekstikontrolliin OSA VI LUKU // TODO: Add extra initialization here 2 3 // ** Declare and open a file object for reading 4 CFile fileedittext; 5 if (fileedittext.open("c:\\myfile.txt",cfile::moderead)) 6 { 7 // ** Declare a large buffer for reading the text 8 char cbuf[512]; 9 UINT ubytesread; // ** Continue reading the file until no more data is read 12 while(ubytesread = 13 fileedittext.read(cbuf,sizeof(cbuf)-1)) 1 14 { 15 // ** Null terminate after the last character 16 cbuf[ubytesread] = NULL; // ** Add the buffer to the mapped CString 19 m_editbox += CString(cBuf); 20 } // ** Close the file 23 fileedittext.close(); // ** Send the m_editbox string to the edit control 26 UpdateData(FALSE); 27 } Listauksessa 23.6 CFile-luokan olio fileedittext määritellään rivillä 4 ja avataan rivillä 5 ohjelmaan kiinteästi koodatusta tiedostosta C:\MyFile.txt. Read()-funktio rivillä 13 käyttää rivillä 8 määriteltyä puskuria tiedostosta luettavien tavujen tallentamiseen. Read()-funktion toinen parametri määrittää, että luettavien tavujen määrä on yhtä pienempi kuin puskurin koko. Syy tähän on, että tiedostosta luettujen tavujen perään voitaisiin vielä lisätä NULL-merkki, jolloin puskuriin saadaan yksi nollaan päättyvä merkkijono (null terminated string). Kun merkkijono on päätetty NULL-merkillä, se voidaan muuntaa CStringolioksi ja lisätä CString-merkkijonon m_editbox loppuun rivillä 19. Jos tiedosto on ensimmäisellä lukukerralla pidempi kuin puskuri, koko toimintoa toistetaan, kunnes tiedosto on saatu luettua kokonaan. Kun Read()-funktio asettaa ubytesread-arvon nollaksi, while-silmukka päättyy ja tiedosto suljetaan Close()-funktiolla (rivillä 23). Teksti- Kenoviivan (\) käyttö Huomaa, että koodissa rivillä 5 on kaksi kenoviiva. Kyseessä ei ole kirjoitusvirhe, vaan kenoviivaa käytetään C-kielessä (ja C++:ssa) erikoismerkkien merkitsemiseen, kuten \n (rivinvaihto), \r (telanpalautus) ja \b (korjaus). Tästä syystä jokainen \ pitää esittää merkinnällä \\. 1 Tätä while-silmukkaa toistetaan, kunnes Read()-funktio palauttaa arvon, joka kertoo, ettei tavuja enää luettu. Tällöin ollaan tiedoston lopussa.

20 566 Nollaan päättyvät merkkijonot Nollaan päättyvä merkkijono (null-terminated string) on (yksiulotteinen) merkkitaulukko, jossa varsinaisten merkkien jälkeen on NULL-merkki (nolla) ilmoittamassa merkkijonon loppumista. Nollaan päättyvät merkkijonot ovat yleisiä C- koodissa ja niiden kanssa voidaan käyttää useita funktioita. Esimerkiksi strlen() palauttaa merkkijonon pituuden ja strcpy()- funktiolla voidaan kopioida toisena parametrinä annettu merkkijono ensimmäiseen. strcmp()-funktio puolestaan vertaa kahta merkkijonoa ja palauttaa nollan, jos ne ovat samoja. Näiden ja monien muiden vastaavien funktioiden dokumentointi löytyy Microsoftin sähköisestä manuaalista String Manipulation Routines -otsikon alta. Näitä funktioita käytettäessä on toteutustiedostoon otettava mukaan #include-lauseella string.h-tiedosto. 1 Koko tekstikontrollin teksti voidaan tulostaa yhdellä Write()- funktiolla, koska sen pituus tunnetaan etukäteen. Sovelluksen tietojen ulkoistaminen Datan tallentaminen, lataaminen ja siirtäminen kontrolliin liitetyn m_editbox-muuttujan sisältö päivitetään kontrolliin rivin 26 funktiolla UpdateData(FALSE). Tässä on editorisovelluksen lukeva osa kokonaisuudessaan. Kun käännät ja ajat sovelluksen näiden rivien lisäämisen jälkeen, saat sovellukseen esiin C:\MyFile.txt tiedoston sisältämän tekstin. Voit luoda tuon tiedoston esimerkiksi Windowsin Muistiolla (Notepad) kirjoittamalla siinä tekstiä ja tallentamalla sen tiedostoon C:\MyFile.txt. Käyttäjän painettua OK-painiketta tekstin muuttamisen jälkeen joudut kirjoittaman muutokset takaisin tiedostoon. Tämä onnistuu aina luomalla uusi tiedosto (siis kirjoittamalla se vanhan päälle) ja käyttämällä Write()-funktiota tekstiruutuun liitetyn CString-muuttujan sisällön kirjoittamiseen tiedostoon. Lisää ClassWizardilla OK-painikkeelle BN_CLICKED-käsittelijä nimeltään OnOK tekstiruudun sisällön tallettavaa koodia varten (listaus 23.7). Löydät lisätietoja BN_CLICKED-käsittelijän lisäämisestä luvusta 4. LISTAUS 23.7 LST23_7.CPP Tekstiruudun tietojen kirjoittaminen levytiedostoon 1 void CFileEditDlg::OnOK() 2 { 3 // TODO: Add extra validation here 4 5 // ** Set the m_editbox string from the edit control 6 UpdateData(TRUE); 7 8 // ** Declare and open a file object for writing 9 CFile fileedittext; 10 if (fileedittext.open("c:\\myfile.txt", 11 CFile::modeCreate + CFile::modeWrite)) 12 { 13 // ** Write out the full string 14 fileedittext.write((const char*lpcstr) 15 m_editbox,m_editbox.getlength()); // ** Close the file 18 fileedittext.close(); 19 } CDialog::OnOK(); 22 }

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä Pekka Ryhänen & Erkki Pesonen 2002 BlueJ:n käyttö Nämä ohjeet on tarkoitettu tkt-laitoksen mikroluokan koneilla tapahtuvaa käyttöä varten. Samat asiat pätevät myös muissa luokissa ja kotikäytössä, joskin

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 4.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 4.3.2009 1 / 35 Tiedostot Tiedostojen käsittelyä tarvitaan esimerkiksi seuraavissa tilanteissa: Ohjelman käsittelemiä

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Muilla kielillä: English Suomi Pong-peli, vaihe 3 Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Jaetaan ohjelma pienempiin palasiin (aliohjelmiin) Lisätään peliin maila (jota ei voi vielä

Lisätiedot

RockID-varastonhallintajärjestelmän käyttöohje. v. 1.0

RockID-varastonhallintajärjestelmän käyttöohje. v. 1.0 RockID-varastonhallintajärjestelmän käyttöohje v. 1.0 Yleistä Rockstar lukijakäyttöliittymä Tuotteiden lukeminen lähtevään tilaukseen Tilaukseen kuulumattomat tuotteet Tuotteiden lukeminen tilauksesta

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

Kaakkois-Suomen Ammattikorkeakoulu Oy Mikkelin Ammattikorkeakoulu Oy Kymenlaakson Ammattikorkeakoulu Oy

Kaakkois-Suomen Ammattikorkeakoulu Oy Mikkelin Ammattikorkeakoulu Oy Kymenlaakson Ammattikorkeakoulu Oy Opiskelijoiden OneDriveohje Kaakkois-Suomen Ammattikorkeakoulu Oy Mikkelin Ammattikorkeakoulu Oy Kymenlaakson Ammattikorkeakoulu Oy Ohjeen nimi Opiskelijoiden OneDrive-ohje Vastuuhenkilö Mari Jokiniemi

Lisätiedot

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.

Lisätiedot

Hiirisanomiin vastaaminen

Hiirisanomiin vastaaminen OSA II LUKU 8 163 8 LUKU Reagointi käyttäjän painaessa tai vapauttaessa hiiren painikkeen Omien funktioiden käyttö, kun hiiri liikkuu Hiirikoordinaattien käsittely ja valitun alueen tutkiminen 164 Näppäinpainallusten

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 16.3.2009 1 / 40 Kertausta: tiedostosta lukeminen Aluksi käsiteltävä tiedosto pitää avata: tiedostomuuttuja = open("teksti.txt","r")

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

MDI-sovellusten kehittäminen

MDI-sovellusten kehittäminen OSA V 491 LUKU 21 21 LUKU MDI-sovelluksen luominen Siirtyminen dokumentti, näkymä- ja kehysluokan välillä Sovelluksen kehittäminen MFC;n monidokumentti/näkymä-arkkitehtuurilla 492 Kehittyneet dokumentti/näkymä-tekniikat

Lisätiedot

Web Services tietokantaohjelmoinnin perusteet

Web Services tietokantaohjelmoinnin perusteet ASP.NET Web Services Web Services tietokantaohjelmoinnin 2 (22) Sisällys Harjoitus 1: Tietokannat ja Web Services... 3 Harjoitus 2: Windows Client... 10 Harjoitus 3: Datan päivitys TableAdapterin avulla...

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset 815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,

Lisätiedot

Ohjeisto tiedonsiirrosta

Ohjeisto tiedonsiirrosta Liite 6 1(24) KEMIN ENERGIA Ohjeisto tiedonsiirrosta Janne Pirttimaa 27.2.2013 Liite 6 2(24) Sisällysluettelo 1. TIEDONKERUUKIRJASTON MUOKKAAMINEN... 3 2. KIRJASTON SIIRTÄMINEN LAITTEESEEN... 11 3. MITTAUSTEN

Lisätiedot

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi Muilla kielillä: English Suomi Pong-peli, vaihe 7 Tässä vaiheessa lisäämme peliin pistelaskun. Pong-pelissä pelaaja saa pisteen kun pallo ohittaa toisen pelaajan mailan. 1. Aliohjelmakutsu laskureita varten

Lisätiedot

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

Lisätiedot

Ohjeet asiakirjan lisäämiseen arkistoon

Ohjeet asiakirjan lisäämiseen arkistoon Ohjeet asiakirjan lisäämiseen arkistoon 1. Jos koneellesi ei vielä ole asennettu Open Office ohjelmaa, voit ladata sen linkistä joka löytyy Arkisto => Asiakirjapohjat sivulta seuran kotisivuilta. Jos ohjelma

Lisätiedot

Käyttäjän käsikirja. LIB 500 ja LIB 510 v.4.0.2. 8.2. Releasettelutyökalu. 8.2.1. Yleistä. ,NNXQDMRNDLOPRLWWDDHWWlNRKGHRQSlLYLWHWWlYl

Käyttäjän käsikirja. LIB 500 ja LIB 510 v.4.0.2. 8.2. Releasettelutyökalu. 8.2.1. Yleistä. ,NNXQDMRNDLOPRLWWDDHWWlNRKGHRQSlLYLWHWWlYl 1MRS751368-RUM Käyttäjän käsikirja 8.1. Releyksikön valitseminen Releyksiköt esitetään asemakuvassa painikkeina. 8 $VHPDNXYDMRVVDQlN\\UHOH\NVLNN Jos kohteita tarvitsee päivittää, avataan ikkuna (Kuva 8.1.-2)

Lisätiedot

Teknillinen korkeakoulu T-76.115 Tietojenkäsittelyopin ohjelmatyö. Testitapaukset - Koordinaattieditori

Teknillinen korkeakoulu T-76.115 Tietojenkäsittelyopin ohjelmatyö. Testitapaukset - Koordinaattieditori Testitapaukset - Koordinaattieditori Sisällysluettelo 1. Johdanto...3 2. Testattava järjestelmä...4 3. Toiminnallisuuden testitapaukset...5 3.1 Uuden projektin avaaminen...5 3.2 vaa olemassaoleva projekti...6

Lisätiedot

Harjoitustyö: virtuaalikone

Harjoitustyö: virtuaalikone Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman

Lisätiedot

Mainosankkuri.fi-palvelun käyttöohjeita

Mainosankkuri.fi-palvelun käyttöohjeita Mainosankkuri.fi-palvelun käyttöohjeita Sisällys 1. Johdanto... 1 2. Sisäänkirjautuminen... 1 3. Palvelussa navigointi... 2 4. Laitteet... 2 5. Sisällönhallinta... 4 6. Soittolistat... 7 7. Aikataulut...

Lisätiedot

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

MicroStation V8i-käyttöympäristö

MicroStation V8i-käyttöympäristö MicroStation V8i-käyttöympäristö Liite 2 Pääkäyttäjän ohjeet Juha Orre Tekniikan koulutusalan opinnäytetyö Kone- ja tuotantotekniikka Insinööri (AMK) KEMI 2013 SISÄLLYS Liite 2 2(14) SISÄLLYS... 2 1 KÄYTTÖOHJEET...

Lisätiedot

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli 22.12.2015

Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 IT Juha Nalli 22.12.2015 Kirkkopalvelut Office365, Opiskelijan ohje 1 / 17 Oppilaat saavat vuoden 2016 alusta käyttöönsä oppilaitoksen sähköpostin ja muita palveluita Microsoftin Office365:sta. Oppilaiden sähköposti on muotoa

Lisätiedot

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla Tietojen syöttäminen ohjelmalle Tähän mennessä on käsitelty Javan tulostuslauseet System.out.print ja System.out.println sekä ohjelman perusrakenneosat (muuttujat, vakiot, lauseet). Jotta päästään tekemään

Lisätiedot

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9. Python linkit: Python tutoriaali: http://docs.python.org/2/tutorial/ Numpy&Scipy ohjeet: http://docs.scipy.org/doc/ Matlabin alkeet (Pääasiassa Deni Seitzin tekstiä) Matriisit ovat matlabin perustietotyyppejä.

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CS-A1111 14.9.2016 CS-A1111 Ohjelmoinnin peruskurssi Y1 14.9.2016 1 / 19 Oppimistavoitteet: tämän luennon jälkeen osaat kirjoittaa Python-ohjelman, joka pyytää käyttäjältä lukuja,

Lisätiedot

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.

Lisätiedot

2006 i&i Solutions Oy

2006 i&i Solutions Oy 2006 i&i Solutions Oy Materiaali on vapaasti käytettävissä. Alkuperäiseen materiaaliin ei saa kuitenkaan tehdä muutoksia ja alkuperäinen tekijä (i&i Solutions Oy) on aina oltava näkyvissä. Mikäli materiaalista

Lisätiedot

Tietojen tallentaminen

Tietojen tallentaminen 245 L U K U 6 Tietojen tallentaminen Oppitunti 1: Tiedosto-I/O 246 Oppitunti 2: Sovelluksen tietojen serialisointi 254 Oppitunti 3: Rekisterin käsittely 265 Laboratorio 6: Tallennettujen tietojen käsittely

Lisätiedot

ASENNUS- JA KÄYTTÖOHJE

ASENNUS- JA KÄYTTÖOHJE ASENNUS- JA KÄYTTÖOHJE YKSIKKÖHINTA SOPIMUKSEN TOTEUTUNEET MÄÄRÄT-SOVELLUS CMPRO5 VERSIO 2.8 PÄIVITETTY HEINÄKUU 2010 COPYRIGHT 2010 ARTEMIS FINLAND OY. ALL RIGHTS RESERVED. KÄYTTÖOHJE SIVU 2 (12) SISÄLLYSLUETTELO

Lisätiedot

(Kuva2) (Kuva 3 ja 4)

(Kuva2) (Kuva 3 ja 4) Navigointi (Kuva1) Perinteisestä ohjelmasta poiketen, GIMP käyttöliittymä muodostuu useasta ikkunasta. Siinä on pääikkuna, joka sisältää työstettävän kuvan sekä ylärivin dropdown valikkoina kaikki ohjelman

Lisätiedot

Miten siirrän omat työni Office 365:stä Peda.nettiin sekä jaan sen siellä muille Eija Arvola

Miten siirrän omat työni Office 365:stä Peda.nettiin sekä jaan sen siellä muille Eija Arvola Miten siirrän omat työni Office 365:stä Peda.nettiin sekä jaan sen siellä muille Eija Arvola 16.12.2017 UUDEN SIVUN LUOMINEN OMAAN TILAAN Jos haluat tallentaa omia töitäsi Peda.nettiin, sinun pitää luoda

Lisätiedot

KÄYTTÖOHJE LATOMO VERSO

KÄYTTÖOHJE LATOMO VERSO Kirjautuminen Kirjatuminen järjestelmään tapahtuu syöttämällä ylläpitäjältä (yleensä sähköpostilla) saatu käyttäjätunnus ja salasana niille varattuihin kenttiin. Jos olet unohtanut salasanasi voit syöttää

Lisätiedot

Julkinen. Suomen Pankin ja Finanssivalvonnan suojattu sähköposti: ulkoisen käyttäjän ohje

Julkinen. Suomen Pankin ja Finanssivalvonnan suojattu sähköposti: ulkoisen käyttäjän ohje Ohje 1 (10) Suomen Pankin ja Finanssivalvonnan suojattu sähköposti: ulkoisen käyttäjän ohje Sisällys 1 Johdanto... 1 2 Suojatun viestin vastaanottaminen... 1 3 Suojatun viestin lukeminen... 2 4 Vastaanotetun

Lisätiedot

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

Webinaariin liittyminen Skype for

Webinaariin liittyminen Skype for Webinaariin liittyminen Skype for Business Web Appin kautta Ohjeet Sähköpostin Liity webinaariin tästä -linkki Kun klikkaat Osallistumisohjeet webinaariin -sähköpostiviestissä olevaa Liity webinaariin

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 17.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 17.2.2010 1 / 41 Sanakirja Monissa sovelluksissa on tallennettava rakenteeseen avain arvo-pareja. Myöhemmin rakenteesta

Lisätiedot

1 (14) Ohje. Ohje. GTK-wiki. Geologian tutkimuskeskus, Verkkosivustopalvelut

1 (14) Ohje. Ohje. GTK-wiki. Geologian tutkimuskeskus, Verkkosivustopalvelut 1 (14) GTK-wiki 2 (14) Sisällysluettelo 1. Wikin ylläpito... 3 1.1. Wiki-artikkelin muokkaus... 3 1.2. Wiki-artikkelin lisääminen... 3 2. Wiki-toiminnot... 4 2.1. Ristiinlinkitys... 4 2.2. Tekstin muotoilu...

Lisätiedot

Ohjeita LINDOn ja LINGOn käyttöön

Ohjeita LINDOn ja LINGOn käyttöön Ohjeita LINDOn ja LINGOn käyttöön LINDOn tärkeimmät komennot ovat com (command), joka tuloaa käytettävissä olevat komennot ruudulle, ja help, jonka avulla saa tietoa eri komennoia. Vaaukset kursiivilla

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

VHS-kasetin kopiointi DVD-levylle Adobe Premiere Elements -ohjelmalla

VHS-kasetin kopiointi DVD-levylle Adobe Premiere Elements -ohjelmalla Kopiointiohjeita_VHS2DVD 17.3.2016 1 VHS-kasetin kopiointi DVD-levylle Adobe Premiere Elements -ohjelmalla I Kasetin luku Adobe Premiere Elements -ohjelmaan Kytke virta tietokoneeseen, näyttöön ja videolaitteeseen.

Lisätiedot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan

Lisätiedot

Lahden Teho-Opetus Oy. Opetusohjelmien Palvelinohjelma. Käyttö- ja asennusohjeet

Lahden Teho-Opetus Oy. Opetusohjelmien Palvelinohjelma. Käyttö- ja asennusohjeet Lahden Teho-Opetus Oy Opetusohjelmien Palvelinohjelma Käyttö- ja asennusohjeet YLEISTÄ Lahden Teho-Opetus Oy:n opetusohjelmia voidaan nyt käyttää verkon välityksellä siten, että itse opetusohjelma asennetaan

Lisätiedot

12. Näppäimistöltä lukeminen 12.1

12. Näppäimistöltä lukeminen 12.1 12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.

Lisätiedot

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Tällä kurssilla on tutustuttu ohjelmistojen mallintamiseen oliomenetelmiä ja UML:ää käyttäen Samaan aikaan järjestetyllä kurssilla on käsitelty

Lisätiedot

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä LUOKAN MÄÄRITTELY Luokka, mitä se sisältää Luokan määrittely Olion ominaisuudet eli attribuutit Olion metodit Olion muodostimet ja luonti Olion tuhoutuminen Metodin kutsu luokan ulkopuolelta Olion kopioiminen

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 12.4.2010 T-106.1208 Ohjelmoinnin perusteet Y 12.4.2010 1 / 34 Graafiset käyttöliittymät Tähän asti kirjoitetuissa ohjelmissa on ollut tekstipohjainen käyttöliittymä.

Lisätiedot

Ohjelmointi 1 Taulukot ja merkkijonot

Ohjelmointi 1 Taulukot ja merkkijonot Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko

Lisätiedot

6 XML-työkalut 1. 6 XML-työkalut

6 XML-työkalut 1. 6 XML-työkalut 6 XML-työkalut 1 6 XML-työkalut XML:n periaatteiden tutustumisen jälkeen on helpompi tutustua XML-dokumenttien käsittelyyn ja katseluun suunniteltuja työkaiuja. XML:n yleistymisen pahin pullonkaula on

Lisätiedot

Opintokohteiden muokkaus

Opintokohteiden muokkaus 1 Opintokohteiden muokkaus Näiden ohjeiden avulla hahmottuu kuinka opintokohteita voidaan muokata Opinto-oppaassa. Ohje on suunnattu käyttäjille, joilla on WebOodiin OpasMuokkaaja-oikeudet. WebOodin käyttölupia

Lisätiedot

edocker PUBLISH! -paketinhallinnan käyttöohje 9/2015

edocker PUBLISH! -paketinhallinnan käyttöohje 9/2015 edocker PUBLISH! -paketinhallinnan käyttöohje 9/2015 Uusien EDTPLIB- ja PDF -pakettien vienti ohjatulla toiminnolla...3 Tiedoston tarkistus...3 Kohdejulkaisun valinta... 4 Numeron tiedot... 5 Yhteenveto...6

Lisätiedot

Condes. Quick Start opas. Suunnistuksen ratamestariohjelmisto. Versio 8. Quick Start - opas Condes 8. olfellows www.olfellows.fi 1.

Condes. Quick Start opas. Suunnistuksen ratamestariohjelmisto. Versio 8. Quick Start - opas Condes 8. olfellows www.olfellows.fi 1. Condes Suunnistuksen ratamestariohjelmisto Versio 8 Quick Start opas Yhteystiedot: olfellows Jouni Laaksonen Poijukuja 4 21120 RAISIO Sähköposti: jouni.laaksonen@olfellows.fi www.olfellows.fi olfellows

Lisätiedot

Nspire CAS - koulutus Ohjelmiston käytön alkeet Pekka Vienonen

Nspire CAS - koulutus Ohjelmiston käytön alkeet Pekka Vienonen Nspire CAS - koulutus Ohjelmiston käytön alkeet 3.12.2014 Pekka Vienonen Ohjelman käynnistys ja käyttöympäristö Käynnistyksen yhteydessä Tervetuloa-ikkunassa on mahdollisuus valita suoraan uudessa asiakirjassa

Lisätiedot

JÄRJESTELMÄN TEKNINEN KÄYTTÖOHJE

JÄRJESTELMÄN TEKNINEN KÄYTTÖOHJE JÄRJESTELMÄN TEKNINEN KÄYTTÖOHJE TEKNINEN OHJE OSAAJAPLUS- JÄRJESTELMÄN KÄYTTÖÖN OsaajaPlus -järjestelmä on luotu siten, että sen käyttöön tarvittavat ohjelmat ovat maksutta ladattavissa internetistä.

Lisätiedot

Suvi Junes/Pauliina Munter Tietohallinto/Opetusteknologiapalvelut 2014

Suvi Junes/Pauliina Munter Tietohallinto/Opetusteknologiapalvelut 2014 Tietokanta Tietokanta on työkalu, jolla opettaja ja opiskelijat voivat julkaista tiedostoja, tekstejä, kuvia ja linkkejä alueella. Opettaja määrittelee lomakkeen muotoon kentät, joiden kautta opiskelijat

Lisätiedot

Salasanojen turvallinen tallentaminen KeePass ohjelmalla

Salasanojen turvallinen tallentaminen KeePass ohjelmalla Salasanojen turvallinen tallentaminen KeePass ohjelmalla KeePass on vapaasti saatavilla oleva, avoimen lähdekoodin ohjelma, jonka tarkoituksena on auttaa salasanojen hallinnassa. Tämä KeePass ohje on päivitetty

Lisätiedot

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010 11. Luokka Opetellaan seuraavaksi, miten omia luokkia kirjoitetaan. Aikaisemmin olikin jo esillä, että luokka on tietorakenne, joka sisältää sekä tiedot (attribuutit) että niitä käsittelevät aliohjelmat

Lisätiedot

Elisa Kassa - Tuotetietojen tuonti järjestelmään (Import products)

Elisa Kassa - Tuotetietojen tuonti järjestelmään (Import products) Elisa Kassa - Tuotetietojen tuonti järjestelmään (Import products) Tämän ohjeen avulla opit tuomaan tuotetietoja Elisa Kassaan käyttämällä hyväksi tiedostoa (esim. Microsoft Excel tai OpenOffice). Tuotteiden

Lisätiedot

ClassPad fx-cp400 päivitys. + Manager for ClassPad II Subscription päivitys

ClassPad fx-cp400 päivitys. + Manager for ClassPad II Subscription päivitys ClassPad fx-cp400 päivitys + Manager for ClassPad II Subscription päivitys Käyttöjärjestelmän ja Add-in sovellusten päivityksestä Casio suosittelee aina viimeisimmän käyttöjärjestelmän asentamista. Tällöin

Lisätiedot

Luettelo-, puu-, parannetun tekstiruutu- sekä HTML-näkymän käyttö

Luettelo-, puu-, parannetun tekstiruutu- sekä HTML-näkymän käyttö Luettelo-, puu-, parannetun tekstiruutu- sekä HTML-näkymän käyttö OSA V 439 LUKU 19 19 LUKU Luettelo-, puu-, parannetun tekstiruutu- sekä HTML-näkymän käyttö Luettelon tietojen ylläpito List View näkymässä

Lisätiedot

Action Request System

Action Request System Action Request System Manu Karjalainen Ohjelmistotuotantovälineet seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 25.10.2000 Action Request System (ARS) Manu Karjalainen Ohjelmistotuotantovälineet

Lisätiedot

ATK tähtitieteessä. Osa 4 - IDL input/output. 19. syyskuuta 2014

ATK tähtitieteessä. Osa 4 - IDL input/output. 19. syyskuuta 2014 19. syyskuuta 2014 IDL - INPUT/OUTPUT-rutiinit IDL pystyy lukemaan ja kirjoittamaan monentyyppisiä tiedostoja, esim. FORTRAN ja C-kielten ohjelmien tulostusta. Käytössä on myös monipuoliset tulostuksen

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 23.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 23.2.2009 1 / 44 Debuggeri Tyypillinen tilanne: ohjelma on kirjoitettu, Python-tulkki ei valita virheistä, mutta

Lisätiedot

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE HERVANNAN KIRJASTON TIETOTORI Insinöörinkatu 38 33720 Tampere 040 800 7805 tietotori.hervanta@tampere.fi TALLENNETAAN MUISTIKULLE JA MUISTIKORTILLE 1 Muistitikun

Lisätiedot

Siirtyminen Outlook 2010 -versioon

Siirtyminen Outlook 2010 -versioon Tämän oppaan sisältö Microsoft Microsoft Outlook 2010 näyttää hyvin erilaiselta kuin Outlook 2003. Tämän oppaan tarkoituksena on helpottaa uuden ohjelman opiskelua. Seuraavassa on tietoja uuden käyttöliittymän

Lisätiedot

UpdateIT 2010: Editorin käyttöohje

UpdateIT 2010: Editorin käyttöohje UpdateIT 2010: Editorin käyttöohje Käyttäjätuki: Suomen Golfpiste Oy Esterinportti 1 00240 HELSINKI Puhelin: (09) 1566 8800 Fax: (09) 1566 8801 E-mail: gp@golfpiste.com Sisällys Editorin käyttöohje...

Lisätiedot

Nettiposti. Nettiposti käyttöohje

Nettiposti. Nettiposti käyttöohje YKSIKÄÄN ASIAKAS EI OLE MEILLE LIIAN PIENI TAI MIKÄÄN HAASTE LIIAN SUURI. Nettiposti Nettiposti käyttöohje Tässä käyttöohjeessa kuvataan selainkäyttöisen Nettiposti sähköpostiohjelman toiminnot. Käyttöohje

Lisätiedot

Verkkosivut perinteisesti. Tanja Välisalo 11.2.2009

Verkkosivut perinteisesti. Tanja Välisalo 11.2.2009 Verkkosivut perinteisesti Tanja Välisalo 11.2.2009 WWW-sivujen vieminen omaan kotisivutilaan yliopiston mikroverkossa https://salasana.jyu.fi Klikkaa painiketta Activate WWW Klikkaa painiketta Activate

Lisätiedot

Tarva LC (Level Crossing) pikaohje Harri Peltola & Mikko Virkkunen

Tarva LC (Level Crossing) pikaohje Harri Peltola & Mikko Virkkunen Tarva LC (Level Crossing) pikaohje 17.1. 2014 Harri Peltola & Mikko Virkkunen 2 Kirjautuminen TarvaLC-ohjelmaan kirjaudutaan linkistä: http://tarvalc.myapp.info/tarvadb/tarva/tarva.html henkilökohtaisella

Lisätiedot

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014 18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,

Lisätiedot

LIITE 1 1. Tehtävänä on mallintaa kitara ohjeiden mukaan käyttäen Edit Poly-tekniikkaa.

LIITE 1 1. Tehtävänä on mallintaa kitara ohjeiden mukaan käyttäen Edit Poly-tekniikkaa. LIITE 1 1 HARJOITUS 1 Kitara Tehtävänä on mallintaa kitara ohjeiden mukaan käyttäen Edit Poly-tekniikkaa. Käsiteltävät asiat Edit Poly Muokkaus kuvan mukaan TurboSmooth Extrude 1. Tarkistetaan että mittayksiköt

Lisätiedot

Kurssien lukulistojen ylläpito Nellissä ja siirto Moodleen

Kurssien lukulistojen ylläpito Nellissä ja siirto Moodleen Kurssien lukulistojen ylläpito Nellissä ja siirto Moodleen Nellistä voi siirtää kirjallisuuslistoja Moodle-oppimisympäristöön. Näin voidaan tarjota opiskelijalle esimerkiksi verkkokurssin oheislukemistona

Lisätiedot

Epooqin perusominaisuudet

Epooqin perusominaisuudet Epooqin perusominaisuudet Huom! Epooqia käytettäessä on suositeltavaa käyttää Firefox -selainta. Chrome toimii myös, mutta eräissä asioissa, kuten äänittämisessä, voi esiintyä ongelmia. Internet Exploreria

Lisätiedot

Discendum Oy

Discendum Oy 1 CV+ ansioluettelon luominen ja muokkaus CV+ - Yleistä 3 CV+ -ansioluettelon luominen 5 Tietojen muokkaaminen Perustoiminnot 7 CV+ sisältöjen otsikoiden muokkaus 8 Koulutus- ja työkokemustiedot Todistuksen

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

Osallistavan suunnittelun kyselytyökalu

Osallistavan suunnittelun kyselytyökalu Osallistavan suunnittelun kyselytyökalu Käyttöohje InnoGIS- hankkeen aikana kehitetylle pilottiversiolle Dokumentti sisältää pilottiversiona toimivan kyselyn laatimiseen ja vastaamiseen liittyvän ohjeistuksen.

Lisätiedot

C++11 lambdat: [](){} Matti Rintala

C++11 lambdat: [](){} Matti Rintala C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n

Lisätiedot

Welcome to the World of PlayStation Pika-aloitusopas

Welcome to the World of PlayStation Pika-aloitusopas Welcome to the World of PlayStation Pika-aloitusopas Suomi PCH-2016 7025574 PlayStation Vita-järjestelmän käyttäminen ensimmäistä kertaa Paina viisi sekuntia Kytke virta PS Vita -järjestelmään. Kun kytket

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 9.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 9.9.2015 1 / 26 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Suvi Junes Tietohallinto / Opetusteknologiapalvelut 2012

Suvi Junes Tietohallinto / Opetusteknologiapalvelut 2012 Tiedostot Uudet ominaisuudet: - Ei Tiedostot-kohtaa alueen sisällä, vaan tiedostonvalitsin, jolla tiedostot tuodaan alueelle siihen kohtaan missä ne näytetään - Firefox-selaimella voi työpöydältä raahata

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 19.1.2011 T-106.1208 Ohjelmoinnin perusteet Y 19.1.2011 1 / 39 Haluatko antaa palautetta luennoista? Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti Vast

Lisätiedot

Tarva MT (Maantie) pikaohje. 25.10. 2012 Harri Peltola & Mikko Virkkunen

Tarva MT (Maantie) pikaohje. 25.10. 2012 Harri Peltola & Mikko Virkkunen Tarva MT (Maantie) pikaohje 25.10. 2012 Harri Peltola & Mikko Virkkunen 2 Kirjautuminen Tarva MT -ohjelmaan kirjaudutaan linkistä: http://tarvamt.myapp.info/tarvadb/tarva/tarva.html henkilökohtaisella

Lisätiedot

Sarjallistaminen. Juha Järvensivu 2007

Sarjallistaminen. Juha Järvensivu 2007 Sarjallistaminen Juha Järvensivu juha.jarvensivu@tut.fi 2007 Sisällys 1. tunti: Sarjallistaminen.NET ympäristössä 2. tunti: Sarjallistaminen Java ympäristöstä Sarjallistaminen Muutetaan objektin tila muotoon,

Lisätiedot

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 5.10.2016 CSE-A1111 Ohjelmoinnin peruskurssi Y1 5.10.2016 1 / 21 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

Lisätiedot

Tekstikontrollit LUKU. Tekstin ja sanomien esittäminen valintaikkunoissa. Tekstin muokkaaminen suorituksen aikana. Tiedon tarkistaminen syötön aikana

Tekstikontrollit LUKU. Tekstin ja sanomien esittäminen valintaikkunoissa. Tekstin muokkaaminen suorituksen aikana. Tiedon tarkistaminen syötön aikana OSA II LUKU 5 85 5 LUKU Tekstin ja sanomien esittäminen valintaikkunoissa Tekstin muokkaaminen suorituksen aikana Tiedon tarkistaminen syötön aikana Kontrollien toiminnan laajentaminen aliluokkien avulla

Lisätiedot

TIETOKONE JA TIETOVERKOT TYÖVÄLINEENÄ

TIETOKONE JA TIETOVERKOT TYÖVÄLINEENÄ aaro.leikari@hotmail.com TIETOKONE JA TIETOVERKOT TYÖVÄLINEENÄ 25.01.2016 SISÄLLYS 1. Käyttöjärjestelmän asentaminen... 1 1.1 Windowsin asettamia laitteistovaatimuksia... 1 1.2 Windowsin asentaminen...

Lisätiedot

Sähköpostitilin käyttöönotto. Versio 2.0

Sähköpostitilin käyttöönotto. Versio 2.0 Sähköpostitilin käyttöönotto Versio 2.0 Sivu 1 / 10 Jarno Parkkinen jarno@atflow.fi 1 Johdanto... 2 2 Thunderbird ohjelman lataus ja asennus... 3 3 Sähköpostitilin lisääminen ja käyttöönotto... 4 3.1 Tietojen

Lisätiedot

Tilastokeskuksen rajapintapalveluiden käyttöönotto QGISohjelmistossa

Tilastokeskuksen rajapintapalveluiden käyttöönotto QGISohjelmistossa 1(13) Tilastokeskuksen rajapintapalveluiden käyttöönotto QGISohjelmistossa (QuantumGIS) Ohjeita laatiessa on käytetty QuantumGIS:n versiota 2.0.1. Ruudunkaappauskuvat ovat englanninkielisestä versiosta,

Lisätiedot

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne

Lisätiedot

INTERBASE 5.0 PÄIVITYS VERSIOON 5.6

INTERBASE 5.0 PÄIVITYS VERSIOON 5.6 1 INTERBASE 5.0 PÄIVITYS VERSIOON 5.6 HUOM: Tämä ohje on tarkoitettu yksittäisen koneen päivittämiseen, mikäli InterBase on asennettu serverille ota yhteys DL Software Tukeen. HUOM: Mikäli koneessasi on

Lisätiedot

OP-eTraderin käyttöopas

OP-eTraderin käyttöopas OP-eTraderin käyttöopas Tämä käyttöopas on lyhennetty versio virallisesta englanninkielisestä käyttöoppaasta, joka löytyy etrader - sovelluksen Help-valikosta tai painamalla sovelluksessa F1 -näppäintä.

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen Ohjelmointitaito (ict1td002, 12 op) Kevät 2009 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-kehitysympäristö Java-ohjelma ja luokka

Lisätiedot

Informaatiotekniikan kehitysyksikkö

Informaatiotekniikan kehitysyksikkö SAVONIA Savonia RPM Käyttöopas Informaatiotekniikan kehitysyksikkö 18.8.2011 Sisällysluettelo 1. Perusnäkymä... 3 2. Kirjautuminen... 4 3. Rekisteröinti... 5 4. Idean jättäminen... 6 4. Arviointi... 8

Lisätiedot

Goalkeeper Game Statistics (v12) käyttöohjeet

Goalkeeper Game Statistics (v12) käyttöohjeet 1 Goalkeeper Game Statistics (v12) käyttöohjeet Oikeudet Goalkeeper game statistics v12 ohjelman tekijänoikeudet ovat pysyvästi tekijällä (Markku Aalto, Vantaa, markku.aalto@finhockey.fi), ellei niitä

Lisätiedot