10.07.2015 Views

2× DVD - Vitajte na stránkach www.einsty.hostujem.sk

2× DVD - Vitajte na stránkach www.einsty.hostujem.sk

2× DVD - Vitajte na stránkach www.einsty.hostujem.sk

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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

P R O G R A M U J E M EDelphi v praxi / 10. èas: Práca so súbormi I.Táto èas sa bude nies v z<strong>na</strong>mení práce so súbormi. Prog−ramovanie by nemalo výz<strong>na</strong>m, keby sa pri òom nevyuívalipamäové prostriedky poèítaèa. Program môe pracova vdvoch základných „reimoch“. Pri prvom vyuíva len pamäRAM, ktorá údaje uchová doèasne, teda dovtedy, kým je podmenovitým <strong>na</strong>pätím, respektíve dovtedy, kým sa vyuívajúdáta òou <strong>na</strong>èítané. To je vyuite¾né jedine za chodu PC.Niekedy v nedávnej minulosti, vtedy, keï ešte nebol svetuukázaný prvý „moderný“ Perso<strong>na</strong>l Computer, sa vyuívalipráve takéto poèítaèe, ktorých pamä nebola schopná ucho−va dátovú stopu. To z<strong>na</strong>mená asi to¾ko, e pred kadýmpouitím programu rôzneho druhu bolo potrebné ho„<strong>na</strong>hra“ do pamäte, a potom sa s ním dalo nieèo robi.Princíp sa od tých èias ve¾mi nezmenil. Poèítaèe dneškavyuívajú pamäové prostriedky vo forme RAM a pevnédi<strong>sk</strong>y, ktoré by sa dali <strong>na</strong>zva ved¾ajšou pamäou (ROM). Mysa <strong>na</strong>uèíme pouíva pevný di<strong>sk</strong> v súvislosti s <strong>na</strong>šimi apliká−ciami, programami, ktoré u spomí<strong>na</strong>nú operaènú pamäaktívne vyuívajú. Áno, hovorím o èítaní, zápise, kopírovanía ostatných monostiach práce so súbormi.SÚBORY. Pojem súbor je moné principiálne pochopiako súhrn informácií uloených <strong>na</strong> urèitom fyzickom mieste– buï internej pamäte, teda pevného di<strong>sk</strong>u magnetickoudátovou stopou vo forme bitov, alebo <strong>na</strong> inom dátovommédiu, <strong>na</strong>príklad CD, di<strong>sk</strong>ete a podobne. Pre nás nie je pod−statný fyzický princíp, ale finálne monosti, ktoré konkrétnyoperaèný systém ponúka pri práci so súbormi. Preto si nieèopovieme o súboroch v spojení s programovaním v Delphi.Štruktúra programov pracujúcich výluène s di<strong>sk</strong>om by malaspåòa nieko¾ko základných pravidiel. Prvým z nich je jedno−duchos zápisu, ktorá pozostáva z menej èastého otváraniaa zatvárania súboru a pouívania takzvaného fázového zá−pisu informácií. Program sa tým stáva rýchlejším a pru−nejším vo viacerých smeroch. Program by nemal obsahovanekoneèné cykly zápisu ani periodicky sa opakujúce proce−dúry, <strong>na</strong>príklad tvorené komponentom Ttime. Informáciezapisujeme výluène v tom danom okamihu, keï je to nevy−hnutné <strong>na</strong> ïalší bezchybný chod aplikácie. „Z rýchlika“ smeuviedli základné „súborové“ pravidlá. A teraz sa pusme dopráce s nimi. Na zaèiatok treba ukáza vytvorenie, respektíveotvorenie u existujúceho súboru. Ukáeme si rutiny, ktoré súvo všeobecnosti platné nielen pri pouití danej verzie Delphi,ale po malej zmene dokonca aj v „dosov<strong>sk</strong>om“ Pascale.var f : file;.............AssignFile(f, Nazov_suboru );Príkazom AssignFile sme si zadefinovali súbor, ktorýchceme buï vytvori, alebo doò zapísa. O tom, akú uda−los sa chystáme vyko<strong>na</strong>, rozhodujú dva základné príka−zy. Prvý príkaz reset (f, 1); nám hovorí, e súbor premen−nej f je otvorený a pripravený <strong>na</strong> prácu s ním. V prípade,ak súbor f neexistuje, je pri pouití takéhoto zápisu zob−razené chybové hlásenie File not Found. Zamedzi takétohlásenie je moné viacerými spôsobmi. Prvý spôsob spoèí−va v zistení, èi takýto súbor alebo adresár existuje.FileExists(FileName) : Boolean;Ak si prajeme neexistujúci súbor vytvori, vyuijeme prí−kaz rewrite(f, 1), ktorý súbor f vytvorí alebo v prípade jehoexistencie ho prepíše, teda zmae jeho pôvodný obsah.Potom je u súbor pripravený <strong>na</strong> zápis. Zápis do súborumôeme rozdeli do troch <strong>sk</strong>upín: zápis premenných byte zápis premenných char zápis premenných stringZápis do súboru vo forme byte alebo po¾a byte (array[1..X] of byte) sa <strong>na</strong>jèastejšie vyuíva pri zápise neštandard−ných z<strong>na</strong>kov reprezentovaných èíslami 1 a 255. Ukáeme sizápis po¾a byte, kde predpokladáme, e v premennej wr jezapísaný „neznámy“ reazec. Premenná Nazov_suboru jenosite¾om reazca string, v <strong>na</strong>šom prípade nosite¾om cesty kexistujúcemu súboru, urèenému <strong>na</strong> zápis.var f : file;wr : array [1..100] of byte;x : integer;Nazov_suboru : string;BeginAssignFile(f, Nazov_suboru);if FileExists(Nazov_suboru) then beginreset(f, 1);seek(f, 1);BlockWrite(f, wr, SizeOf(wr), x);CloseFile(f);if SizeOf(wr) = x then exit else showmessage(Write Error );end else showmessage(Nazov_suboru + neexistuje);end;Takto sme si prakticky ukázali zápis obsahu premennej wrdo súboru Nazov_suboru. Po pripravení súboru <strong>na</strong> zápis sme<strong>na</strong>stavili pozíciu v súbore príkazom seek(f, 1); kde èíslo 1 jepozícia urèená <strong>na</strong> zaèiatok zápisu. Procedúra BlockWrite rea−lizujúca zápis vyuíva kninicu system. Prvý parameter, v<strong>na</strong>šom prípade premenná f, definuje, do akého súboru bude−me zapisova. Ïalší údaj, v <strong>na</strong>šom prípade premenná wr,urèuje reazec byte, ktorý chceme zapísa. Predposledný údajprocedúry BlockWrite je hodnota (èíslo) udávajúca poèet baj−tov, ktoré sú urèené z premennej wr <strong>na</strong> zápis. Pouitím funk−cie SizeOf zí<strong>sk</strong>avame celú dåku premennej wr. Posledný údajje viac−menej kontrolný. Hovorím o spätnej èasti procedúry,ktorá vracia po zápise <strong>sk</strong>utoèný poèet zapísaných bajtov. Taksi jednoducho môeme <strong>sk</strong>ontrolova, èi náš zápis bol realizo−vaný správne a aplikovaný v plnej, teda elanej ve¾kosti. Prelepšie pochopenie je v uvedenom zápise podmienka, ktorásleduje ve¾kos po¾a byte a ve¾kos <strong>sk</strong>utoène zapísaných baj−tov. Ak tento poèet nesedí, je vygenerované chybové hláse−nie. Uloenie premenných char alebo polí char (array [1..X] ofchar) je realizované rov<strong>na</strong>kým spôsobom ako v prípade byte,teda nemení sa ani jed<strong>na</strong> z èastí predchádzajúceho zápisuokrem premennej wr. Typ char je vlastne rozšírenoumonosou byte. To z<strong>na</strong>mená, e tak ako do premennej bytesa dala zapísa hodnota ohranièená intervalom (1,255), taksa dá táto hodnota zapísa aj do po¾a char, buï pomocouz<strong>na</strong>ku z klávesnice, alebo pomocou #byte. Napríklad v char#55 je rovná z<strong>na</strong>ku ‘7’ a to sa rovná hodnote 55 v premen−nej byte. Na zápis reazca string môe by takisto pouitá táistá ruti<strong>na</strong>, ktorá sa dá <strong>na</strong>hradi o nieèo jednoduchším spô−sobom.........reset(f);WriteLn(f, wr);........Predpokladajme, e wr je premennou typu string a fpredstavuje súbor pre zápis. Vtedy je moné realizova zápispomocou viacúèelového príkazu WriteLn. Samozrejme, boloby nelogické a hlavne neúsporné poui takýto zápis.Napríklad <strong>na</strong> uchovanie stavových velièín programu do inisúborov nám doko<strong>na</strong>le slúi u dávnejšie opisovaný kompo−nent IniFiles. Aj keï zápisy jednotlivých premenných (byte,char, string) sa z h¾adi<strong>sk</strong>a syntaxe od seba máloèím líšia, súvšetky typy prakticky vyuite¾né v jednotlivých prípadoch, ato pod¾a toho, aký reazec z<strong>na</strong>kov potrebujeme do súboruuloi. V koneènom dôsledku hovoríme o jednom a tomistom zápise. Èítanie existujúcich súborov nie je o nièzloitejšie a kadý z vás si u urèite logicky vydedukoval jed−noducho pomenované príkazy, a to BlockRead a príkazReadLn. BlockRead je sèasti inverzným príkazom, ktorý dis−ponuje rov<strong>na</strong>kými monosami opaèného charakteru ako uspomí<strong>na</strong>ný BlockWrite. A preto len struène.BlockRead(f, re, dlzka, x);f – súbor, z ktorého bude neznámy reazec èítaný; re –premenná, do ktorej bude preèítaná informácia o dåke dlzkauloená; x – je opä spätnou kontrolou, teda poèet preèíta−ných z<strong>na</strong>kov (bajtov). Mazanie súborov je proces, kde sanepotrebný súbor, teda jeho obsah odstráni z fyzickéhomiesta pevného di<strong>sk</strong>u. Z programátor<strong>sk</strong>ého h¾adi<strong>sk</strong>a ide opostup realizovate¾ný dvoma základnými spôsobmi. Prvým znich je otvorenie súboru premennou f a následným pouitímpríkazu erase(f);. Tento príkaz vyuíva základnú systémovúkninicu a do Delphi sa dostal spolu s viacerými upravenýmipríkazmi zo známeho Pascalu. Súbor pred zmazaním musímedefinova do premennej f , a to u spomenutým príkazomAssignFile. Preto sa v Delphi vytvorila pomerne vyuívanákninica sysutils (systémové prostriedky). Tá obsahuje aj opi−sovanú funkciu DeleteFile.if DeleteFile(Nazov_suboru) thenshowmessage( sœbor +Nazov_suboru+ vymazan )elseshowmessage( Sœbor +Nazov_suboru+ nebol odstrÆnen);Ako z uvedeného príkladu vyplýva, funkcia disponujemonosou výstupnej kontroly pomocou stavu boolean ovyko<strong>na</strong>ní operácie, v <strong>na</strong>šom prípade informácia o vymazanízadaného súboru v premennej Nazov_suboru. Základnéoperácie so súborom je moné aplikova aj ako „<strong>sk</strong>åbeninu“dvoch, prípadne viacerých u známych funkcií a vytvára takiné, nové funkcie. Konkrétne <strong>na</strong>ráam <strong>na</strong> vytvorenie rutiny,ktorej úlohou by bolo <strong>sk</strong>opírova existujúci súbor z rôznehodi<strong>sk</strong>ového zariadenia <strong>na</strong> iné fyzické miesto, <strong>na</strong>príklad miestopevného di<strong>sk</strong>u. Kopírovanie súboru je síce moné realizovaaj spôsobom preèíta – zapísa, teda pomocou príkazovBlockRead a BlockWrite s prípadnou kontrolou správnostizápisu, ale preèo si komplikova ivot, keï podobnou, eštejednoduchšou funkciou je príkaz CopyFile.CopyFile(Nazov_suboru, Novy_subor, True);Kopírovanie by sme mali za sebou. Je len plusom preprogram pracujúci so súbormi, keï dokáe súbor preme−nova. V Delphi je <strong>na</strong> to jednoduchá funkcia Re<strong>na</strong>meFile,ktorej èinnos má <strong>na</strong> svedomí u spomí<strong>na</strong>ná kninica sys−utils. Tá <strong>na</strong> základe poiadaviek premenuje súbor, tak akozadefinujeme vstupné parametre funkcie. Opä sa stretá−vame so spätnou kontrolou typu boolean, ktorá, ako sazdá, je štandardom pri funkciách podobného charakteru.Re<strong>na</strong>meFile(Nazov_suboru, Nove_meno);K súborom bezpochyby patrí aj existencia adresárov,deliacich jednotlivé <strong>sk</strong>upiny súborov, prípadne programovalebo iných dokumentov uloených <strong>na</strong> pevnom di<strong>sk</strong>u.Adresáre je moné vytvára, presúva, ako aj maza. Terazsi ukáeme iba vytváranie adresárov. Vytváranie adresárovje takisto z dielne kninice sysutils „vymyslená“ šikovnáfunkcia. Má len jednu nevýhodu. Funkcia je schopná vy−tvori len jeden adresár, èím sa nedá jedným pouitím vjednom riadku vytvori stromová štruktúra adresárov.CreateDir( C:\DELPHI\ );Tento nedostatok nie je doriešený ani pri pouití príka−zu mkdir. Ja som tento problém riešil vlastnou funkciou,ktorá mi takpovediac u¾ahèila ivot. Pomenoval som juMkNDir, èo z<strong>na</strong>mená (Make Next Directory) (listing nájde−te <strong>na</strong> <strong>na</strong>šej webovej stránke <strong>www</strong>.pcrevue.<strong>sk</strong>).Bohuia¾, aj táto ruti<strong>na</strong> má jedno obmedzenie týkajúcesa dåky reazca string, take neodporúèam pouíva dlhénázvy adresárov a podarí sa vám ich vytvori <strong>na</strong>ozaj dos.Problém som riešil neodborne a u vôbec nie s pouitímzázraèných assemblerov<strong>sk</strong>ých rutín, ale úplne laicky, s po−uitím toho, èo máme v štandardnej výbave Delphi. Pod−stata je vo vyh¾adávaní z<strong>na</strong>ku ‘\’. Ak ho nájde a nepatrí kdi<strong>sk</strong>ovému smeru, vtedy vytvorí adresár. Keïe je všetkozapísané v cykle, dosahujeme samostatne sa vytvárajúceadresáre.NABUDÚCE. Táto téma sa nedá ani povrchne opísav jednej èasti, a preto sa òou <strong>na</strong>ïalej budeme zaobera.Prejdeme toti k zaujímavejším funkciám a procedúram,ktoré vás urèite vo vašej programátor<strong>sk</strong>ej praxi potešia.Teším sa <strong>na</strong> ïalšie stretnutie, o mesiac dovidenia.Jozef Kozák ml.1/2002 PC REVUE 103

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

Saved successfully!

Ooh no, something went wrong!