P R O G R A M U J E M Enos SQL <strong>sk</strong>utoène obsahuje nesprávny re azec (pozri okno Result), ktorý je prístupnýv poli New Value, a teda ho môžeme opravi (<strong>na</strong> obrázku vidíme opravenú verziu). Ak terazstlaèíme tlaèidlo Modify, zmeny sa premietnu do programu a my sme si ušetrili jednukompiláciu. Samozrejme, túto chybu bude potrebné v zdrojovom kóde tak èi tak opravi ,takže sa vám možno celý postup zdal zbytoèný. Môžete si však by istí, že pri písaníväèších programov vám funkcia Evaluate/Modify neraz príde vhod.Náš program je teda odladený, body prerušenia preto môžeme odstráni . Ladenie väèšíchaplikácií je však komplikovanejšie, preto neraz zistíme, že program predsa len nefunguje tak,ako by mal, a body prerušenia musia spä <strong>na</strong> svoje miesto. Ak si nie ste celkom istí, že programbude pracova správne, body prerušenia neodstraòujte, iba ich deaktivujte. To jemožné urobi prostredníctvom kontextového menu v okne Breakpoint List.Medzi zaujímavé vlastnosti bodu prerušenia patrí to, že nemusí by aktívny vždy, môžesa aktivova sám vo chvíli, keï je splnená urèitá podmienka. Práve túto schopnos debuggerasi ukážeme <strong>na</strong> druhom ukážkovom programe. Ten bude využíva komponentObr. 6TQuery, <strong>na</strong> rozdiel od predchádzajúceho príkladu však bude obsahova trošku viac kódu,pretože jeho úlohou bude zisti zoz<strong>na</strong>m polí komponentu TQuery a zobrazi ho v komponenteTListBox. Samozrejme, aj tento program bude obsahova chybu.Pôvodný kód predchádzajúceho programu odstránime a <strong>na</strong>hradíme ho novým. Na formulárpridáme komponent typu TListBox, ktorý <strong>na</strong>zveme Polia. Vlastnos SQL komponentuTQuery bude obsahova príkazselect * from animalsSamotný kód, ktorého úlohou bude <strong>na</strong>èíta zoz<strong>na</strong>m polí, má <strong>na</strong>sledujúcu podobu:procedure TForm1.FirstBtnClick(Sender: TObject);var i:integer;beginQuery.Close;Query.Open;Polia.Items.Clear;for i :=0 to Query.FieldCount doPolia.Items.Add(Query.Fields[i].FieldName);end;Po spustení programu sa komponent TListBox síce <strong>na</strong>plní, no <strong>na</strong> konci cyklu vzniknevýnimka „List index out of bounds (5)“. Èíslo 5 v zátvorke je neklamným z<strong>na</strong>mením toho,že problém <strong>na</strong>stane pri piatom prechode cyklom. Zrejme už tušíte, ktorý riadok budepríèinou vzniku výnimky. Našu teóriu si však musíme overi , preto umiestnime bod prerušenia<strong>na</strong> predposledný riadok. Mimochodom, všimnite si, že riadok zaèí<strong>na</strong>júci sa cyklomfor je rozdelený <strong>na</strong> dve èasti, prièom kód sa generuje pre každú z nich (t. j. aj prvý, ajdruhý riadok majú v ¾avej èasti ok<strong>na</strong> editora bodku). V tomto prípade riadok musí byrozdelený, pretože i<strong>na</strong>k by bod prerušenia s podmienkou nefungoval. Po zaradení boduprerušenia sa presunieme do ok<strong>na</strong> Breakpoint List, kde z kontextového menu vyberiemepoložku Properties. Zobrazí sa nám dialógové okno, ktoré vyplníme pod¾a obrázka è. 5.Presnejšie povedané, vyplníme iba riadok Condition, pretože Delphi ostatné položkyvyplní za nás, a následne stlaèíme tlaèidlo Modify. Po týchto úpravách sa nám beh programupreruší, len èo premenná i <strong>na</strong>dobudne hodnotu 5. Potvrdila sa teda <strong>na</strong>ša teória,že problémy spôsobil predposledný riadok, cyklus má totiž vyzera takto:for i :=0 to Query.FieldCount-1 doPolia.Items.Add(Query.Fields[i].FieldName);Príkaz AssertTým z vás, ktorí programovali v jazyku C++, akiste netreba príkaz assert osobitne predstavova. Ide o príkaz, ktorý preberá ako parameter výraz typu boolean. Ak je hodnotavýrazu true, nestane sa niè, ak však výraz <strong>na</strong>dobudne hodnotu false, vznikne výnimka„Assertion failure“. Aby vám však tento príkaz fungoval, musíte ma v <strong>na</strong>staveniachDelphi zaškrtnutú vo¾bu Assertions.Ak patríte alebo ste patrili medzi náruživých hráèov, ktorí „hltali“ každú demoverziuhry, je celkom pravdepodobné, že ste sa s týmto príkazom už stretli. Ja som sa s nímdostal prvýkrát do kontaktu niekedy okolo roku 1994, keï som hral demoverziu DarkForces. Veselo si chodím, strie¾am zloduchov a zrazu èier<strong>na</strong> obrazovka. Najprv som simyslel, že „spadol“ DOS4G/W (extender, ktorý hra používala), no potom som si preèítalchybové hlásenie, ktoré znelo „Assertion failed“. Dokonca bol <strong>na</strong> obrazovke vypísaný ajnázov C súboru spolu s riadkom, kde problém <strong>na</strong>stal (žia¾, ani názov súboru, ani èísloriadka si už nepamätám). Druhý kontakt bol iba nepriamy: v istom nemenovanom hernomèasopise sa istý èitate¾ s ažoval, že mu istá hra neustále padala a vypisovala nieèoako „Assertion failure“. Problém vyriešil až <strong>na</strong>jnovší patch. Ako vidíme, tento príkaz sapoužíva pomerne èasto, preto by sme sa ho mali <strong>na</strong>uèi používa aj my.Vrá me sa však spä k pôvodnej téme. Hoci by sa mohlo zda , že príkaz assert jemožné <strong>na</strong>hradi príkazom typuif Variable=true then....nie je to celkom tak. Príkaz Assert totiž nevypisuje iba hlásenie, ale aj presné èíslo riadkaa názov súboru, ktorý výnimku spôsobil. Najjednoduchší spôsob, ako si príkaz vy<strong>sk</strong>úša ,je takýto:procedure TForm1.Button1Click(Sender: TObject);beginAssert(false);end;Tento riadok spôsobí zobrazenie chybového hlásenia, ktoré vidíme <strong>na</strong> obrázku èíslo 6.Praktické využitie tohto príkazu závisí predovšetkým od vás. Ja osobne som ho zaèalpoužíva , keï som pracoval <strong>na</strong> jednom väèšom programe. Obsahoval viacero databáz,prièom kód <strong>na</strong> urèitom mieste programu databázu zatvoril, v dôsledku èoho som potommusel trpie hlásenia typu „Cannot perform this operation on a closed dataset“. Riadok,ktorý databázu ilegálne zatváral, som <strong>na</strong>šiel práve prostredníctvom príkazu assert: jednoduchosom viacero týchto príkazov rozmiestnil okolo miesta problému a túto „sluèku“ som postupnezužoval. H¾adaný riadok sa mi <strong>na</strong>koniec podarilo nájs a chybu odstráni .NabudúceNabudúce budeme pokraèova v rozoberaní problematiky ladenia aplikácií. Povieme si,ako nám pri ladení môžu by užitoèné výnimky, a ukážeme si možnosti ladenia v Delphi 5.Dovtedy vám prajem ve¾a úspechov pri „vychytávaní múch“ vo vašich programoch.n Ivan Zernovác ml.PREDPLATNÉ PC REVUE NA ROK 2001n Stáli predplatitelia (súkromné osoby aj firmy), ktorí mali èasopis predplatený v <strong>na</strong>šom vydavate¾stvePERFEKT (nie v iných distribuèných spoloènostiach), už nemusia posiela novú objednávku.Spolu s novembrovým èíslom dostali aj poštovú poukážku (súkromné osoby), resp. s januárovým èíslomfaktúru (firmy) <strong>na</strong> zaplatenie predplatného <strong>na</strong> rok 2001. Pokia¾ chcete by informovaní o stavevybavovania vašej objednávky, môžete <strong>na</strong> zadnú stranu zloženky v èasti „správa pre prijímate¾a“uvies vašu e-mailovú adresu. Kto by z nejakého dôvodu poštovú poukážku nedostal, prosím, vyžiadajtesi ju <strong>na</strong> <strong>na</strong>šom oddelení predplatného (tel.: 07/524 99 783, e-mail: predplatne@pcrevue.<strong>sk</strong>).n Noví predplatitelia si môžu objed<strong>na</strong> predplatné <strong>na</strong> rok 2001 prostredníctvom objednávkovéhokupónu vloženého v èasopise. Objednávky prijímame poštou <strong>na</strong> adrese redakcie, faxom <strong>na</strong> è. 07/52499788, mailom <strong>na</strong> adrese: predplatne@pcrevue.<strong>sk</strong> alebo cez web: <strong>www</strong>.pcrevue.<strong>sk</strong>. Do jednéhotýždòa od prijatia objednávky vám zašleme poštovú poukážku. Firmy a právnické osoby dostanú zaèiatkomjanuára faktúru, ktorú treba <strong>na</strong>jne<strong>sk</strong>ôr do 19. 1. 2001 uhradi . Ak do tohto termínunedostaneme vašu platbu, posielanie PC REVUE vám pozastavíme.n Upozornenie: Upozoròujeme predplatite¾ov, aby si vo vlastnom záujme objednávali predplatnéPC REVUE cez <strong>na</strong>šu redakciu, resp. cez <strong>na</strong>še vydavate¾stvo Perfekt, a nie cez PrNS èi cez iné distribuènéspoloènosti. Okrem z¾avnenej predplatite¾<strong>sk</strong>ej ceny, ktorú dostanete iba u nás, tak zí<strong>sk</strong>ateaj možnos objed<strong>na</strong>nia si PC REVUE spolu s CD.n Platby: Zloženku <strong>na</strong> predplatné <strong>na</strong> rok 2001 treba uhradi do 15. 12. 2000. Firmy a právnickéosoby dostanú faktúru, ktorú treba uhradi <strong>na</strong>jne<strong>sk</strong>ôr do 19. 1. 2001.S platbou neèakajte, objed<strong>na</strong>né výtlaèky zasielame až po prijatí platby. Uzávierka objed<strong>na</strong>ných azaplatených výtlaèkov je vždy 14 dní pred expedíciou nového èísla. Pri one<strong>sk</strong>orenej úhradenemôžeme zaruèi doposlanie predchádzajúcich èísel èasopisu, pretože náklad objednávame pod¾a<strong>sk</strong>utoèných objednávok.n Z¾avnené predplatné (študenti, dôchodcovia) si môžu nárokova tí, ktorí <strong>na</strong> adresu redakciezaslali potvrdenie o návšteve školy, resp. o poberaní dôchodku.n 4×CDR: Od roku 2001 bude PCR vychádza 4× do roka s prílohou CD REVUE. Preto odteraz budemožné objed<strong>na</strong> si PC REVUE aj spolu s CD.Ceny PC REVUE <strong>na</strong> rok 2001bez CD s CDVýtlaèok v stánku 49 Sk 95 SkPredplatné celoroèné 444 Sk 624 Sk 3 výtlaèky zadarmo!Predplatné celoroèné z¾avnené 396 Sk 576 Sk 4 výtlaèky zadarmo!Cenu zvoleného predplatného vpíšte do okienka <strong>na</strong> vašej poštovej poukážke.Za 12 èísel PCR v stánku by ste zaplatili 588 Sk. Jeho predplatenímzí<strong>sk</strong>ate v prípade riadneho predplatného vlastne 3 výtlaèky zadarmo a v prípade z¾avnenéhodokonca 4 výtlaèky zadarmo!12/2000 PC REVUE 119
P R O G R A M U J E M EVytvárame WAP stránky / 2. èasV tejto èasti si rozoberieme spôsob, akým sa programujú WAP stránky. Opíšeme si jazyk WML.Ak si preèítate tento èlánok, budete schopní vytvori WAP stránku. Túto WAP stránku si potommôžete zverejni <strong>na</strong> niektorom klasickom webovom serveri. Prezrie si ju môžete pomocoumobilného telefónu, ktorý podporuje WAP, alebo pomocou niektorého simulátora mobilnéhotelefónu. Simulátor mobilného telefónu si môžete zadarmo stiahnu z adries uvedených <strong>na</strong>konci tohto èlánku.Aj keï je jazyk WML daný všeobecne platnými normami, nie každý mobilný telefón hoimplementuje rov<strong>na</strong>ko. Rozdiely sa môžu vy<strong>sk</strong>ytnú už pri zobrazovaní WAP stránky <strong>na</strong>rôznych mobilných telefónoch (alebo ich simulátoroch). Sú spôsobené rozdielnymi ve¾kos amidisplejov, ako aj možnos ami mobilných telefónov (spolu s mobilnými simulátormi ich ïalejbudeme <strong>na</strong>zýva mobilné zariadenia). Niektoré mobilné zariadenia sú schopné zobrazi plnúgrafiku (jednoduché obrázky), niektoré zobrazujú iba grafické ikony a niektoré nie sú schopnézobrazi nijakú grafiku (zobrazujú iba jednoduchý text). To však nez<strong>na</strong>mená, že sa vám <strong>na</strong>niektorých mobilných zariadeniach stránky nezobrazia. Stránky sa <strong>na</strong> mobilných zariadeniachzobrazia vždy, ale v inom formáte.Keïže v dnešnej dobe sú tieto typy mobilných telefónov ešte stále „prepychové“, jelepšie používa niektorý simulátor. Ten je vhodné použi aj vtedy, ak nechcete, aby vámúèet za mobilný telefón vybehol do astronomických výšok. Pri <strong>sk</strong>úšaní týchto príkladovsme použili simulátor s názvom M3GATE. Nie je to simulátor v pravom zmysle slova,pretože mobilný telefón a mobilný organizér, aké simuluje simulátor M3GATE, by ste vponukách <strong>na</strong>šich operátorov márne h¾adali. M3GATE simuluje akési vymyslené univerzálnemobilné zariadenia. Jeho výhoda je v tom, že podporuje <strong>sk</strong>oro všetky možnostiWAP protokolu. Môžete si ho zadarmo stiahnu z adresy <strong>www</strong>.m3gate.com.1. Nu(d)tné základyZaènime pekne od zaèiatku. Na programovanieWAP stránok je definovanýjazyk WML (Wireless Markup Language),ktorý je ve¾mi podobný jazyku HTML.Tento jazyk vznikol ako „odvodeni<strong>na</strong>“od univerzálneho jazyka XML. Základnýrozdiel je v definovaní obrazoviek,ktoré sa majú zobrazi <strong>na</strong> mobilnomzariadení.Základná jednotka jazyka WML sa <strong>na</strong>zývakarta (card). Pomocou kariet sa vytváraprepojenie medzi používate¾omObr. 1 Základné jednotky WAP stránky mobilného zariadenia a WAP službou.Viac kariet je zo<strong>sk</strong>upených do jednejdo<strong>sk</strong>y – deck (do<strong>sk</strong>a je síce doslovný preklad anglického deck, ale niekedy môže dos znepreh¾adnitext, a preto budeme èasto používa pojem dokument). Je to <strong>na</strong>jmenšia jednotkaWML, ktorú je webový server schopný prenies do mobilného zariadenia. Keï sa do mobilnéhozariadenia prenesie jeden dokument, obyèajne sa <strong>na</strong> mobilnom telefóne zobrazív poradí prvá karta (existuje však spôsob, pomocou ktorého je možné ku každej karte v dokumentepristúpi priamo). Použitie dosiek a kariet preh¾adne znázoròuje obrázok 1.Hoci jed<strong>na</strong> karta by mala by <strong>na</strong>jzákladnejšou jednotkou, ktorú môže mobilné zariadeniezobrazi , nie je to tak. Na mobilných zariadeniach, ktoré majú ve¾ký displej, sa jed<strong>na</strong> kartazobrazí celá, ale ak mobilné zariadenie nemá dostatoène ve¾ký displej, rozdelí jednu kartu <strong>na</strong>viac obrazoviek, ktoré potom zobrazí a medzi ktorými môže používate¾ listova .Jazyk WML je citlivý <strong>na</strong> ve¾kos písmen, to z<strong>na</strong>mená, že Card a card sú dve odlišné karty,všetky z<strong>na</strong>èky musia by <strong>na</strong>písané malými písme<strong>na</strong>mi. Aby bol výsledný kód èo <strong>na</strong>jmenší, všetkynepotrebné formátovacie z<strong>na</strong>ky (nové riadky, tabulátory a medzery) sa <strong>na</strong>hrádzajú jednoumedzerou. To však nez<strong>na</strong>mená, že musíte písa WAP stránku do jedného dlhého riadka. Zhusteniekódu sa vykonáva až pri poslaní stránky do mobilného zariadenia. Keïže formát WML stránkyje ve¾mi podobný HTML stránke, opíšeme si len základné vlastnosti formátu WML stránky.Entity (entities)Základnou entitou je jeden z<strong>na</strong>k (písmeno, èíslica alebo z<strong>na</strong>èka). Entity, ktoré sa do editoraažko zadávajú, je možné <strong>na</strong>hradi ich ekvivalentom. Napríklad z<strong>na</strong>k & je <strong>na</strong>hradenýre azcom & každá entita, ktorá sa zaèí<strong>na</strong> z<strong>na</strong>kom &, musí sa konèi z<strong>na</strong>kom ; (bodkoèiarka).V tabu¾ke 1 sú uvedené použite¾né ekvivalenty entít.Z<strong>na</strong>èky (tags)Z<strong>na</strong>èka je k¾úèové slovo jazyka. Urèuje objekt (ten je zasa urèený svojím typom ajedineèným menom). Obsahuje aj iné atribúty, ktoré urèujú vlastnosti objektu. WMLstránka je teda klasický text, ktorého štruktúra a formát je urèený formátujúcimi z<strong>na</strong>èkami.Ostatné z<strong>na</strong>èky urèujú správanie sa WML stránky. Z<strong>na</strong>èku vo WML definujeme presnetak ako v HTML – musí by uzavretá medzi z<strong>na</strong>kmi “”. – z<strong>na</strong>èka, ktorá urèuje zaèiatok objektu. Môže obsahova nejaké atribúty. – urèuje koniec objektu. – je prázd<strong>na</strong> z<strong>na</strong>èka. Napríklad – prechod <strong>na</strong> nový riadok.Objekty (elements)Štruktúra a vzh¾ad WML stránky sa urèuje pomocou objektov. Objekt je možné definovadvoma spôsobmi: obsah objektu aleboPrvý spôsob definície objektu sa používa vtedy, keï objekt obsahuje nejaký obsah. Napríkladobjektom môže by jeden odsek v dokumente alebo odkaz <strong>na</strong> inú kartu. Druhý spôsob sa používa,ak objekt neobsahuje nijaký obsah. V tomto prípade sa objekt <strong>na</strong>zýva prázdny objekt.Zoz<strong>na</strong>m z<strong>na</strong>èiek, ktoré môžeme použi <strong>na</strong> definovanie objektov, je uvedený v tabu¾ke2. Všetky tieto z<strong>na</strong>èky sú podporované mobilnými telefónmi firmy NOKIA a simulátoromNokia WAP Toolkit 2.0.Pomocou týchto z<strong>na</strong>èiek môžeme definova nové karty a objekty v rámci WML dokumentu.Takisto je možné definova prepojenia medzi jednotlivými dokumentmi, presnejšiemedzi jednotlivými kartami v rámci jedného alebo viacerých dokumentov. Tieto prepojeniasa <strong>na</strong>zývajú linky (links) a majú rov<strong>na</strong>ký výz<strong>na</strong>m ako linky v HTML. Vo WML je možné definovaešte jeden typ objektu, podobný formuláru v HTML, ktorý urèuje, èo sa má vyko<strong>na</strong> ,ak používate¾ stlaèí tlaèidlo back alebo go. Tento typ objektov sa <strong>na</strong>zýva úloha (ta<strong>sk</strong>).Samozrejme, v tabu¾ke sú zobrazené len základné typy objektov. Všetky objektynájdete v referenènej príruèke <strong>na</strong> stránke WAP fóra (<strong>www</strong>.wapforum.org).AtribútyVlastnosti jednotlivých objektov sa urèujú pomocou atribútov objektov. Atribút je doplnkováinformácia k objektu. Definuje sa vždy v z<strong>na</strong>èke, ktorá urèuje zaèiatok objektu. Úplný tvarz<strong>na</strong>èky, ktorá urèuje zaèiatok objektu, je teda takýto:Atribúty sa odde¾ujú „bielymi z<strong>na</strong>kmi“ (medzera, tabulátor, nový riadok) a hodnotyatribútov musia by v úvodzovkách. Všetky mená atribútov musia by <strong>na</strong>písané malými písme<strong>na</strong>mi.Niektoré objekty majú povinné atribúty. Napríklad definícia objektu go (má jedenpovinný atribút – href):Ak neuvedieme nepovinné atribúty, použije sa default hodnota. Napríklad atribút align jenepovinný atribút pre objekt img. Ak ho nepoužijeme, použije sa hodnota align=”bottom”.KomentáreKomentár sa definuje presne tak ako v HTML:Jednotlivé komentáre nie je možné do seba vklada (nie je možné vytvára vloženékomentáre).PremennéParametre jednotlivých objektov v dokumente je možné <strong>na</strong>stavova aj pomocou premenných.Zadaním me<strong>na</strong> premennej <strong>na</strong> urèité miesto sa <strong>na</strong> jej miesto zapíše hodnotadanej premennej. Zápis premennej je <strong>na</strong>sledujúci:$MenoPremennej$(MenoPremennej)$(MenoPremennej:TypPremennej)Prvý spôsob slúži <strong>na</strong> zadanie premennej, kde jej meno je medzi z<strong>na</strong>kom $ a prvou medzerou.Druhý spôsob sa používa, ak za menom premennej nemôže <strong>na</strong>sledova premenná(<strong>na</strong>príklad: Manzelka pa<strong>na</strong> $Priezvi<strong>sk</strong>o za vola $(Priezvi<strong>sk</strong>o)ova). Pomocoutretieho zápisu môžeme definova ešte aj konverziu premennej. Ak chceme použi vdanom atribúte samotný z<strong>na</strong>k $, musíme ho zdvoji , <strong>na</strong>príklad .Na záver ešte raz pripomeniem, že jazyk WML je citlivý <strong>na</strong> ve¾kos písmen. To z<strong>na</strong>mená,že v menách premenných sa rozlišujú ve¾ké a malé z<strong>na</strong>ky. Mená atribútov a objektovmusia by <strong>na</strong>písané malými písme<strong>na</strong>mi.2. Štruktúra WML dokumentuKeïže jazyk WML je odvodený z jazyka XML, vlastne každá WML stránka je zároveò ajXML stránkou. Pod¾a jazyka XML musí každý dokument obsahova deklaráciu svojho typu.Táto deklarácia sa musí <strong>na</strong>chádza hneï <strong>na</strong> zaèiatku dokumentu. V <strong>na</strong>šom prípade samusí každá WML stránka zaèí<strong>na</strong> <strong>na</strong>sledujúcimi riadkami:Tieto riadky urèujú, že ide o WML stránku <strong>na</strong>písanú vo formáte XML 1.0 a jej definíciatypu dokumentu (DTD) je <strong>na</strong> adrese http://<strong>www</strong>.wapforum.org/DTD/wml_1.1.xml (súborwml_1.1.xml je možné si z danej adresy stiahnu a uloži <strong>na</strong> svoj lokálny server).Keï už máme definovaný typ dokumentu, musíme ešte definova WML objekt. WMLobjekt urèuje jeden WML dokument (deck). Z toho vyplýva, že všetky ostatné objekty samusia <strong>na</strong>chádza v tomto „hlavnom“ objekte. WML objekt urèujeme takto:... ostatné objekty WAP stránky ...V každom WML dokumente sa musí <strong>na</strong>chádza aspoò jed<strong>na</strong> karta. Ak WML dokumentobsahuje viac kariet a v URL adrese nie je urèená karta, ktorá sa má zobrazi , zobrazí sakarta, ktorá je definovaná vo WML objekte ako prvá.120 PC REVUE 12/2000