11.07.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M EZvyšné dve procedúry, z ktorých bude uvedená ruti<strong>na</strong> volaná, vyzerajú takto:procedure TForm1.FirstBtnClick(Sender: TObject);beginDummyProc(‘select orders from animals’);end;procedure TForm1.SecondBtnClick(Sender: TObject);beginDummyProc(‘select * from animals’);end;Obr. 4kódu. Treba poz<strong>na</strong>me<strong>na</strong> , že táto bodka sa objaví iba po prekompilovaní projektu. Takistoje potrebné zdôrazni , že nie <strong>na</strong> každý riadok kódu je možné umiestni bod prerušenia.Pozorne si preštudujte obrázok è. 1. Bod prerušenia je možné zaradi iba <strong>na</strong> ten riadok,ktorý je v ¾avej èasti ok<strong>na</strong> oz<strong>na</strong>èený bodkou. Urobme jeden malý pokus: zaraïme bodprerušenia <strong>na</strong> riadok zaèí<strong>na</strong>júci sa príkazom with. Pri pokuse o spustenie programu sanám objaví dialógové okno, podobné tomu <strong>na</strong> obrázku è. 2. Delphi nás upozoròuje, žepre daný riadok nebol vygenerovaný nijaký kód, resp. že tento kód bol odstránený optimalizaènýmsystémom. My však môžeme druhú možnos s istotou vylúèi , pretože optimalizáciumáme vypnutú. Jediným vysvetlením teda je, že pre daný riadok prekladaènevygeneroval nijaký kód. V <strong>na</strong>sledujúcom odseku vysvetlíme, èo je príèinou tohto javu.Iste všetci viete, že programovanie v Delphi èi iných programovacích jazykoch pozostávaz dvoch hlavných fáz: <strong>na</strong>písanie programu a preklad programu (ten sa ešte delí <strong>na</strong> fázu kompilaènúa linkovaciu, to je však momentálne nepodstatné). Program <strong>na</strong>písaný vo vyššom programovacomjazyku sa teda preloží do strojového kódu. Na základe tohto tvrdenia by sme samohli domnieva , že každý riadok pascalov<strong>sk</strong>ého kódu sa preloží do nieko¾kých strojovýchinštrukcií. Inými slovami, mohli by sme sa <strong>na</strong>zdáva , že každý riadok má svoj „strojový ekvivalent“.To však nie je pravda. Mnohé k¾úèové slová používané v Delphi (<strong>na</strong>pr. with èi implementation)slúžia iba ako oporné body pre kompilátor, do strojového kódu sa neprekladajú. Zámernepíšem „mnohé“, pretože v niektorých prípadoch sa do strojového kódu prekladajú príkazy, oktorých by si to èlovek nemyslel. Pozrite sa ešte raz <strong>na</strong> obrázok è. 1: <strong>na</strong> zaèiatku procedúry je ved¾apríkazu begin bodka. Pokroèilejší z vás iste vedia, že kompilátor <strong>na</strong> tento príkaz zareagujevytvorením tzv. štandardného rámca zásobníka (standard stack frame), èo je vo väèšine prípadovinštrukcia PUSH EBP, prípadne nieko¾ko ïalších inštrukcií PUSH. To už sú však nepodstatné detaily,dôležité je uvedomi si, že nie <strong>na</strong> každý riadok je možné zaradi bod prerušenia.Ukážkové programy, s ktorými budeme pracova , budú ve¾mi jednoduché a zámernechybne <strong>na</strong>písané, pretože keby fungovali správne, princípy ladenia by sme si <strong>na</strong> nich veruukáza nemohli. Dajme sa teda do práce.Jadrom nášho prvého programu bude procedúra, ktorá vykoná dopyt SQL, prièomsamotný SQL príkaz dostane ako parameter. Vola ju budú dve rutiny, prvá sa aktivuje postlaèení prvého tlaèidla (<strong>na</strong>zvaného FirstBtn) a druhá po stlaèení druhého tlaèidla (<strong>na</strong>zvanéhoSecondBtn). Komponent TQuery, ktorý bude ma za úlohu spracova dopyt SQL,som <strong>na</strong>zval Query. Po stlaèení prvého tlaèidla <strong>na</strong>stane chyba, po stlaèení druhého celýproces prebehne správne. Uvedené procedúry majú <strong>na</strong>sledujúci tvar:procedure TForm1.DummyProc(SQLString:string);begintrywith query dobeginClose;SQL.Clear;SQL.Add(SQLString);Open;end;//withexceptraiseend;//exceptShowMessage(‘OK’);end;Ako vidíme, táto procedúra je založená <strong>na</strong> ve¾mi jednoduchom princípe: ak sa poèas jejvykonávania vy<strong>sk</strong>ytne chyba (výnimka), program <strong>sk</strong>oèí <strong>na</strong> príkaz raise a procedúra Show-Message sa nikdy nevykoná. Samotné <strong>na</strong>èítanie SQL príkazu prebehne tak, že sa <strong>na</strong>jprvpredchádzajúci príkaz vymaže metódou Clear a nový príkaz sa pridá pomocou metódyAdd (nezabúdajte, že keby sme nepoužili metódu Clear, poèet riadkov SQL <strong>sk</strong>riptu by saneustále zvyšoval).Program spustíme a otestujeme. Jeho cie¾om je demonštrova situáciu, keï je jed<strong>na</strong> a táistá ruti<strong>na</strong> volaná z viacerých miest programu. Chybu spôsobí prvá procedúra, ktorá rutineDummyProc odovzdá príkaz odkazujúci <strong>na</strong> neexistujúce pole. Samotná ruti<strong>na</strong> DummyProcmôže by <strong>na</strong>písaná správne, no v dôsledku nesprávnych parametrov sa môžu vy<strong>sk</strong>ytnúproblémy. V takom prípade je potrebné zisti , ktorá procedúra (alebo procedúry) volaniutejto rutiny predchádzala, a teda jej mohla odovzda nesprávne parametre. Presne <strong>na</strong> tentoúèel slúži okno Call Stack: ukazuje nám zoz<strong>na</strong>m volaných rutín, prièom <strong>na</strong>j<strong>sk</strong>ôr volaná ruti<strong>na</strong>je <strong>na</strong> poslednom mieste zoz<strong>na</strong>mu a <strong>na</strong>posledy volaná ruti<strong>na</strong> je <strong>na</strong> prvom mieste zoz<strong>na</strong>mu.Zatia¾ teda vieme, že ruti<strong>na</strong> DummyProc v jednom prípade dostane dobrý a v druhom prípadezlý parameter. Keïže zlý parameter spôsobí vyvolanie výnimky, program zaène vykonávapríkaz raise. Z toho dôvodu <strong>na</strong> tento príkaz umiestnime bod prerušenia a otvoríme oknoCall Stack. Program spustíme a stlaèíme prvé tlaèidlo (teda tlaèidlo FirstBtn). Ako vidíme, výnimka<strong>na</strong>stala bezprostredne za volaním procedúry DummyProc, okno Call Stack nám všakzatia¾ neukazuje potrebné informácie, pretože sa ešte nezaèala vykonáva obslužná ruti<strong>na</strong>výnimky v procedúre DummyProc. Stlaèíme teda kláves F9 a program <strong>sk</strong>oèí <strong>na</strong> príkaz raise.Okno Call Stack bude vyzera podobne ako jeho „kolega“ <strong>na</strong> obrázku è. 3. Teraz už vieme,aké bolo poradie volania jednotlivých funkcií, a teda vieme zisti , odkia¾ ruti<strong>na</strong> DummyProcdostala nesprávny parameter.Keïže náš ukážkový program je ve¾mi jednoduchý, vieme chybu rýchlo odstránia program opätovne prekompilova . Môže však <strong>na</strong>sta situácia, keï sú vaše prsty rýchlejšieako mozog a stlaèia F9 <strong>sk</strong>ôr, ako si uvedomíte, že ste síce chybu opravili, ale inú,možno menšiu chybu ste opravi zabudli. Predstavte si, že ste SQL príkaz v prvej procedúreopravili <strong>na</strong> správny, slovko Orders ste teda <strong>na</strong>hradili hviezdièkou. Nedopatrenímste sa však „uklepli“ a medzi slová Orders a From ste zabudli da medzeru. Kým sa svojuchybu s<strong>na</strong>žíte o¾utova , program sa rozbehne. Èo teraz? Prvou možnos ou je programObr. 5ukonèi , opravi a prekompilova . V <strong>na</strong>šom prípade bude potom všetko pracovasprávne, štruktúra aplikácie je jednoduchá a nie je problém chybu v priebehu nieko¾kýchsekúnd lokalizova . V zložitejších programoch to však nemusí plati , oprava chyby môževies k odhaleniu ïalších <strong>sk</strong>rytých chýb. Aby sme neplytvali èas opakovanou kompiláciou,ukážeme si, ako zmeni obsah premennej poèas behu programu.Keï si pozorne preštudujete procedúru DummyProc, možno dospejete k záveru, že<strong>na</strong>jzrelším kandidátom <strong>na</strong> úpravu bude premenná SQLString, parameter tejto procedúry.Ale pozor, parametre by ste nemali nikdy meni , pretože to môže vies k pádu celéhoDelphi. Jedným z možných riešení by bolo zavies lokálnu premennú, ktorá by prebralahodnotu premennej SQLString, prièom ruti<strong>na</strong> by ïalej pracovala už iba z touto premennou.To však nie je potrebné, pretože my môžeme pracova priamo s vlastnos ou SQLkomponentu TQuery, ktorá je typu TStrings. Aby sme si boli istí, že po <strong>na</strong>šej „umelej“zmene sa SQL <strong>sk</strong>ript už nezmení, zaradíme bod prerušenia <strong>na</strong> príkaz Open. Ak by smetotiž umiestnili bod prerušenia <strong>na</strong>príklad <strong>na</strong> príkaz Add èi <strong>na</strong> iný príkaz, ktorý mu predchádza,nemohli by sme jednoducho zmeni niè, pretože až príkaz Add spôsobí pridaniechybného SQL príkazu, ktorý potom musíme opravi . Mohlo by sa sta aj to, že síce chybnýSQL príkaz opravíte, bod prerušenia je však zaradený práve <strong>na</strong> ten príkaz, ktorý vlastnos SQLkomponentu TQuery nejakým spôsobom modifikuje, v dôsledku èoho bude SQL príkaz opäzlý. Ak však bude bod prerušenia „sídli “ <strong>na</strong> príkaze Open, máte úplnú istotu, že sa vlastnosSQL už nezmení, a teda vami urobené zmeny èi opravy nebudú ignorované.Zmeni hodnoty premenných poèas behu programu je možné prostredníctvom príkazuEvaluate/Modify, ktorý vyvoláme z kontextového menu. Do rozba¾ovacieho zoz<strong>na</strong>mu<strong>na</strong>píšeme výraz query.SQL[0] a stlaèíme tlaèidlo Evaluate. Na obrázku è. 4 vidíme, že vlast-118 PC REVUE 12/2000

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!