13. A CRT UNIT használata 13.1. A szöveges üzemmód Az számítógép a képernyőt alapértelmezés szerint szöveges módban használja. A képernyőablak (Window) négyzethálóhoz hasonlóan sorokból és oszlopokból áll. Alapértelmezés szerinti ablak 25 sort és egy sorban 80 oszlopot tartalmaz. Ez azt jelenti, hogy 80 karaktert írhatunk egy sorba, a 80 feletti karakterek átkerülnek a következő sorba. Ha viszont 25 sornál többet írunk, akkor a 25. sor után amennyi sor megjelenik a képernyő alján, annyi sor tünik el a képernyő tetejéről. A képernyőből kilépő sorokat nem lehet később megtekinteni, mondhatjuk úgy is, hogy az információ kiszaladt a képernyőből (görgetés - scroll). A program írójának kell gondoskodnia arról, hogy a program eredménye a képernyőn kiértékelhető legyen. Ahhoz, hogy az eredmény színesen, és irányítottan adott oszlopba és sorba kerüljön, használnunk kell a Crt unit eljárásait és függvényeit. A Crt unit Window eljárása a szöveges képernyőn aktív ablakot definiál. Az eljárás szintaxisa: Window(x1,y1,x2,y2); ahol az x1,y1,x2,y2 byte típusú paraméterek. {EMBED MSDraw \* mergeformat|} 13.1. ábra Window(1,1,80,25) Az x1,y1 az ablak bal felső sarkának, az x2,y2 pedig a jobb alsó sarkának a koordinátái. Ha az alapértelmezést használjuk, akkor nem kell az eljárást hívnunk, mert Window(1,1,80,25) a teljes képernyőablakot jelenti. Az 13.1. ábrán látható, hogy a képernyő x irányú koordinátái az oszlopokat, az y irányú koordinátái a sorokat jelentik. Az alapértelmezés szerinti ablakméret 80x25 mellett használható a 40x25, illetve EGA monitor esetén 80/40x43, VGA monitor esetén 80/40x50 is. Például: Window(1,1,80,25); Window(1,1,40,25); Window(1,1,80,43); Window(1,1,40,43); VGA monitornál: Window(1,1,80,50); Window(1,1,40,50); is lehet. Ablakban ablakot is létrehozhatunk. A Window eljárás koordinátáit abszolút koordinátákkal kell megadni a fő ablak (1,1) koordinátájához képest. Példaként hozzunk létre 10 oszlopot és 8 sort tartalmazó ablakot a fő ablak (15,10) koordinátapontjában. Az ablak bal felső koordinátái a beültetési koordináták, a jobb alsó kordinátái pedig a beültetési koordinátákhoz hozzáadva az ablak szélességét és magasságát, az eljárás hívása a következő: Window(15,10,25,18); Az 13.2. ábra mutatja a (15,10) pontban létrejött 10,8 méretű ablakot. Az aktív ablak bal felső sarokpontja (1,1). {EMBED MSDraw \* mergeformat|} 13.2. ábra Window(15,10,25,18) A szöveges módban a Crt unit függvényeivel és eljárásaival állíthatjuk a háttér és a karakterek színét. Az adott pozícióra írhatunk. Megszólaltathatjuk a belső hangszórót, adott időre felfüggeszthetjük a program futását. A képernyőn bárhol definiálhatunk ablakot, sort írhatunk, törölhetünk és szúrhatunk be. Lekérdezhetjük a kurzor pozícióját. A programon belül a grafikus módot szöveges móddal oda/vissza lehet váltani ( lásd a 14. fejezetet). A Crt unit-ot akkor érjük el, ha a programban a uses kulcsszó mellett definiáljuk: program crt_probak; { crt könyvtár hivatkozása } uses crt; Először tekintsük át a szöveges módva vonatkozó információkat, a használ-ható eljárások és függvények rövid leírását. Az F2 függelékben találjuk meg a teljes leírást. A 13.3. részfejezetben ismertetett mintaprogramok mutatják be a Crt unit alkalmazását. 13.2. Szöveges mód változói, konstansai, függvényei és eljárásai Ebben a részfejezetben összefoglaljuk a szöveges módban használt változókat, konstansokat, függvényeket és eljárásokat. 13.2.1. Szöveges mód változói Az szöveges mód változói alapértelmezés szerint kapnak értéket, ha ettől eltérőt szeretnénk beállítani, akkor erre van lehetőség. Az alábbiakban ismertetjük a változókat, megadva a típusúkat majd a funkciójukat is. A Crt unit változói: var CheckBreak : Boolean; CheckEOF : Boolean; DirectVideo : Boolean; CheckSnow : Boolean; LastMode : Word; TextAttr : Byte; WindMin : Word; WindMax : Word; A CheckBreak logikai változó szabályozza a program CTRL Break-kel való megszakítását. Ha a változó értéke true, a program megszakítható, false esetén nem. Az alapértelmezés a true. A CheckEOF logikai változó engedélyezi vagy nem engedélyezi CTRL-z hatására az end-of-file (file-vége) jel írását. Ha a CheckEOF logikai változó true, akkor a képernyőhöz rendelt file-ból való olvasáskor CTRL-z leütésére file vége esemény generálódik, ha a változó é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 vagy EGA, VGA monitorok esetében. Alapértelmezés szerint true-ra van állítva. Ha nem CGA monitoron futtatunk a TextMode állítása után érdemes a CheckSnow változót false-ra á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ését oly módon, hogy az output közvetlenül a képernyőmemóriában történik. A képernyőkezelés így gyorsabb, mint a BIOS-on keresztül. A DirectVideo változó alapértelmezés szerint true-ra van állítva. False-ra állítjuk akkor, ha a BIOS-on keresztül akarjuk a karakterek megjelenítését, az értékadást csak a TextMode hívása után lehet végrehajtani. A LastMode változó tartalmazza az utoljára kiválasztott szöveges módot. A rendszer program indulásakor az aktív videomódot kódját tölti be a LastMode változóba. A TextAttr tárolja az aktuálisan kiválasztott szövegszínt, amelyet a TextColor és a TextBackground állított. Ezt a változót közvetlenül is beállíthatjuk. A byte tartalma a következő {EMBED MSDraw \* mergeformat|} A WindMin és WinMax 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 eljárást hívtuk. A WinMin változó tartalmazza az ablak bal felső, a WinMax tartalmazza a jobb alsó sarok koordinátáit. Az X-koordináta az alsó byte-ban, az Y-koordináta a felső byte-ban kerül tárolásra. 13.2.2. 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 monkró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 ill, színes módot a megfelelő ablakmérettel. Néhány példa a hívásra: TextMode(0); fekete-fehér, 40x25 TextMode(BW80); fekete-fehér, 80x25 TextMode(CO40); színes, 40x25 A szöveg színét a TextColor, a háttér színét a TextBackGround eljárás állítja. 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-14) használhatjuk. A háttérre azonban csak 0-tól 7-ig használhatunk színeket. Legyen a háttér színe türkíz, a szöveg színe kék. A eljárások számkonstanssal vagy színkonstanssal is hívhatók: TextBackGround(3); vagy TextBackGround(Cyan); TextColor(1); vagy TextColor(Blue); 13.2.3. Szöveges mód eljárásai és függvényei A szöveges mód függvényeit és eljárásait öt csoportba sorolhatjuk: - 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. SZÖVEG KIŚRÁSA ÉS KEZELÉSE Szöveg írás és olvasása AssignCrt szöveg file-t rendel a CRT eszközhöz (képernyőhöz), Write írás a képernyőre, Read olvasás billentyűzetről, ReadKey egy karakter beolvasására vár. KeyPressed jelzi, ha van lenyomott billentyű. Szöveg és kurzor mozgatása a képernyőn ClrScr törli a szöveges képernyő ablakot, ClrEol törli a sort a kurzor pozíciójától, DelLine törli a kurzort tartalmazó sort, GotoXY pozícionálja a kurzort, InsLine beszúr egy üres sort azon sor alá, ahol a kurzor áll, ABLAK ÉS MÓD VEZÉRLÉSE TextMode beállítja a képernyőt a kívánt szöveges módba, Window definiál egy képernyőablakot. TULAJDONSÁGOK BEÁLLŚTÁSA A szöveges módban a tulajdonságok beállítását az alábbi eljárások végzik: Az előtér (írás) és a háttér színének beállítása TextColor beállítja az előtér színét, ez lesz a karakter színe, TextBackground beállítja a háttér színét. Intenzitás beállítása HighVideo magas fényű intenzitás beállítása, LowVideo alacsony fényű intenzitás beállítása, NormVideo az eredeti, normál intenzitás beállítása. ÁLLAPOTLEKÉRDEZÉS WhereX megadja a kurzor helyzetének x koordinátáját, WhereY megadja a kurzor helyzetének y koordinátáját. HANGKELTÉS Sound adott Hertz frekvenciájú hangot generál a belső hangszórón, NoSound kikapcsolja a hangszórót. 13.3. A szöveges mód programozása 13.3.1. Mintaprogramok a Crt unit használatára A CRT1.PAS program ablakot definiál, amelyben a szöveg kiírása mellett jelzi, hogy a szöveg utolsó karaktere mely oszlopban és sorban keletkezik. A write és writeln eljárással kerül a szöveg kiírásra. A kuzor pozíciójának koordinátái lekérdezhetőek, az oszlopot a WhereX függvény, sort a WhereY adja vissza. A Delay eljárásban másodpercben megadott érték felfüggeszti a program futását. Általában azért teszünk a programban ilyen jellegű képernyő kimerevítést, hogy a szemünk észrevegye a változást. A változás a gép gyorsasága miatt olyan gyorsan következik be, hogy a képet éppen csak egy villanásra láthatjuk. Ezt a késleltető módszert a többi mintaprogramban is alkalmazzuk. A CRT2.PAS program CrlEol eljárás használatát mutatja be, amely a kurzor pozíciójától töröl a sor végéig. A CRT3.PAS programban a DelLine eljárással a kurzort tartalmazó sort töröljük és az InsLine segítségével sort szúrunk be. A CRT4.PAS a KeyPressed függvényt használja, amely billentyűleütést figyel. A képernyőn addig fut a 'Barmilyen billentyu leutesere var' szöveg kiírása, amíg valamilyen billentyűt le nem ütünk. A DALLAM.PAS a belső hangszóró megszólaltatását mutatja be. Egy hang megszólaltatása három eljárás hívást jelent. Sound(440); { a 440 Hz A hang megszólaltatása } Delay(250); { a hang kitartása 250 ms-ig } Nosund; { a hangszóró kikapcsolása } A VILLOG.PAS program több ablakot nyit, az ablaknak más színű hátteret rendel. Értékeljük ki az alábbi programrészletet: (* Teljes ablak hattere *) TextBackGround(LightGray); ClrScr; (* elso ablak *) Window(10,10,20,15); TextBackGround(Cyan); ClrScr; TextColor(Red); Writeln('1. Sor '); Writeln('2. Sor '); Writeln('3. Sor '); Delay(1000); GotoXY(1,1); TextColor(Yellow+Blink); Write('felulir'); TextColor(Black); Window(30,23,50,24); Write('Nyomj Enter-t…'); readln; Az alapételmezés szerinti 80x25 méretű ablak hátterét világosszürkére színezi a ClrScr eljárás hívása. Ez a függvény a képernyőt törli, és az attribútum byte-ot a beállított színekkel tölt fel. A fő ablak (10,10) koordináta-pontjában létrehozunk egy ablakot, amely 10 oszlopot és 5 sort tartalmaz. A háttér színét türkízre állítja be a TextBackGround és a ClrScr eljárás végzi el az aktív ablak kiszínezését. Az írás színét a TextColor pirosra állítja be. A kurzor az aktív ablak bal felső sarkában villog, amely az (1,1) koordinátapontot jelenti. A Writeln('1. Sor '); piros színű kiírása ezért az aktív ablak első sorába kerül, majd a kurzor a következő sor elejére áll. Ugyanígy íródik ki a 2. Sor ill. a 3. Sor az ablakban. 1000 ms késleltetés után a kurzor a GotoXY(1,1) hatására az ablak első pozíciójára áll, az írás színe villogó sárgára vált: SetColor(Yello+Blink); hívás hatására. A Write('felulir'); végrehajtásakor az 1.Sor szöveg valójában felülíródik. Majd a program feketére váltja az írás színét és egy új ablakban kiírja a Nyomj Enter-t figyelmeztető szöveget. Egy paraméter-nélküli Readln; utasítás felfüggeszti a program futását, míg meg nem nyomjuk meg az ENTER billentyűt. A program az alábbi utasításokkal fejeződik be: (* az ablak szinének visszaállítása *) TextBackGround(black); Window(1,1,80,25); ClrScr; (* az irás szinének visszaállitása *) TextColor(LightGray); Ezek az utasítások gondoskodnak a fekete háttérről, az ablak visszaállításáról, valamint az írás színéről, különben visszatérve a DOS rendszerbe, a háttér és az írás színe megmarad. SCREENT.PAS program bemutatja, hogyan lehet a képernyőt két részre osztani. 13.3.2. Adat beolvasása és ellenőrzése A CRT_PR.PAS program adat beolvasásán és ellenőrzésén keresztül mutatja be a szöveges mód eljárásainak és függvényeinek használatát. A program az alábbi feladatot hajtja végre: - fejlécet ír ki, - kéri az adat beolvasását, - megvizsgálja, hogy az adat valóban real típusú-e, - ha a beolvasott adat hibás, akkor a beolvasott adat mellett piros villogó Hibás adat… és sárga színű Nyomj Space-t üzenet jelenik meg. Ilyenkor a Space billentyű leütése után az adatot újra beolvashatjuk. - Ha a megadott számadat formailag jó, lehetőség van a javítására, ha az Akarja javitani (i/n): kérdés mellett i betűt ütünk, egyébként n-et. A válasz után az üzenetsor törlődik és a beolvasás elölről kezdődik az újbóli adat ellenőrzésével. A program képernyője a következőképpen néz ki: Adatbeiras billentyuzetrol Adat: s Hibas adat… Nyomj Space-t Akarja javitani (i/n): A program megtervezése A program változói: a real, a jó adatot tartalmazza, sz string, először sztringbe olvasunk az adat ellenőrzése miatt, code integer, a val eljárás ebbe a változóba jelzi, hogy az adat megfelel-e a kért adattípusnak. x,y byte, a beolvasott adat melletti koordinátákat tartalmazza, ch char, ebbe a változóba olvassa be a ReadKey függvény az i vagy az n válaszkaraktert. A program listájának magyarázata: Eltérve az alapértelmezéstől a színes 40 oszlopos szöveges módot választjuk ki: TextMode(C40); Ahhoz, hogy a teljes képernyő színe kék legyen, először kiválasztjuk a TextBackground(blue) eljárással a háttérszínt, majd töröljük a képernyőt a ClrScr eljárással, ezután veszi fel a háttér a kivánt színt. A TextColor(Magenta) az írás színére a lilát választja ki. A GotoXY(2,5) a kuzort a második oszlop, ötödik sorába helyezi át és a write('Adatbeolvasas billentyuzetrol') szöveg a kurzor pozíciójától lila színnel jelenik meg. Két egymásbaágyazott repeat until ciklust alkalmazunk az adat vizsgálatára. A 2. repeat until ciklusból addig nem lépünk ki, amíg a val eljárás code változója nulla nem lesz, vagyis csak akkor, ha a számadat megfelelő formátumú. Az első repeat until ciklus csak akkor tér vissza, ha az adatbeolvasáskor kapott adatot javítani akarjuk és i választ adtunk, különben a program befejezi a működését. Fehér színnel a 2. oszlop 10. sorában kerül kiírásra az Adat: szöveg és mögötte feltétel nélkül töröljük a sort (ClrEol). Sárga színre állítjuk a begépelendő adatok színét. Az adatot a readln eljárással olvassuk be és a val eljárással az sz sztringet az a real típusú változóba alakítjuk át. Ha a code változó tartalma nem lesz zérus, akkor az adat hibás. Lekérdezzük kurzor x és y koordinátáit a WhereX és WhereY függvé-nyekkel. A hibajelzés a következőképpen néz ki: Az adatbeolvasás sorában, de tőle négy karakterrel pirosan villogva kerül kiírása Hibas adat… Egy üres hellyel távolabb pedig sárga színnel jelenik meg a Nyomj Space-t szöveg és mindezt 200 ms ideig 100 Hz-es hangjelzés kísér. Ha a SPACE billentyűt leütjük, a teljes sor törlődik és a repeat until ciklus addig ismétlődik, amíg a code nulla nem lesz, ami a hibátlan adat bevitelét jelenti. Két sorral lejjebb zöld színnel kerül kiírásra Akarja javitani (i/n): A ReadKey a ch változóba olvassa be a leütött karaktert. Ezt a karaktert az UpCase függvény nagybetűvé alakítja, így elég az I és az N betűt vizsgálni. Az i válasz hatására az adatbeolvasás és az ellenőrzés előlről kezdődik, n válasz esetén a program befejezi a működését. A CRT_PR.PAS program listája program crt_pr; uses crt; var a : real; sz : string; code: integer; x,y : byte; ch : char; begin TextMode(C40); TextBackground(blue); clrscr; TextColor(Magenta); GotoXY(2,5); write('Adat beolvasasa billentyuzetrol'); repeat repeat TextColor(White); GotoXY(2,10); write('Adat: '); ClrEol; x:=WhereX; y:=WhereY; TextColor(Yellow); readln(sz); val(sz,a,code); if code <>0 then begin gotoXY(x+4,y); TextColor(Red+Blink); write('Hibas adat…'); TextColor(Yellow); write(' Nyomj Space-t'); sound(100);Delay(200); NoSound; repeat until Keypressed; gotoXY(2,10); DelLine; end; until code=0; repeat gotoXy(2,12); TextColor(Green); write('Akarja javitani (i/n): '); ch:=ReadKey; ch:=UpCase(ch); until (ch='I') or (ch='N'); gotoXY(2,12); delline; until ch='N'; end. A CRT_PR.PAS program továbbfejlesztett változatát használjuk fel a 14. fejezetben bemutatott példában. 13.3.3. Menükezelés A szöveges üzemmód használatára javasoljuk áttanulmányozni az alábbi egyszerű, de könnyen változtatható menükészítő programot. A MENU.PAS programhoz tartozik a UTIL.PAS file is, amely unit formában tartalmazza a menükezelés eljárásait: CursorOn a kurzor megjelenítése, CursorOff a kurzor eltüntetése, MenuWin menüablak rajzoló eljárás. A MenuWin eljárás hívása: MenuWin( X,Y, Border, MenuCol, Item, ItemNum,Title, Choice) A paraméterei: X,Y az ablak bal felső sarkának koordinátái, Border keret típusa, mely a következő értékeket veheti fel: NoLine nincs keret, ThinLine vékony keret, FatLine vastag keret, DoubleLine dupla vonalú keret, DoubleTop dupla a tetején, vékony az oldalán, DoubleSide dupla az oldalán, vékony a tetején. MenuCol MenuColors típusú rekord, amely a keret és a menüpontok színeit tartalmazza: FgBorder menükeret színe, BgBorder menükeret háttere, FgNormal menüpont karakterének színe, BgNormal menüpont karakterének háttere, FgSelect kiválasztott menüpont karakterének színe, BgSelect kiválasztott menüpont karakterének háttérszíne Items ItemType típusú tömb, mely a menüpontok szövegét tartalmazza ItemNum a menüpontok száma Title Str80 típusú sztring, mely a menü felirata Choice a kiválasztott menüpont sorszámát tartalmazza, ha nulla a visszatérési érték, akkor a menüből ESC billentyűvel léphet ki. A MENU.PAS program bemutatja a menükészítés módját, az alábbi öt menütételt jeleníti meg színesen: Olvas Szamol Rajzol Ment adatot Vege Ellenőrző kérdések: 1. Mire szolgál a Crt unit? 2. Mennyi az oszlopok és a sorok száma az alapértelmezés szerinti ablakban? 3. Melyik eljárással hozhatunk létre ablakot? 4. Hol van az aktív ablak (1,1) koordinátapontja? 5. Hangjelzés keltésére milyen eljárásokat kell aktiválni? 6. Melyik eljárással helyezzük át a kurzor pozícióját? 7. Melyik eljárás állítja a háttér színét? 8. Melyik eljárással változtathatjuk az írás színét? 9. Melyik eljárás törli a képernyőt? 10. Milyen eljárásokat kell aktíválnunk, hogy a Window(5,5,20,25); ablak háttere kék legyen? 11. Melyik eljárással lehet a kurzort tartalmazó sort törölni? 12. Melyik eljárással lehet a kurzor pozíciójától a sor végéig törölni? 13. Aktíváljuk a megfelelő eljárást, hogy az írás színe villogó piros legyen… 14. Milyen eljárások hívásával állítjuk vissza az alapállapotot, mielőtt visszatérünk DOS rendszerbe? Feladatok: 1. Śrja ki a billentyűzeten leütött karakter kódját, a programból a SPACE billentyűvel lépjen ki. (KODOL.PAS) 2. Śrja ki a teljes kódtáblázatot… (IBM_KOD.PAS)