Vítejte v závěrečné lekci Pascalu pro pokročilé.
Jednotka Dos umožňuje spolupráci s operačním systémem (zjišťování času,
data, mazání souborů a adresářů, práci s přerušeními,...)
Název | Význam | Hodnota |
---|---|---|
ReadOnly | soubor pouze pro čtení | $01 |
Hidden | skrytý soubor | $02 |
SysFile | systémový soubor | $04 |
Directory | adresář | $10 |
Archive | jakýkoliv soubor | $20 |
Tyto konstanty lze sčítat (ReadOnly + Hidden = pouze pro čtení a skrytý).
Je možné i numerické vyčíslení, ale my budeme kvůli přehlednosti používat konstanty.
(Rozlišit, zda $07 znamená skrytý systémový soubor pouze pro čtení či něco jiného, je obtížné.)
Nyní se podívejme na procedury a funkce:
GetDate(var Rok,Mesic,Den,DenTydne:word); - procedura zjistí datum (DenTydne
- 1=pondělí, ... 6=sobota, 0=neděle)
GetTime(var Hod,Min,Sec,Sec100:word); - zjistí čas (Sec100 jsou
milisekundy)
SetDate(Rok,Mesic,Den:word); - nastaví datum
SetTime(Hod,Min,Sec,Sec100:word); - nastaví čas
DiskFree(x) : longint; počet volných bytů na disku (X : 0-aktuální
disk, 1-A: , 2-B:, 3-C: ...) v případě, že disk nebyl nalezen, vrací -1
DiskSize(x):longint; - počet všech bytů na disku
DosVersion : word; - vrací aktuální verzi Dosu (např. 7.05) - v nižším
bytu je první číslo (7) a ve vyšším číslo druhé (05). Chceme-li tato čísla
zjistit, použijeme Lo(DosVersion) a Hi(DosVersion)
Jednotka Dos definuje vlastní typ SearchRec: type Search = record Fill:array[1..21] of byte; Attr:byte; Time:Longint; Size:Longint; Name:string[21]; end Nás u tohoto typu bude zajímat pouze hodnota Attr(Atributy), Size (Velikost souboru) a Name(název souboru)
FindFirst(Jmeno, Atributy, var Vysledek : SearchRec); procedura najde
první soubor, který vyhovuje zadaným kritériím. (Pro jména platí hvězdičková
konvence (*.exe, ?let.* ...))
FindNext(var S:SearchRec); procedura najde další soubor vyhovující
zadaným kritériím (po použití FindFirst)
FSearch(Jmeno, SeznamAdresaru):string; najde soubor požadovaného jména v
zadaných adresářích (výstupem je celé jméno souboru, včetně cesty)
GetFAttr(var f,var Atributy); Procedura vrací atributy souboru (ten musí
být uzavřen, ale přiřazen)
SetFAttr(var f; Atributy); Procedura nastaví atributy souboru
Jak zjistíme, že je u daného souboru nastaven nějaký atribut? Jednoduše
: využijeme Booleovského operátoru and.
Například takto : if (Atributy and Hidden)<>0 then ...
Pokud chceme změnit hodnotu jednoho atributu, musíme si nejdříve načíst
atributy pomocí GetFAttr a poté je změnit (tentokrát s využitím or).
Atributy:= Atributy or Hidden;
Dalším typem, který jednotka Dos zavádí, je Registers;
pro naše potřeby postačí tato definice type Registers = record
AL,AH,BL,BH,CL,CH,DL,DH:byte) end;
Typ Registers má ještě druhou definici: (AX, BX, CX, DX, BP, SI, DI,
DS, ES, Flags : word), takže si můžeme vybrat, ale nesmíme to míchat.
(nastavím-li AL, už se do DS nedostanu...)
Nyní již můžeme přistoupit k samotným procedurám.
Intr(CisloPreruseni, var Registry : Registers); provede požadované přerušení
(a popř. změní obsah proměnné Registry);
MsDos(Registry); provede službu MS-Dosu (=zavolá přerušení 21H). Lze
použít i Intr($21, Registry)
GetIntVec(CisloPreruseni, var Vektor : pointer); Každé přerušení
obsluhuje jistá procedura. Tento příkaz vrací ukazatel na ní.
SetIntVec(CisloPreruseni, Vektor : pointer); Odteď se místo přerušení CisloPreruseni bude volat naše procedura.
S tímto příkazem musíme zacházet velice opatrně.
Nikdy byste neměli měnit přerušení za těchto podmínek:
Pokud jste se rozhodli přerušení změnit, uvědomte si:
Máme-li přerušení, které bychom museli volat sami, pomocí Intr, popř. Int, je lepší udělat normální proceduru a zavolat přímo ji. Interrupt procedur se používá tam, kde je dané přerušení voláno nezávisle na vůli programátora (stisk klávesnice, takt počítačových hodin - voláno 18.2krát za sekundu, zborcení programu, chyba paměti,...)
Operační systém nám ale nedovolí sahat na všechna svá přerušení.
Krátká ukázka: program Pis; {Program způsobí, že při každém stisku klávesy se napíše písmenko 'a'} uses Dos; const A:integer = 0; var Ukazatel : pointer; {Ukazatel se vždycky hodí} procedure NewInt09;interrupt; {Naše procedůrka} begin Puvodni; {Nejprve zavolat původní obsluhu} write('a'); {Zkuste napsat něco delšího, nestíháte to} end; begin GetIntVec($09,Ukazatel); {Zjistíme si, kde je obsluha přerušení} SetIntVec($09, Addr(NewInt09)); {A teď tam bodneme naši zrádnou proceduru} for I:=1 to maxint do for J:=1 to maxint do for K:=1 to maxint do A:=Abs(a)*2; {V této smyčce máme možnost otestovat, zda to skutečně funguje... Také si můžeme ověřit, zda fungují i jiné klávesy - např. Ctrl-C, Ctrl-Break} SetIntVec($09,Ukazatel); {Na původní místo vrátíme správné přerušení.} end.
Nyní již víte o programování v Pascalu vše potřebné. Sekci pro experty nechte sebevrahům. Teď to chce jen trochu cviku. Žádný učený z nebe nespadl, skutečnými programátory se stanete, až budete mít napsáno okolo 200 vlastních programů (které jste celé sami vymysleli).
K dalšímu zdokonalování vám můžu doporučit např. www.programmersheaven.com - naleznete tam spoustu zajímavých informací. Také si na Internetu tu a tam vyhledejte pár zajímavých algoritmů (QuickSort, Agrawal,...) a zkuste je naprogramovat, programátorem se totiž stáváte až znalostí algoritmů, ne znalostí programovacích jazyků!!!