A Pascal nyelv rejtelmei (7.)
Üdv mindenkinek, újra együtt vagyunk, és én ennek nagyon örülök. Remélem Ti is. Amint múltkor jeleztem, ma a szabványos modulok részletezésébe kezdünk. Most valószínûleg csak a CRT unitot tárgyaljuk meg, de amennyire csak tudom a lehetõ legrészletesebben. Kezdjünk is hozzá.
Mint a múltkor leírtam a CRT unit a képernyõ szöveges üzemmódját hivatott támogatni, segítségével tudjuk programjainkat olyanra formálni, hogy az valahogy ki is nézzen, de mégsem kelljen a grafika tudományaiba nagyon belemélyedni (Ej ráérünk arra még!). Szóval kurzort pozícionálhatunk, színeket állíthatunk be, sõt, még hangot is generálhatunk.
- Mi is az a szöveges üzemmód?
- A számítógép a képernyõt alapértelmezés szerint szöveges módban használja. Ez azt jelenti, hogy a matekfüzethez hasonlóan a képernyõt is ilyen négyzethálóhoz lehet hasonlítani, sorokból és oszlopokból áll. Az alapértelmezés a 80x25, ami annyit takar, hogy 80 oszlop, 25 sor, 80 karaktert írhatunk egy sorba, amibõl összesen 25 fér el egy képernyõre. Egy gyors számolás fut végig mindenki agyában (Ha mégsem, akkor valami baj van. Fordulj orvoshoz!), ami szerint egy képernyõre összesen 2000 karakter fér (ez csak amolyan megjegyzés). Szóval 80 karakter fér el egy sorban, ha véletlenül mégiscsak többet akarnánk kiírni, a 80 felettiek átkerülnek a következõ sorba. Ez nem olyan nagy gond, mert megmarad, viszont ha 25 sornál akarunk többet kiíratni, akkor vigyáznunk kell, mert a képernyõ tetején kiszaladnak a képernyõbõl a felsõ sorok, és a tartalmuk elvész.
Amint említettem a 80x25 az alapértelmezés, vagyis ez a leggyakoribb, a legelterjedtebb. Mivel régebben nem voltak VGA monitorok - meg most sincs mindenhol -, más "felbontást" használtak a különbözõ típusokon. A CRT unit lehetõséget nyújt ezen "felbontások" használatára is. Ezeket majd késõbb ismertetem.
Most már tudjátok - ha eddig nem tudtátok -, hogy mi az a szöveges üzemmód. Végre nekiláthatunk a CRT unit tárgyalásának. Mint minden rendes Pascal program, a modulok is tartalmaznak változókat, konstansokat, eljárásokat és függvényeket. Így van ez a mi esetünkben is, tehát végig vesszük a CRT unit felépítését a változóktól a függvényekig.
Elõször is emlékeztetlek benneteket, hogy hogyan is hivatkozhatunk a CRT unitunkra:
uses Crt;
Aki elfelejtette, azzal nem tudom mit csinálok, eszerint hiába veszõdtem órákat az elõzõ cikkemmel. Na mindegy.
Menjünk sorjában:
- Szöveges mód változói:
Ezek a változók alapértelmezés szerint rendelkeznek egy értékkel. Ha mi ettõl az értéktõl eltérõt szeretnénk használni, akkor ezt nyugodtan megtehetjük úgy, hogy a változónak megadjuk az általunk használni kí1vánt értéket. Ezek a változók a következõk:
var CheckBreak,
CheckEof,
DirectVideo,
CheckSnow : Boolean;
LastMode,
WindMin,
WindMax : Word;
TextAttr : Byte;
A CheckBreak szabályozza a program Ctrl-Breakkel történõ megszakítását. Ha a változó értéke true, a program megszakítható, false esetén nem. Az alapértelmezés true.
A CheckEof engedélyezi vagy nem engedélyezi a Ctrl-Z hatására az end-of-file jel írását. Ha a változó értéke true, akkor a képernyõhöz rendelt fájlból való olvasáskor a Ctr-Z leütésére fájl vége esemény generálódik, ha értéke false, akkor nem. Az alapértelmezés false.
A CheckSnow változó az ún. havazás jelenséget szabályozza a CGA monitoroknál. Ez a havazás nem jelentkezik a monokróm, az EGA és a VGA monitorok esetében. Alapértelmezés szerint truera van állítva. Ha nem CGA monitoron futtatunk a TextMode (errõl majd késõbb) állítása után érdemes a változót falsera állítani, mert jelentõsen gyorsabb outputot eredményez. A havazás nem hatásos, ha a DirectVideo értéke false.
A DirectVideo változó true értéke biztosítja a Write és WriteLn eljárásoknak a képernyõhöz való közvetlen hozzáférést oly módon, hogy az output közvetlenül a képernyõ-memóriába történik. A képernyõkezelés így gyorsabb, mint a BIOS-on keresztül. A változó alapértelmezés szerint truera van állítva. Falsera állítjuk akkor, ha a BIOS-on keresztül akarjuk a karakterek megjelenítését. Az értékadás csak a TextMode hívása után lehetséges.
A LastMode változó tartalmazza az utoljára kiválasztott szöveges módot. A rendszer a program indulásakor az aktív videomód kódját tölti be a változóba.
A TextAttr tárolja az aktuálisan kiválasztott szövegszínt, amelyet a TextColor és a TextBackGround segítségével állítottunk be. Ezt a változót közvetlenül is beállíthatjuk némi kis számolgatás után. A bájt tartalma a következõ:
128 |
4 |
2 |
1 |
8 |
4 |
2 |
1 |
villogás |
háttérszín 0 - 7 |
aktuális szín 0 - 15 |
A WindMin és a WindMax változók az aktuális ablak képernyõ-koordinátáit tárolják. Az értéküket akkor veszik fel, amikor a Window (errõl is késõbb) eljárást meghívjuk. A WindMin az ablak bal felsõ, a WindMax az ablak jobb alsó koordinátáit tartalmazza. Az X-koordináta az alsó bájtban, az Y-koordináta a felsõ bájtban kerül tárolásra.
- Szöveges mód konstansai
A TextMode eljárás paramétere az alábbi konstansokat fogadja:
const
BW40 = 0; { 40x25 fekete-fehér }
CO40 = 1; { 40x25 színes }
BW80 = 2; { 80x25 fekete-fehér }
CO80 = 3; { 80x25 színes }
Mono = 7; { 80x25 monokróm MDA vagy Hercules monitoron }
Font8x8 = 256; { 40x43, 40x50 sor EGA és VGA monitorokon }
A TextMode aktiválásával állíthatunk fekete-fehér, illetve színes üzemmódot a megfelelõ ablakmérettel. Például:
TextMode(0); fekete-fehér, 40x25
TextMode(BW80); fekete-fehér, 80x25
TextMode(3); színes, 80x25
A szöveg színét a TextColor, a háttér színét a TextBackGround eljárással állíthatjuk be. A színkonstansok:
const
Black = 0; { fekete }
Blue = 1; { kék }
Green = 2; { zöld }
Cyan = 3; { türkiz }
Red = 4; { piros }
Magenta = 5; { lila }
Brown = 6; { barna }
LightGray = 7; { világosszürke }
DarkGray = 8; { sötétszürke }
LightBlue = 9; { világoskék }
LightGreen = 10; { világoszöld }
LightCyan = 11; { világos türkiz }
LightRed = 12; { világospiros }
LightMagenta = 13; { világoslila }
Yellow = 14; { sárga }
White = 15; { fehér }
Blink = 128; { villog }
A színekbõl a szöveg írására mindegyiket (0-15), a háttérre azonban csak az elsõ nyolcat (0-7) használhatjuk. Például legyen a háttér színe kék, a szöveg színe világos türkiz (használhatunk egyaránt szín- vagy számkonstansot):
TextBackGround(1); vagy TextBackGround(Blue);
TextColor(11); vagy TextColor(LightCyan);
- Szöveges mód eljárásai és függvényei
Ezeket az eljárásokat és függvényeket öt csoportba oszthatjuk:
- szöveg kiírása és kezelése,
- ablak és mód vezérlése,
- tulajdonság beállítása,
- állapotlekérdezés,
- hangkeltés.
Most nézzük ezeket a csoportokat részletesebben:
- Szöveg kiírása és kezelése
- írás és olvasás:
AssignCrt(var f: Text);
A képernyõhöz egy szövegfájlt rendel, amelyet a fájlkezelésnél ismertetett módon használhatunk.
Write;
Aki nem tudja mire jó, az magára vessen. Nézze meg az elsõ számban.
Read;
Szintén!
ReadKey;
Egy karakter leütésére váró függvény.
Ch:=ReadKey;
KeyPressed;
Egy logikai függvény, mely igaz értékkel tér vissza, ha billentyûzeten megnyomtunk egy billentyût, egyébként értéke hamis. Nagyon jól használható olyan eseteknél, amikor egy billentyû lenyomására meg kell szakítanunk a programot.
repeat
until KeyPressed;
- szöveg és kurzor mozgatása a képernyõn:
ClrScr;
Törli az aktuális ablakot (képernyõt), és a kurzort a bal felsõ sarokba (1,1) helyezi. Az ablak háttere az elõzõekben definiált háttérszínt veszi fel.
ClrEol;
A sor kurzortól jobbra esõ részét törli, és az elõre definiált háttérszínt veszi fel.
DelLine;
Törli a kurzort tartalmazó sort, és az alatta lévõ sorok eggyel feljebb csúsznak. A képernyõ utolsó sora üres lesz.
GotoXY(x, y: Byte);
A kurzort az x, y koordinátákra pozícionálja. Az aktuális ablak x-edik oszlopába és y-odik sorába helyezi a kurzort. Ezek relatív koordináták, vagyis az aktuális ablak bal felsõ sarkától számítandók. Érvénytelen koordináták esetén nem kerül végrehajtásra.
InsLine;
Beszúr egy üres sort a kurzort tartalmazó sor alá. Az utolsó sor kicsúszik a képernyõbõl.
- Ablak és mód vezérlése
TextMode(Mode: Word);
A kívánt szöveges üzemmódot választhatjuk ki. A konstansokat lásd fent.
Window(x1, y1, x2, y2: Byte);
A szöveges képernyõn egy ablakot definiál. Az x1, y1 az ablak bal felsõ sarokpontjának, az x2, y2 az ablak jobb alsó sarokpontjának koordinátái.
- Tulajdonságok beállítása
TextColor(Color: Byte);
TextBackGround(Color: Byte);
Az elõtér és a háttér színeinek beállítása. A konstansokat lásd fent.
HighVideo;
Magas intenzitás beállítása.
LowVideo;
Alacsony intenzitás beállítása.
NormVideo;
Eredeti, normál intenzitás beállítása.
- Állapotlekérdezés
WhereX;
A függvény a kurzor x koordinátaértékével tér vissza, melynek értéke bájt típusú.
WhereY;
A függvény a kurzor y koordinátaértékével tér vissza, melynek értéke bájt típusú.
- Hangkeltés
Sound(Hz: Word);
Adott Hertz frekvenciájú hangot generál a belsõ hangszórón (Internal PC Speaker).
Delay(ms: Word);
Adott számú ezredmásodpercig felfüggeszti a program futását. Ezzel tudjuk szabályozni, a programot, hogy mennyi ideig tartsa a megadott hangot.
NoSound;
Kikapcsolja a belsõ hangszórót.
Körülbelül ennyi lenne. Jó programozgatást kívánok!
A cikk Winword DOC formátumban
Domján Tamás
eMail:PC-XUser@IDG.HU, Subject: "Pascal rovat"
DomTom@LUDENS.ELTE.HU
Vissza a PC-X User 10 fôoldalához