Zpět na seznam článků     Číst komentáře (0)     Verze pro tisk

Pascal pro začátečníky 10 - Unita CRT

Autor: Kub@z   
13.4.2004

Unita "CRT" slouží pro základní komunikaci s hardwarem a operačním systémem. Tím samozřejmě nemyslím, že byste pomocí unity CRT mohl naprogramovat třeba připojení scanneru přes USB, ale slouží pro základní práci v textovém...


Unita "CRT" slouží pro základní komunikaci s hardwarem a operačním systémem. Tím samozřejmě nemyslím, že byste pomocí unity CRT mohl naprogramovat třeba připojení scanneru přes USB, ale slouží pro základní práci v textovém režimu DOSu. Zde je malý příklad:

uses (* fdelay, *) crt;
begin
textbackground(black); (* změna barvy pozadí *)
clrscr;                (* smaže obrazovku *)
textcolor(14); writeln('Text vypsany zlute'); (* změna barvy textu *)
textcolor(15); writeln('Text vypsany bile');
textcolor(blue); writeln('Text vypsany modre');
end.

Jak vidíte, není zde moc co vysvětlovat, názvy procedur mluví samy za sebe. Ale jak jste si jistě všimli, někdy jsem použil jméno barvy a někdy číslo. Tato jména jsou konstanty nadefinované v unitě "CRT". Jejich popis najdete v nápovědě k překladači. Já osobně používám číselný zápis, protože to není až tak těžké na zapamatování - barev je pouze 16 (počítají se od 0 do 15) a pro barvu pozadí je možné použít pouze prvních 8. Další důležitá procedura je "gotoXY(x,y)":

uses crt;
begin
gotoXY(20,5);       (* přejde na 20 znak na pátém řádku *)
write('Ahoj lidi'); (* vypíše zde text *)
readkey;
end.

Jak vidíte, procedura "gotoXY" přejde na zadaný sloupec a řádek. Teď už byste mohl vymyslet proceduru vykreslující třeba rámeček z písmen "o" (pro zjednodušení):

uses (* fdelay, *) crt;

procedure ramecek(x,y,x2,y2: byte);
var i: integer;
begin
for i := x to x2 do begin
gotoXY(i,y); write('o');  (* horní strana *)
gotoXY(i,y2); write('o'); (* dolní strana *)
end;
for i := y to y2 do begin
gotoXY(x,i); write('o');  (* levá strana *)
gotoXY(x2,i); write('o'); (* pravá strana *)
end;
end;

begin
clrscr;
ramecek(5,5,50,15); (* vykreslíme rámeček *)
readkey;
end.

Samozřejmě pokud chcete, aby tento rámeček vypadal trochu k světu, chce to použít jiné znaky a tady může být trochu problém. Jak zobrazit znak, který není možné zapsat pomocí klávesnice, ale je zobrazitelný? K tomu slouží v Pascalu "#". Když napíšete "#" a číslo znaku, tak se to bere jako znak. Např.:

begin
write(#48); (* vypíše ascii znak 48 - "0" *)
write(#82); (* vypíše ascii znak 82 - "R" *)
end.

Když budete chtít použít znak s číslem uloženým v proměnné, použijete funkci "chr(cislo)":

var i: integer;
begin
i := 82;
write(chr(i));  (* vypíše znak *)
write(chr(82)); (* tento zápis je také možný, ale pokud znáte předem *)
               (* hodnotu znaku, tak je lepší použít zápis s "#" *)
end.

A pokud budete naopak chtít zjistit číslo znaku, použijete funkci "ord(znak)".:

begin
writeln(ord(readkey)); (* vypíše číslo stisknuté klávesy *)
end.

Ale to už jsem trochu odbočil od unity CRT. S pozicí kurzoru souvisí ještě funkce "whereX" a "whereY". Tyto funkce vrací sloupec (řádek) ve kterém se nachází kurzor. Pak jsou zde ještě dvě zajímavé procedury pro mazání textu a to "ClrEol", která smaže všechny znaky od kurzoru do konce řádku, a "DelLine", která smaže vše na řádku, na kterém se nachází kurzor. Další důležitá procedura je "textmode", která změní textový mód obrazovky. Její parametr se dá zapsat buď číselně, nebo pomocí konstant s celkem výstižnými jmény, všechny možné kombinace naleznete v tabulce:

KonstantaVýznam
  CO80  80 sloupců 25 řádků
  CO40  40 sloupců 25 řádků
  CO80 + Font8x8  80 sloupců 49 řádků
  CO40 + Font8x8  40 sloupců 49 řádků


Daný mód se tedy vyvolá takto:

uses (* fdelay, *) crt;
begin
textmode(CO80+Font8x8);
write('Maly font - pro zkousku');
readkey;
end.

Pokud budete chtít dělat textové hry (něco ve stylu střílení po hvězdičkách), je nejlepší používat mód "CO80 + Font8x8", protože v něm jsou znaky přibližně stejně vysoké, jako široké. Dříve byla velice používanou procedurou procedura "delay". Používala se takto:

uses (* fdelay, *) crt;
begin
writeln('Text');
delay(500); (* počká 500 milisekund *)
writeln('Text 2');
end.

Problém spočívá v tom, že na moderních rychlých počítačích běhá velice zrychleně, takže je nepoužitelná. Dále se občas hodí procedura "window", která nastaví velikost virtuální obrazovky. Funguje to tak, že např. "window(10, 10, 70, 15)" způsobí, že třeba procedura "gotoXY(1,1)" přejde ve skutečnosti na "(10,10)" nebo třeba "clrscr" smaže pouze znaky v tomto "okně". Pak jsou zde ještě dvě procedury pro práci s PC speakerem. Je to "sound" a "nosound". Příklad vše objasní:

uses (* fdelay, *) crt;
begin
sound(500); (* začne přehrávání zvuku na frekvenci 500 Hz *)
readkey;
nosound;    (* vypne přehrávání zvuku *)
end.

Poslední velice důležitá funkce, o které se zmíním, je "keypressed". Je typu boolean a určuje, zda se nachází v bufferu klávesnice čekající klávesa, neboli zda od posledního zavolání funkce "readkey" bylo něco stisknuto. To je velice důležité, protože díky ní můžeme čtení klávesy podmínit a to stylem:

uses (* fdelay, *) crt;
var ch: char;
begin
repeat
if keypressed then ch := readkey;
        (* když je stisknuta klávesa, zjistíme její hodnotu *)
write('abc');   (* pořád dokola vypisujeme abc *)
delay(500);
until ch = #27; (* #27 je escape *)
end.

Tento program vypisuje pořád dokola "abc", ale kdyby nebylo načtení klávesy podmíněno zjištěním, jestli nějaká byla stisknuta, program by vždy čekal na stisk klávesy a po každém proběhnutí cyklu by se na klávesu čekalo znovu.
Kub@z

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 2.24/25

1  2  3  4  5    
(známkování jako ve škole)