<map version="0.7.1">
<node TEXT="GKO, luennot 6.-8.5.2004">
<node TEXT="Bittikartat ja framet" POSITION="right">
<node TEXT="Delphi-moniste: multimediaa Delphill&#xe4; -&gt; J&#xe4;tettiin p&#xe4;&#xe4;teohjauksiin ja demoihin"/>
<node TEXT="Esimerkkiohjelma: liikkuvat autot ja TAuto-komponentti" FOLDED="true">
<node TEXT="Ks. Delphin Helpist&#xe4; TPaintBox, TCanvas ja esimerkki"/>
<node TEXT="Canvas kapseloi WinAPIn standardit piirtofunktiot" FOLDED="true">
<node TEXT="TPaintBox suunniteltu erityisesti piirt&#xe4;mist&#xe4; varten"/>
<node TEXT="Monilla muillakin komponenteilla on Canvas (esim Form)"/>
<node TEXT="HIDAS. Ei vakavaan pelik&#xe4;ytt&#xf6;&#xf6;n."/>
<node TEXT="Yksitt&#xe4;isten pikselien k&#xe4;sittely&#xe4; nopeampi tapa on k&#xe4;ytt&#xe4;&#xe4; TBitmapin ScanLine -property&#xe4;, joka on matalan tason taulukkoesityksen yksitt&#xe4;isist&#xe4; riveist&#xe4;, ks. delpin help"/>
<node TEXT="J&#xe4;re&#xe4;mp&#xe4;&#xe4; grafiikan k&#xe4;sittely&#xe4; varten kannattaa k&#xe4;ytt&#xe4;&#xe4; DirectX:aa tai OpenGL:aa (menev&#xe4;t kurssin ulkopuolelle...)"/>
<node TEXT="monis&#xe4;ikeisiss&#xe4; sovelluksissa Canvas on syyt&#xe4; lukita piirron ajaksi (lock ja unlock -metodit)"/>
</node>
<node TEXT="TImageList: Bittikartojen keskitetty hallinta listarakenteessa" FOLDED="true">
<node TEXT="Sis&#xe4;lt&#xe4;&#xe4; Draw-metodin, joka piirt&#xe4;&#xe4; m&#xe4;&#xe4;r&#xe4;tyn bittikartan Canvas-olioon"/>
<node TEXT="ImageListia voi k&#xe4;ytt&#xe4;&#xe4; mm. menujen ikonien varastointiin"/>
</node>
<node TEXT="Kokeile doublebuffered-property&#xe4; ja autojen dynaamista lis&#xe4;yst&#xe4;" FOLDED="true">
<node TEXT="doublebuffered: oliot piirret&#xe4;&#xe4;n ensin muistiin ja vasta sitten ruudulle kerralla"/>
<node TEXT="hidasta, mutta v&#xe4;hent&#xe4;&#xe4; v&#xe4;lkkymist&#xe4; verrattuna siihen, ett&#xe4; jokainen olio piirrett&#xe4;isiin esikseen"/>
</node>
</node>
<node TEXT="Framet " FOLDED="true">
<node TEXT="Framet == komponenttimalleja, jotka voivat sis&#xe4;lt&#xe4;&#xe4; useita komponentteja"/>
<node TEXT="Framekin on komponentti (ja samalla olio), jolle voi merkit&#xe4; omia propertyj&#xe4; ja toimintoja" FOLDED="true">
<node TEXT="Valitettavasti Framen omat propertyt eiv&#xe4;t n&#xe4;y object inspectorissa..."/>
<node TEXT="Frameja voidaan peri&#xe4; toisistaan kuten muitakin komponentteja ja lomakkeita"/>
<node TEXT="Uuden framen periminen: File-&gt;New-&gt;Other-&gt;Projektin nimi. Valitse dialogin alaosasta inherit-optio ja frame, josta haluat peri&#xe4;"/>
</node>
<node TEXT="Frames-esimerkki" FOLDED="true">
<node TEXT="Framen luonti: File-&gt;new frame"/>
<node TEXT="Sijoitellaan frameen komponentit ja tehd&#xe4;&#xe4;n mahdollisia tapahtumak&#xe4;sittelij&#xf6;it&#xe4;"/>
<node TEXT="Framen saa komponettipalettiin painamalla lomakkeen ponnahdusvalikosta Add to Palette"/>
<node TEXT="Framea voi k&#xe4;ytt&#xe4;&#xe4; suunnitteluaikana tai dynaamisesti ajonaikana (kuten muutkin komponentit)"/>
<node TEXT="Autolaskuri Frameilla"/>
</node>
<node TEXT="Framet soveltuvat my&#xf6;s esim. tietokantasovelluksen k&#xe4;ytt&#xf6;liittym&#xe4;n toistuviin osiin" FOLDED="true">
<node TEXT="Esim. editoitavat kent&#xe4;t:"/>
<node TEXT="Oletus: jokaisella kent&#xe4;ll&#xe4; on Label-komponentti, jossa on kent&#xe4;n nimi. Lis&#xe4;ksi label osoittaa editoitavaan kentt&#xe4;&#xe4;n (focuscontrol)"/>
<node TEXT="Tehd&#xe4;&#xe4;n yliluokkaframe, joka sis&#xe4;lt&#xe4;&#xe4; pelk&#xe4;n labelin ja hoitaa focuscontrolin asettamisen, kunhan kohdekomponentti asetataan"/>
<node TEXT="Perit&#xe4;&#xe4;n framesta edit-versio, memoversio ja labelversio (readonly-kentti&#xe4; varten)"/>
<node TEXT="Frameja voi laajentaa esim. m&#xe4;&#xe4;rittelem&#xe4;ll&#xe4; kentille validointis&#xe4;&#xe4;nt&#xf6;j&#xe4; ja ottamalla mukaan tietokannan k&#xe4;sittely&#xe4; tai k&#xe4;ytt&#xe4;j&#xe4;n n&#xe4;kem&#xe4;n esityksen muokkausta"/>
</node>
<node TEXT="Eritt&#xe4;in k&#xe4;yt&#xe4;nn&#xf6;llisi&#xe4;, v&#xe4;hent&#xe4;v&#xe4;t koodia huomattavasti"/>
<node TEXT="Ongelmia saattaa tulla, jos muokataan (erityisesti peritty&#xe4;) framea, joka on jo sijoitettu suunnitteluaikana sovellukseen" FOLDED="true">
<node TEXT="Varaudu muokkaamaan DFM-tiedostoa"/>
<node TEXT="Suurissa muutoksissa pid&#xe4; varmuuskopiot edellisest&#xe4; tilanteesta"/>
<node TEXT="...tai hy&#xf6;dynn&#xe4; versionhallintaj&#xe4;rjestelm&#xe4;&#xe4; (esim. CVS), jos sellainen on k&#xe4;ytett&#xe4;viss&#xe4;"/>
</node>
<node TEXT="Frameja voi sijoittaa komponenttien tapaan paketteihin, mutta niiden k&#xe4;ytt&#xf6; suunnitteluaikana sovelluksessa edellytt&#xe4;&#xe4; my&#xf6;s niiden lis&#xe4;&#xe4;mist&#xe4; sovellukseen" FOLDED="true">
<node TEXT="Dynaamisessa k&#xe4;yt&#xf6;ss&#xe4; pelkk&#xe4; pakettiin (tai yleens&#xe4; DLL-tiedostoon) sijoittaminen riitt&#xe4;&#xe4;"/>
<node TEXT="Seuraus: jos monessa sovelluksessa k&#xe4;ytet&#xe4;&#xe4;n samoja frameja, koodin hallinta sovellusten v&#xe4;lill&#xe4; on mietitt&#xe4;v&#xe4;."/>
<node TEXT="T&#xe4;ll&#xf6;in frame-koodit kannattaa pit&#xe4;&#xe4; yhdess&#xe4; paikassa ja ottaa ne manuaalisesti mukaan tarvittaviin sovelluksiin."/>
</node>
</node>
</node>
<node TEXT="Korttikomponentit" FOLDED="true" POSITION="left">
<node TEXT="so. &quot;miten tehd&#xe4; windowsin pasianssi&quot; ja muut vastaavat oliopohjaisesti :-)"/>
<node TEXT="Ks. UML-luokkakaavio"/>
<node TEXT="Alkuper&#xe4;inen koodi vuodelta 1997 (Tanja Partanen ja Niina Riikonen + V. Lappalaisen muutoksia)" FOLDED="true">
<node TEXT="Ei metodien kuormitusta k&#xe4;yt&#xf6;ss&#xe4;..."/>
<node TEXT="Korttien kuvat tallennettu resurssitiedostoon, joka on muodostettu RC-tiedoston avulla" FOLDED="true">
<node TEXT="Wanha (jo win16), mutta edelleen toimiva tekniikka staattisen datan liitt&#xe4;miseen sovelluskiin"/>
<node TEXT="RC-tiedoston voi k&#xe4;&#xe4;nt&#xe4;&#xe4; RES-tiedostoksi Resource Compilerilla"/>
<node TEXT="Esim. brcc32 pelikort.rc">
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
<node TEXT="Komponentteja">
<node TEXT="Kortti"/>
<node TEXT="Pakka - tallettaa kortteja"/>
<node TEXT="APakka - animoitu pakka (kortit lent&#xe4;v&#xe4;t pakasta toiseen)"/>
<node TEXT="Liikkuva - kuljettaa komponenttia n&#xe4;yt&#xf6;ll&#xe4;"/>
<node TEXT="raahattava - komponentti joka ottaa hiirell&#xe4; raahattavaksi toisen komponentin"/>
<node TEXT="Raahausp - pakka, josta voi ottaa kortin raahattavaksi"/>
<node TEXT="SaantoP - pakka, johon voi laittaa vain tietyn ehdon t&#xe4;ytt&#xe4;vi&#xe4; kortteja"/>
<node TEXT="Poyta - komponentti, johon voi laittaa monta pakkaa"/>
<node TEXT="Poytap - p&#xf6;yd&#xe4;lle laitettava pakka"/>
</node>
<node TEXT="Yksinkertainen esimerkki: hullun pasianssi" FOLDED="true">
<node TEXT="P&#xf6;yt&#xe4;, ajakopakka ja raahauspakka"/>
<node TEXT="lis&#xe4;t&#xe4;&#xe4;n raahauspakkaan kortti, joka pyydet&#xe4;&#xe4;n jakopakalta"/>
<node TEXT="huom. randomize ja pakan sekoittaminen"/>
<node TEXT=" Peli&#xe4; pelattaessa pelaaja laskee painallukset 1,2,3...13,1,2,... Jos jossakin kohti tulee sama numero kuin ollaan laskemassa, peli ei mene l&#xe4;pi."/>
<node TEXT="ohjauksissa annetun teht&#xe4;v&#xe4;n korjattu ja kommentoitu versio lis&#xe4;tty korttipeliesimerkkiin"/>
</node>
<node TEXT="Esimerkkiohjelma animoiduista pakoista ja VCL/CLX-k&#xe4;&#xe4;nn&#xf6;st&#xe4;: j&#xe4;rjest&#xe4;">
<node TEXT="projektia ladatessa t&#xe4;ytyy olla k&#xe4;ytett&#xe4;viss&#xe4; paketit laskuri(vcl tai clx) ja jarj(vcl tai clx)"/>
<node TEXT="$R-direktiivi, joka lataa DFM- (vcl) tai XFM-tiedoston (clx) t&#xe4;ytyy merkit&#xe4; lomaketiedostoihin k&#xe4;sin delphin ulkopuolella ennen latausta, muuten voi tulla ongelmia komponenttien latauksen kanssa"/>
<node TEXT="ohjelma tarkoitettu j&#xe4;rjest&#xe4;misalgoritmien opetteluun"/>
</node>
<node TEXT="Esimerkkiohjelma s&#xe4;&#xe4;nt&#xf6;pakoista: napoleonin hauta">
<node TEXT="s&#xe4;&#xe4;nn&#xf6;t: ensimm&#xe4;isen kortin nro, muutos, lopetusehto, jatkamisehto lopetuksenj j&#xe4;lkeen"/>
</node>
</node>
<node TEXT="&quot;R&#xe4;iskint&#xe4;&quot;peli" POSITION="right">
<node TEXT="Liikkuva auto -esimerkki edelleenkehitettyn&#xe4;"/>
<node TEXT="Esimerkki komponenttien &apos;liimailusta&apos; ja luokkahierarkiasta"/>
<node TEXT="&quot;R&#xe4;iskint&#xe4;&quot; on t&#xe4;ss&#xe4; yleinimitys peleille, joissa on olioita, animaatioita ja t&#xf6;rm&#xe4;yksi&#xe4;"/>
<node TEXT="Vaihtoehtoisia toteutustapoja (ks. VL.n komp.txt)" FOLDED="true">
<node TEXT="Itse liikkuvat kontrollit" FOLDED="true">
<node TEXT="kontrollit sis&#xe4;lt&#xe4;v&#xe4;t omat timerinsa"/>
<node TEXT="kontrollin liikkumisen j&#xe4;lkeen tehd&#xe4;&#xe4;n t&#xf6;rm&#xe4;ystarkistus muille kontrolleille"/>
<node TEXT="ei skaalaudu suurille kontrollim&#xe4;&#xe4;rille"/>
</node>
<node TEXT="Avaruuden ohjaamat kontrollit">
<node TEXT="timer vain avaruudessa, jokaisella &quot;kierroksella&quot; kutsutaan jokaisen kontrollin toimintametodia"/>
<node TEXT="tarkastetaan jokaisella kierroksella kaikkien olioiden t&#xf6;rm&#xe4;ykset"/>
</node>
<node TEXT="Avaruuden ohjaamat komponentit, piirret&#xe4;&#xe4;n avaruuden piirtopinnalle (&quot;R&#xe4;iskint&#xe4;&quot;peli k&#xe4;ytt&#xe4;&#xe4; t&#xe4;t&#xe4; tapaa)">
<node TEXT="kuten edellinen, mutta avaruus vastaa piirrosta"/>
<node TEXT="kevyempi ja nopeampi ratkaisu edelliseen verrattuna"/>
<node TEXT="avaruutta ei voi editoida suunnittelun aikana (onko tarpeellista? pelin &quot;kentti&#xe4;&quot; varten voidaan tehd&#xe4; oma editori...)"/>
</node>
<node TEXT="Huom. ainakin 3D-koodaajille pit&#xe4;isi olla tuttua tavaraa, my&#xf6;s muille hy&#xf6;dyllist&#xe4; ajateltavaa vaikka ei pelej&#xe4; tekisik&#xe4;&#xe4;n"/>
</node>
<node TEXT="komponentit ovat suoraan projektissa (ei installoida, ei voi editoida object inspectorissa)"/>
<node TEXT="huom. ikoni (tallentuu res-tiedostoon)"/>
<node TEXT="pelikomponentit" FOLDED="true">
<node TEXT="SpriteSpace" FOLDED="true">
<node TEXT="sis&#xe4;lt&#xe4;&#xe4; polymorfisen listan spritej&#xe4;, joka k&#xe4;yd&#xe4;&#xe4;n l&#xe4;pi jokaisella timer-kierroksella"/>
<node TEXT="piirto spacen omalle piirtopinnalle"/>
</node>
<node TEXT="Sprite" FOLDED="true">
<node TEXT="yliluokka kaikille avaruudessa n&#xe4;kyville olioille"/>
</node>
<node TEXT="MovingSprite" FOLDED="true">
<node TEXT="sprite-hierarkiaan sovitettu versio &quot;Likkuva Auto&quot;-kontrollista"/>
</node>
<node TEXT="Auto" FOLDED="true">
<node TEXT="liikkuva olio, joka voi h&#xe4;vit&#xe4; t&#xf6;rm&#xe4;yksess&#xe4;"/>
</node>
<node TEXT="RusinaksiMuuttuvaAuto" FOLDED="true">
<node TEXT="sis&#xe4;lt&#xe4;&#xe4; r&#xe4;j&#xe4;hdysanimaation, joka ajetaan t&#xf6;rm&#xe4;yksess&#xe4; oman timerin avulla"/>
<node TEXT="auto poistetaan avaruudesta r&#xe4;j&#xe4;hdyksen j&#xe4;lkeen"/>
</node>
<node TEXT="TrafficLights" FOLDED="true">
<node TEXT="paikallaan oleva olio"/>
<node TEXT="ei sis&#xe4;ll&#xe4; erityist&#xe4; reagointia"/>
</node>
<node TEXT="Brain" FOLDED="true">
<node TEXT="mahdollistaa mukautetun k&#xe4;ytt&#xe4;ytymisen _samaa luokkaa_ oleville olioille"/>
</node>
<node TEXT="DriversBrain" FOLDED="true">
<node TEXT="&quot;&#xe4;lykkyys&quot;: auto osaa pys&#xe4;hty&#xe4; t&#xf6;rm&#xe4;tess&#xe4;&#xe4;n punaisiin liikennevaloihin"/>
<node TEXT="kun valo on vihre&#xe4;, auto jatkaa vanhalla nopeudellaan"/>
</node>
</node>
<node TEXT="l&#xe4;ht&#xf6;kohta: liikkuva auto-esimerkki laajennettuna" FOLDED="true">
<node TEXT="t&#xf6;rm&#xe4;ykset (react-metodi)"/>
<node TEXT="r&#xe4;j&#xe4;hdykset (rusinaksiMuuttuvaAuto)"/>
<node TEXT="liikennevalot (oma spriteluokka)"/>
<node TEXT="reagointi liikennevaloihin (driversBrain)"/>
</node>
</node>
<node TEXT="3d:t&#xe4; Delphill&#xe4;" FOLDED="true" POSITION="right">
<node TEXT="sinform: ohjelma funktion kuvaajien piirt&#xe4;miseen (apua demoihin...)"/>
<node TEXT="m3d: apuluokka 3d-muunnoksiin ja matriisien k&#xe4;sittelyyn"/>
<node TEXT="piirto3d: pinnnan piirto 3d-rotatoituna"/>
</node>
<node TEXT="Kertausta: komponentin tekemisest&#xe4;" FOLDED="true" POSITION="left">
<node TEXT="Usein uusi komponentti syntyy siirt&#xe4;m&#xe4;ll&#xe4; omaan sovellukseen tehty&#xe4; &apos;yleisk&#xe4;ytt&#xf6;ist&#xe4;&apos; koodia uuteen komponenttiin"/>
<node TEXT="Erityisesti, jos monen ikkunan tapahtumak&#xe4;sittelij&#xe4;&#xe4;n tulee monta kertaa samaa koodia, on syyt&#xe4; harkita uutta komponenttia..."/>
<node TEXT="Toki voi my&#xf6;s edet&#xe4; vesiputousmallin mukaan analyysi-&gt;suunnittelu-&gt;toteutus"/>
<node TEXT="k&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; omia ohjelmia tehdess&#xe4; suunnitelmat muuttuvat kuitenkin, kun koodatessa keksii parempia tapoja tehd&#xe4; jokin asia =&gt; iteratiivista kehityst&#xe4;"/>
<node TEXT="Komponentteja teht&#xe4;ess&#xe4; on huomioitava, tehd&#xe4;&#xe4;nk&#xf6; VCL- vai CLX (Kylix-yhteensopiva) -komponenttia">
<node TEXT="Usein on mahdollista k&#xe4;ytt&#xe4;&#xe4; samaa koodia molempiin (ks. Lappalaisen VCLCXL-komponentit)"/>
<node TEXT="Sovellusta teht&#xe4;ess&#xe4; komponenttipaletissa n&#xe4;kyv&#xe4;t vain &quot;oman&quot; komponenttikirjaston komponentit"/>
<node TEXT="Sovelluksessakin voi k&#xe4;ytt&#xe4;&#xe4;  CLX-vakiota, mutta delphi ei v&#xe4;ltt&#xe4;m&#xe4;tt&#xe4; ymm&#xe4;rr&#xe4; niit&#xe4; suunnitteluaikana (ks. korttiesimerkki). t&#xe4;m&#xe4; voi aiheuttaa &apos;component ??? is not installed-tyylisi&#xe4; virheilmoituksia, vaikka komponentti oikeasti olisikin j&#xe4;rjestelm&#xe4;ss&#xe4; (mutta &apos;v&#xe4;&#xe4;r&#xe4;n&apos; komponenttikirjaston alla!)"/>
<node TEXT="VCL-tiedostoja ei saa sis&#xe4;llytt&#xe4;&#xe4; CLX-pakettiin (tai p&#xe4;invastoin). ei, vaikka delphi t&#xe4;llaista ehdottaisi k&#xe4;&#xe4;nt&#xe4;misen yhteydess&#xe4;"/>
<node TEXT="jos VCL/CLX-vakio ei ole ajan tasalla, touch-operaatio (pakotettu muutos) l&#xe4;hdekooditiedostoille ja uudelleenk&#xe4;&#xe4;nt&#xf6; saattaa auttaa..."/>
</node>
<node TEXT="Demoja tehdess&#xe4; kysyttiin, kuinka omia komponentteja voi editoida &quot;visuaalisesti&quot;" FOLDED="true">
<node TEXT="Vastaus: Delphiss&#xe4; ei voi (Javalla voi tietyin edellytyksin)"/>
<node TEXT="kuitenkin: Framet helpottavat tilannetta jonkin verran k&#xe4;ytt&#xf6;liittym&#xe4;komponenttien osalta"/>
</node>
</node>
<node TEXT="windowsin viestink&#xe4;sittelyn perusteita" FOLDED="true" POSITION="left">
<node TEXT="ks. delphin help (hae windows messages, overview)"/>
<node TEXT="windowsin kannalta kaikki j&#xe4;rjestelm&#xe4;n tapahtumat ovat viestej&#xe4;"/>
<node TEXT="jokaisella windows-komponentilla on oma viestisilmukka, jonne windows l&#xe4;hett&#xe4;&#xe4; tiedon tapahtumista"/>
<node TEXT="useampi komponentti voi vastaanottaa saman viestin"/>
<node TEXT="c-kielisiss&#xe4; windows-ohjelmissa viestisilmukka piti kirjoittaa k&#xe4;sin (k&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; valtava switch/case-h&#xe4;ss&#xe4;kk&#xe4;)"/>
<node TEXT="viestisilmukka on delhiss&#xe4;kin (wndproc), mutta piilotettu wincontrol-komponenttiin, joten kehitt&#xe4;j&#xe4;n ei tarvitse yleens&#xe4; siit&#xe4; v&#xe4;litt&#xe4;&#xe4;"/>
<node TEXT="message-tyyppisill&#xe4; metodeilla voi &quot;kaapata&quot; suoraan viestink&#xe4;sittelij&#xe4;n (delphin tapahtumat ovat per&#xe4;isin Control-luokassa olevista message-tyypin metodeista)"/>
<node TEXT="huom. yhden sovelluksen sis&#xe4;ll&#xe4; tapahtumank&#xe4;sittelij&#xe4; suoritetaan loppuun, ennen muiden tapahtumak&#xe4;sittelij&#xf6;iden (esim. komponentin piirto) suoritusta. "/>
<node TEXT="jos tapahtumak&#xe4;sittelij&#xe4;n suorituksen aikana tulee uusia viestej&#xe4;, ne menev&#xe4;t windowsin viestisilmukkaan"/>
<node TEXT="viestej&#xe4; voi l&#xe4;hett&#xe4;&#xe4; manuaalisesti winapin sendmessage- ja postmessage-metodeilla"/>
<node TEXT="tarkemmin winapi-osuudessa..."/>
</node>
</node>
</map>
