home *** CD-ROM | disk | FTP | other *** search
- {$N+}
- {$C FIXED PRELOAD PERMANENT}
- {┌────────────────────────────────────────────────────────┐
- │Modul FR_SOK.TPU pro kreslení grafiky v textovém reæimu,│
- │kreslení okének a dal¿í procedury. │
- │Franti¿ek Sokolovskÿ, Praha 1995, 1996, 1997 │
- └────────────────────────────────────────────────────────┘}
-
- unit fr_sok;
-
- INTERFACE
- uses Crt,Chyby,Dos;
- const hacky:String='çâêñ⌐¿ƒûæÇàëÑ₧¢åªÆ';
- bezha:String='cdenrstuzCDENRSTUZ';
- carky:String='áéíóúÿÅÉïòù¥';
- bezca:String='aeiouyAEIOUY';
- vypnuta=False;
- zapnuta=True;
-
- NUL=0; ShiftTab=15;
- AltQ=16; AltW=17;
- AltE=18; AltR=19;
- AltT=20; AltY=21;
- AltU=22; AltI=23;
- AltO=24; AltP=25;
- AltA=30; AltS=31;
- AltD=32; AltF=33;
- AltG=34; AltH=35;
- AltJ=36; AltK=37;
- AltL=38; AltZ=44;
- AltX=45; AltC=46;
- AltV=47; AltB=48;
- AltN=49; AltM=50;
- F1=59; F2=60;
- F3=61; F4=62;
- F5=63; F6=64;
- F7=65; F8=66;
- F9=67; F10=68;
- Home=71; Up=72;
- PageUp=73; Left=75;
- Right=77; KlavesaEnd=79;
- Down=80; PageDown=81;
- Insert=82; Delete=83;
- ShiftF1=84; ShiftF2=85;
- ShiftF3=86; ShiftF4=87;
- ShiftF5=88; ShiftF6=89;
- ShiftF7=90; ShiftF8=91;
- ShiftF9=92; ShiftF10=93;
- CtrlF1=94; CtrlF2=95;
- CtrlF3=96; CtrlF4=97;
- CtrlF5=98; CtrlF6=99;
- CtrlF7=100; CtrlF8=101;
- CtrlF9=102; CtrlF10=103;
- AltF1=104; AltF2=105;
- AltF3=106; AltF4=107;
- AltF5=108; AltF6=109;
- AltF7=110; AltF8=111;
- AltF9=112; AltF10=113;
- CtrlPrintScreen=114;
- CtrlLeft=115; CtrlRigh=116;
- CtrlEnd=117; CtrlPageDown=118;
- CtrlHome=119;
- Alt1=120; Alt2=121;
- Alt3=122; Alt4=123;
- Alt5=124; Alt6=125;
- Alt7=126; Alt8=127;
- Alt9=128; Alt10=129;
- AltMinus=130; AltRovnase=131;
- CtrlPageUp=132;
- const pocet0=16;
- type smery=record
- znak:Char;
- nahoru,dolu,doleva,doprava:Boolean;
- end;
- PathStr=Dos.PathStr;
- type PTextBuf = ^TTextBuf;
- TTextBuf = array[0..127] of Char;
- TTextRec = record
- Handle: Word;
- Mode: Word;
- BufSize: Word;
- Private: Word;
- BufPos: Word;
- BufEnd: Word;
- BufPtr: PTextBuf;
- OpenFunc: Pointer;
- InOutFunc: Pointer;
- FlushFunc: Pointer;
- CloseFunc: Pointer;
- UserData: array[1..16] of Byte;
- Name: array[0..79] of Char;
- Buffer: TTextBuf;
- end;
-
- const pole0:array[1..pocet0] of smery=(
- (znak:'┌';nahoru:False;dolu:True;doleva:False;doprava:True),
- (znak:'─';nahoru:False;dolu:False;doleva:True;doprava:True),
- (znak:'─';nahoru:False;dolu:False;doleva:True;doprava:False),
- (znak:'─';nahoru:False;dolu:False;doleva:False;doprava:True),
- (znak:'┬';nahoru:False;dolu:True;doleva:True;doprava:True),
- (znak:'┐';nahoru:False;dolu:True;doleva:True;doprava:False),
- (znak:'│';nahoru:True;dolu:True;doleva:False;doprava:False),
- (znak:'│';nahoru:False;dolu:True;doleva:False;doprava:False),
- (znak:'│';nahoru:True;dolu:False;doleva:False;doprava:False),
- (znak:'├';nahoru:True;dolu:True;doleva:False;doprava:True),
- (znak:'┼';nahoru:True;dolu:True;doleva:True;doprava:True),
- (znak:'┤';nahoru:True;dolu:True;doleva:True;doprava:False),
- (znak:'└';nahoru:True;dolu:False;doleva:False;doprava:True),
- (znak:'┴';nahoru:True;dolu:False;doleva:True;doprava:True),
- (znak:'┘';nahoru:True;dolu:False;doleva:True;doprava:False),
- (znak:'■';nahoru:False;dolu:False;doleva:False;doprava:False)
- );
- type zaznam=record f,p:Word;end;
- TZnak=record Ascii,Barva:byte;end;
- Tfce=function(cislo:Word):String;
- const male :string[15]='áçâêéíñó⌐¿ƒúûÿæ';
- mbez :string[15]='acdeeinorstuuyz';
- velke:string[15]='ÅÇàëÉïÑò₧¢åùª¥Æ';
- vbez :string[15]='ACDEEINORSTUUYZ';
-
- var stav,vrat,zvuk:Boolean;
- zobraz:Boolean; {True - pokud jsou jiæ poloæky uæivatelskou funkcí
- zobrazovány v menu p⌐i pouæití Menu5, False - pokud je pouze
- vyhodnocována maximální délka poloæek
- Pouæito v programu Jídla, kde je uæivatelskou funkcí vypisováno
- na obrazovku, která je volána v Menu5 v první fázi Menu5 zji¿ƒuje
- maximální délku poloæky menu vçetnê nápisu a v druhé fázi poloæky
- uæ zapisuje do rolujícího se menu.}
- pamatuj:Char;
- cskod,posledni,MaxX,MaxY:Byte;
- obraz:array[0..1999] of TZnak absolute $b800:$0000;
- chyba:Integer;
- Uziv1,Uziv2,Uziv3,Uziv4:Function:Boolean; {Volány funkcí "Posun2":
- uziv1 p⌐ed pohybem kurzoru doprava
- uziv2 p⌐ed pohybem kurzoru doleva
- uziv3 p⌐ed pohybem kurzoru nahoru
- uziv4 p⌐ed pohybem kurzoru dolu
- Poznámky:
- 1. Pokud tyto uæivatelské funkce vrátí True, provede se posun,
- pokud False, posun kurzoru se neprovede.
- 2. Pokud nebudou tyto procedury definovány, pouæijí se standardní
- funkce, která vædy vrátí True.
- 3. Programátor pouæívající tyto funkce mûæe svoji vlastní funkcí zakázat
- pohyb kurzoru ve funkci Posun2 nebo udêlat nêjakou çinnost p⌐ed tím,
- neæ se kurzor p⌐esune.
- 4. Definice své vlastní uæivatelské funkce:
-
-
- function F1:Boolean;
- begin
- p⌐íkazy, které se provedou p⌐ed pohybem kurzoru doprava
- F:=True; napi¿te v p⌐ípadê, æe opravdu chcete povolit p⌐esun kurzoru
- jinak napi¿te F:=False;
- end;
-
- function F2:Boolean;
- begin
- p⌐íkazy, které se provedou p⌐ed pohybem kurzoru doleva
- F:=True; napi¿te v p⌐ípadê, æe opravdu chcete povolit p⌐esun kurzoru
- jinak napi¿te F:=False;
- end;
-
- function F3:Boolean;
- begin
- p⌐íkazy, které se provedou p⌐ed pohybem kurzoru nahoru
- F:=True; napi¿te v p⌐ípadê, æe opravdu chcete povolit p⌐esun kurzoru
- jinak napi¿te F:=False;
- end;
-
- function F4:Boolean;
- begin
- p⌐íkazy, které se provedou p⌐ed pohybem kurzoru dolu
- F:=True; napi¿te v p⌐ípadê, æe opravdu chcete povolit p⌐esun kurzoru
- jinak napi¿te F:=False;
- end;
-
- begin
- Uziv1:=F1;
- Uziv2:=F2;
- Uziv3:=F3;
- Uziv4:=F4;
- promênná:=Posun2(parametry);
- end.
-
- ==============================================================================
-
- Vÿhody:
- 1. Programátor nemusí vêdêt jak funguje funkce Posun2.
- 2. Programátor nemusí modifikovat zdrojovÿ test jednotky FR_SOK.
- 3. A hlavnê nemusí prohledávat dlouhÿ zdrojovÿ text této jednotky.
- }
-
- procedure Bod(x,y:byte);
- procedure Usecka(xa,ya,xb,yb:integer);
- procedure Zacatek_Usecky(x,y:byte);
- procedure Konec_Usecky(x,y:byte);
- function Klavesa:char;
- function AnoNe(text:string):boolean;
- procedure Znak(x,y,ascii:byte);
- procedure Obdelnik(x,y,sirka,vyska,ram,pozadi:byte;typ:boolean);
- procedure Obdelnik2(x,y,sirka,vyska,ram,pozadi:byte;typ:boolean);
- procedure Kurzor(x,y,delka:byte);
- function Posun(xmin,xmax,ymin,ymax:byte;var x,y:byte):byte;
- procedure Nastav;
- procedure P1(sirka:integer);
- procedure Zacatek(nadpis:string);
- procedure Radek(pom:string);
- procedure Radek2(pom:string;polozka:boolean);
- procedure Linka;
- function Menu(x,y,ram:byte;kur:boolean):byte;
- function Menu2(x,y,ram:byte;kur:boolean):byte;
- function Zjisti(pol:byte):string;
- function AnoNe2(text:string):boolean;
- procedure Zapni_Zvuk;
- procedure Vypni_Zvuk;
- procedure Sound1(f,d1,d2:word);
- procedure Sound2(f1,f2,d:word);
- procedure Proc1(text:string);
- procedure Proc2(text:string);
- function Proc3(retezec1:string;cislo:real;retezec2:string):string;
- procedure Cekej;
- procedure Cekani0;
- procedure Dialogove_Okno;
- function Hodiny:boolean;
- procedure Zapni_Hodiny(x,y:byte);
- procedure Vypni_Hodiny;
- function Soubor_Existuje(jmeno:string):boolean;
- function Menu3(x,y,ram:byte;kur:boolean):byte;
- function Posun2(xmin,ymin,xmax,ymax,sirka,krokx,kroky:byte;var x,y:byte):byte;
- procedure Cekej2;
- procedure Kurzor2(x,y,delka:byte);
- procedure Cekani;
- function Menu4(x,y,ram:byte;kur:boolean):byte;
- function Dve(mocnina:Byte):Longint;
- function TestBitu(hodnota:Longint;i:Byte):Boolean;
- function Str(b:Longint):String;
- function Str2(b:Longint;pocet:Byte):String;
- function VyberSouboru(maska,text:String):String;
- function Bin(n:Word):String;
- function VyberJednotky(text:String):Char;
- function Hacek(NadJakymPismenem:Char):Byte;
- function Carka(NadJakymPismenem:Char):Byte;
- procedure Pipej(pole:Array of zaznam);
- function Klavesa2:Char;
- procedure TvarKurzoru(StartLine,EndLine:Byte);
- function CtiString(zprava:String):String;
- function CtiString2(zprava:String;PouzeCisla,Tajne:Boolean):String;
- procedure NastavTajnyZnak(znak:Char);
- function ZjistiTajnyZnak:Char;
- procedure NastavCekani(delka:Byte);
-
- {Nové procedury a funkce:
- !!! Pokud je zde uvedeno jméno souboru, je moæné zde napsat i libovolné
- za⌐ízení s cestou, vædy je v¿ak nutné napsat jméno i s koncovkou !!!}
-
- function Prestupny(r:longint):boolean; {Je rok "r" p⌐estupnÿ?}
- function Pocet2(mesic:Byte;rok:LongInt):Byte; {Poçet dní v mêsíci "mesic" v roce "rok":}
- function SpravneDatum(d,m:Byte;r:LongInt):Boolean; {Je moæné datum "d"."m"."r"?}
- procedure Zitra(d1,m1:Byte;r1:Longint;var d2,m2:Byte;var r2:Longint); {Vrací zít⌐ej¿í den:}
- procedure Vcera(d1,m1:Byte;r1:Longint;var d2,m2:Byte;var r2:Longint); {Vrací vçerej¿í den:}
- {function Str(cislo:Longint):String;}
- procedure UlozBarvy; {Uloæí barvy textu a pozadí do svÿch promênnÿch.}
- procedure ObnovBarvy; {Obnoví barvy textu a pozadí ze svÿch promênnÿch.}
- function Hledej(soubor,Hledat:String):Longint; {Hledá text "Hledat" v souboru pojmenovanÿm "soubor":}
- function Hledej2(soubor,Hledat:String):Longint; {Rychlej¿í hledáni textu "Hledat" v souboru pojmenovanÿm "soubor":}
- procedure CopyFile(input,output:String); {Obdoba Copy v MS-DOSu, vstupy jsou jména souboru:}
- function Dekoduj(co:String):String; {Sloæitê dekóduje nap⌐. heslo:}
- function DelkaSouboru(jmeno:String):Longint; {Vrací délku souboru, kterÿ má jméno "jmeno".}
- function Soucet1(jmeno:String):Longint; {Seçte jednotlivé Byty souboru a vÿsledek vrací jako vÿstup funkce:}
- function Soucet2(jmeno:String):Longint; {Soucet2 Je rychlej¿í ekvivalent k funkci Soucet1:}
- function CtiCislo(text:String):Real; {Zadání reálného çísla z klávesnice:}
- function Cti_Byte(text:String):Byte; {Çtení çísla BYTE vyuæitím funkce CtiCislo:}
- function Cti_Real(text:String):Real; {Çtení çísla REAL vyuæitím funkce CtiCislo:}
- function Cti_LongInt(text:String):LongInt; {Çtení çíslo LONGINT vyuæitím funkce CtiCislo:}
- procedure BorderColor(barva:Byte); {Barva okraje na CGA, EGA, VGA:}
- procedure CtiString3(zprava:String;PouzeCisla,Tajne:Boolean;var text:String);
- {Zadání ⌐etêzce z klávesnice, promênná "text" je zároveñ vstupní ale i vÿstupní,
- jako vstup: ⌐etêzec, kterÿ se uloæí do vÿstupního ⌐ádku, takæe ho uæivatel mûæe pouze zmênit
- jako vÿstup: vlastní vÿstup z procedury, tj. text z rámeçku}
- function DoplnNa(co:String;NaDelku:Byte):String; {Prodlouæí ⌐etêzec na délku uloæenou v promênné "NaDelku":}
- function Secti(x,y:Char):Char; {Seçte grafické znaky (viz p⌐íklad):
- ┌─┬─┐ ╔═╦═╗ ╒═╤═╕ ╓─╥─╖ █████
- │ │ │ ║ ║ ║ │ │ │ ║ ║ ║ █ █ █
- ├─┼─┤ ╠═╬═╣ ╞═╪═╡ ╟─╫─╢ █████
- │ │ │ ║ ║ ║ │ │ │ ║ ║ ║ █ █ █
- └─┴─┘ ╚═╩═╝ ╘═╧═╛ ╙─╨─╜ █████
- "┌" + "┐" = "┬" "├" + "─" = "┼"
- "└" + "│" = "├" "┼" + " " = "┼"
- }
-
- {Funkce Locate vrací znak, kterÿ je na obrazovce na pozici x,y:}
- {Parametr "znaku" udává poçet znakû na ⌐ádku v textovém reæimu:}
- function Locate(x,y:Byte):Char;
- {Poçítaç napí¿e na obrazovku na aktuální pozici kurzoru zadanÿ znak,
- nejedná se v¿ak o pouhÿ tisk, ale navíc poçítaç provede funkci "Secti"
- znaku, kterÿ je pod kurzorem s tisknutÿm znakem a vÿsledek zapí¿e
- na pozici kurzoru.}
- procedure PisZnak(ASCII:Char);
- function VratTrue:Boolean;
- function Sude(c:Longint):Boolean;
- function Liche(c:Longint):Boolean;
- function Min(c1,c2:Longint):Longint;
- function Max(c1,c2:Longint):Longint;
- procedure Tisk(x,y:Byte;text:String);
- procedure Prohlizec(max:Word;f:Tfce;napis:String);
- {Procedura Exec je p⌐evzata z helpu Borland Pascalu 7.0 (trochu upravena):}
- procedure Exec2(ProgramName,CmdLine:String); {ProgramName - jméno souboru
- i s cestou, kterÿ chcete spustit (moæné pouze soubory .EXE a .COM).
- CmdLine slouæí k zadání parametrû ekvivalentní parametrûm p⌐íkazové ⌐ádky
- DOSu.
- Pro provádêní .BAT souborû a p⌐íkazû DOSu slouæí pouze následující procedura
- Command, která volá interpret p⌐íkazû COMMAND.COM. Bez nêj není moæné tyto
- p⌐íkazy provádêt, coæ je logické...}
- procedure Command(Com:String); {Startuje COMMAND.COM a provede v nêm p⌐íkaz
- zadanÿ v ⌐etêzci Com.}
- function Nekonecno:Double;
- procedure Konec;
- function Str3(prom:Extended;celkem,desetinnych:Byte):String;
- function UpCase(c:Char):Char;
- function DownCase(c:Char):Char;
- function DownCaseString(s:String):String;
- function UpCaseString(s:string):string;
- function OdstranMezery(s:String):String;
- {Pro naçítání logickÿch hodnot z textového souboru, ⌐ádek s logickou
- hodnotou reprezentuje nápis TRUE (log.1) nebo FALSE (log.0):}
- function StringBoolean(s:String):Boolean;
- {Obdoba systémové procedury Insert, ale tato moje vloæí ⌐etêzec "co"
- skuteçnê ba pozici "pozice" v ⌐etêzci "kam". Systémová procedura Insert
- totiæ, pokud je vÿstupní ⌐etêzec krátkÿ, zdroj ukládá na konec ⌐etêzce,
- ale ne na pozici, kam chceme. Rozdíl je z⌐ejmÿ z tohoto p⌐íkladu:
-
- uses fr_sok;
- var s:String;
- begin
- s:='';
- System.Insert('abc',s,3);
- Writeln('s="',s,'".');
- s:='';
- Vloz('abc',s,3);
- Writeln('s="',s,'".');
- end.
- }
- procedure Vloz(co:String;var kam:String;pozice:Byte);
- function Menu5(x,y,ram:byte;kur:boolean;pocet:Word;f:Tfce):Word;
- function Odstran_Hacky_Carky(s:string):string;
- function Kod852(c:Char):Char; {P⌐evod z kódu B⌐í Kamenickÿch - kód 852 - pouze 1 znak}
- function Kod1250(c:Char):Char; {P⌐evod z kódu B⌐í Kamenickÿch - kód 1250 - pouze 1 znak}
- function cs(text:String):String; {Konvertuje string z kódu B⌐í Kamenickÿch do jiného - zadaného v "cskod":}
- function Kod852String(s:String):String; {P⌐evod z kódu B⌐í Kamenickÿch - kód 852 - celÿ ⌐etêzec}
- function Kod1250String(s:String):String; {P⌐evod z kódu B⌐í Kamenickÿch - kód 1250 - celÿ ⌐etêzec}
-
- function Hlaseni(s:String):String; {Vypí¿e hlá¿ení do menu a vyçká na stisk klávesy >Enter<.}
- function Adresar_Existuje(jmeno:string):Boolean;
- function OdstranZbytecneMezery(s:String):String; {Odstraní zbyteçné mezery p⌐ed prvním rozumnÿm znakem a v¿echny mezery za
- posledním rozumnÿm znakem s dále v¿echny zdvojené mezery nahradí jednoduchÿmi}
- procedure Vypis(var f:System.Text);
- procedure UschovejPozici(var f:System.Text);
- procedure ObnovPozici(var f:System.Text);
- function Val(s:String):Byte;
- function Prevod(zdroj:String;vstupni,vystupni:Byte):String;
-
- IMPLEMENTATION
- const Dny:array[0..6] of string[7]=('Nedêle','Pondêlí','ùterÿ','St⌐eda','Çtvrtek','Pátek','Sobota');
- max0=100;
- bar=LightGray*16+Blue;
- {0-7 0-15}
- const Mouse=51; {Çíslo p⌐eru¿ení pro komunikaci s ovladaçem my¿i.}
- const Pocty:array[1..12] of Byte=(31,28,31,30,31,30,31,31,30,31,30,31);
- var b:Byte;
- var barva,i,pocet,xo,xh,yo,yh,stand:Byte;
- text:array[0..max0] of string[75];
- cara,polozky:array[1..max0] of Boolean;
- a1,a2,a3,a4,a5,a6,a7,a8:Byte;
- Int1CSave:Pointer;
- hod:Boolean;
- r:Registers;
- pole:Array[1..10000] of Boolean; {V p⌐ípadê, æe je adresá⌐, je zde
- True, pokud se jedná o soubor, je zde False. Pouæívá se pro
- rozhodování, zda daná adresá⌐ová poloæka p⌐edstavuje soubor çi
- podadresá⌐ (podle koncovky to nelze poznat). Je zde uvedeno pole,
- protoæe PC neví, co si uæivatel z menu vybere a aby nebylo nutné
- po vÿbêru zvolenou poloæku vyhledávat a zji¿ƒovat její atributy, tak
- se ukládá bit "Directory" (bit 4).}
- TajnyZnak:Char;
- OldTimer:Procedure;
- doba:Byte;
-
- { Procedura "Bod" odpovídá p⌐íkazu PutPixel v grafickém reæimu. Barvu bodu
- lze nastavit p⌐íkazem TextColor. Bod C=[x,y]. }
- procedure Bod(x,y:byte);
- begin
- gotoxy(x,y);write(chr(178));
- end;
-
- { Procedura "Usecka" odpovídá p⌐íkazu Line v grafickém reæimu. Barvu úseçky
- lze nastavit p⌐íkazem TextColor. ùseçka je vykreslena mezi bodem "A" a
- bodem "B", A=[xa,ya], B=[xb,yb]. }
- procedure Usecka(xa,ya,xb,yb:integer);
- var dx,dy,x,y:integer;k:real;
- begin dx:=abs(xb-xa);dy:=abs(yb-ya);
- if dx>dy then begin
- k:=(yb-ya)/(xb-xa);if xb>xa then for x:=xa to xb do
- begin y:=round(k*(x-xa)+ya);bod(x,y);end
- else for x:=xa downto xb do begin y:=round(k*(x-xa)+ya);bod(x,y);end;
- end;
- if dx<=dy then begin
- k:=(xb-xa)/(yb-ya);if yb>ya then for y:=ya to yb do
- begin x:=round(k*(y-ya)+xa);bod(x,y);end
- else for y:=ya downto yb do begin x:=round(k*(y-ya)+xa);bod(x,y);end;
- end;
- end;
-
- { Procedura "Zacatek_Usecky" nakreslí jako procedura "Bod" bod, navíc si
- "zapamatuje" sou⌐adnice bodu. Tato procedura odpovídá procedu⌐e MoveTo.
- Vstupem je bod se sou⌐adnicemi x,y, C=[x,y]. }
- procedure Zacatek_Usecky(x,y:byte);
- begin
- bod(x,y);xo:=x;yo:=y;
- end;
-
- { Procedure "Konec_Usecky" nakreslí jako procedure "Usecka" úseçku, která
- bude mít zaçátek v bodê, kam se naposledy kreslil bod a konec v zadaném
- bodê se sou⌐adnicemi x,y. Tato procedura odpovídá procedu⌐e LineTo.
- Vstupem je bod se sou⌐adnicemi x,y, C=[x,y]. }
- procedure Konec_Usecky(x,y:byte);
- begin
- usecka(xo,yo,x,y);xo:=x;yo:=y;
- end;
-
- { Funkce "Klavesa" çeká na stisk klávesy, pokud je zadané písmeno, p⌐evede
- malé písmeno na velké, které je vÿstupem funkce. }
- function Klavesa:char;
- var kl:char;
- begin
- kl:=ReadKey;kl:=UpCase(kl);Klavesa:=kl;
- end;
-
- { Funkce "AnoNe" nejprve vytiskne dotaz na obrazovku a çeká na uæivatelovu
- odpovêd (Ano nebo Ne). V p⌐ípadê, æe uæivatel odpoví Ano, je vÿstupem
- funkce True-log.1, pokud odpoví Ne, je vÿstupem funkce False-log.0 }
- function AnoNe(text:string):boolean;
- var pom:char;
- begin
- write(cs(text),' (ano/ne)?');
- repeat pom:=klavesa;until (pom='A') or (pom='N');
- if pom='A' then begin writeln('Ano');anone:=true;end
- else begin writeln('Ne');anone:=false;end;
- end;
-
- { Procedura "Znak" vytiskne znak s ASCII kódem na sou⌐adnicích X,Y.
- Proceduru lze samoz⌐ejmê nahradit p⌐íkazy:
- GotoXY(x,y);Write(Chr(ascii))
- ale v p⌐ípadê, æe tiskneme znak do pravého dolního rohu okna nastaveného
- procedurou Window, tak se obraz od⌐ádkuje, coæ nêkdy uæivateli
- nevyhovuje. }
- procedure Znak(x,y,ascii:byte);
- var adr:word;
- begin
- x:=x-1;y:=y-1;adr:=x+y*MaxX;obraz[adr].ascii:=ascii;
- end;
-
- { Procedure "Obdelnik" vykreslí v textovém reæimu rámeçek s jednoduchou,
- dvojitou nebo tlustou çarou. Vstupem jsou x-ová a y-ová sou⌐adnice levého
- horního rohu rámeçku, ¿í⌐ka, vÿ¿ka,typ çáry, ASCII kód znaku pozadí a
- typ obdélníku (viz dále).
-
- Hodnoty typu çáry:
- 1 = jednoduchá çára (celÿ rámeçek)
- 2 = dvojitá çára (celÿ rámeçek)
- 3 = svislé çáry jsou dvojité, vodorovné jsou jednoduché
- 4 = svislé çáry jsou jednoduché, vodorovné jsou dvojité
- jiná = tlustá (celÿ rámeçek)
-
- ASCII kód znaku pozadí: P⌐íklady:
- 32 = mezera
- 46 = teçka
-
- Typ obdélníku: "False" nebo "True"
- ┌───────────────────┐
- │ │
- │ Zadanÿ poçet ⌐ádek│ pro False:
- │ │ Obdelnik(...,False);
- │ │
- └───────────────────┘
- ┌───────────────────┐
- │ Vædy 1 ⌐ádek │
- ├───────────────────┤
- │ │
- │ Zadanÿ poçet ⌐ádek│ pro True:
- │ │ Obdelnik(...,True);
- │ │
- └───────────────────┘
- }
- procedure Obdelnik(x,y,sirka,vyska,ram,pozadi:byte;typ:boolean);
- var i,w:byte;
- begin
- a1:=219;a2:=219;a3:=219;a4:=219;a5:=219;a6:=219;a7:=219;a8:=219;
- if ram=1 then begin a1:=218;a2:=196;a3:=191;a4:=179;a5:=195;a6:=180;a7:=192;a8:=217;end;
- if ram=2 then begin a1:=201;a2:=205;a3:=187;a4:=186;a5:=204;a6:=185;a7:=200;a8:=188;end;
- if ram=3 then begin a1:=214;a2:=196;a3:=183;a4:=186;a5:=199;a6:=182;a7:=211;a8:=189;end;
- if ram=4 then begin a1:=213;a2:=205;a3:=184;a4:=179;a5:=198;a6:=181;a7:=212;a8:=190;end;
- gotoxy(x,y);write(chr(a1));for i:=1 to sirka do write(chr(a2));write(chr(a3));
- if typ=true then vyska:=vyska+2;
- for w:=1 to vyska do
- begin
- gotoxy(x,y+w);write(chr(a4));for i:=1 to sirka do write(chr(pozadi));
- write(chr(a4));
- end;
- if typ=true then
- begin
- gotoxy(x,y+2);write(chr(a5));for i:=1 to sirka do write(chr(a2));write(chr(a6));
- end;
- gotoxy(x,y+vyska+1);write(chr(a7));for i:=1 to sirka do write(chr(a2));write(chr(a8));
- end;
-
- { Procedura "Obdelnik2" je stejná jako procedura Obdelnik, rozdíl je ve
- zpûsobu kreslení obdelníku pomocí p⌐ímého ukládání znakû do videopamêti. Je
- moæné nastavit barvu pozadí, kde je rámeçek (TextBackGround(barva)).
- Vnêj¿ek obdélníku bude mít standartní nastavenou barvu. }
- procedure Obdelnik2(x,y,sirka,vyska,ram,pozadi:byte;typ:boolean);
- var i,w:byte;
- begin
- if typ=false then window(x,y,x+sirka+1,y+vyska+1)
- else window(x,y,x+sirka+1,y+vyska+3);
- clrscr;
- a1:=219;a2:=219;a3:=219;a4:=219;a5:=219;a6:=219;a7:=219;a8:=219;
- if ram=1 then begin a1:=218;a2:=196;a3:=191;a4:=179;a5:=195;a6:=180;a7:=192;a8:=217;end;
- if ram=2 then begin a1:=201;a2:=205;a3:=187;a4:=186;a5:=204;a6:=185;a7:=200;a8:=188;end;
- if ram=3 then begin a1:=214;a2:=196;a3:=183;a4:=186;a5:=199;a6:=182;a7:=211;a8:=189;end;
- if ram=4 then begin a1:=213;a2:=205;a3:=184;a4:=179;a5:=198;a6:=181;a7:=212;a8:=190;end;
- if typ=true then vyska:=vyska+2;
- Znak(x,y,a1);for i:=1 to sirka do Znak(x+i,y,a2);Znak(x+sirka+1,y,a3);
- for w:=1 to vyska do begin Znak(x,y+w,a4);for i:=1 to sirka do Znak(x+i,y+w,pozadi);Znak(x+sirka+1,y+w,a4);end;
- Znak(x,y+vyska+1,a7);for i:=1 to sirka do Znak(x+i,y+vyska+1,a2);Znak(x+sirka+1,y+vyska+1,a8);
- if typ=true then begin Znak(x,y+2,a5);for i:=1 to sirka do Znak(x+i,y+2,a2);Znak(x+sirka+1,y+2,a6);vyska:=vyska+2;end;
- end;
-
- { Procedura "Kurzor" zmêní pozadí znaku a tím vznikne dojem, æe na znaku je
- kurzor. Vstupem jsou x-ová a y-ová sou⌐adnice kurzoru a ¿í⌐ka kurzoru. }
- procedure Kurzor(x,y,delka:byte);
- var adr:integer;
- begin adr:=(x-1)+(y-1)*MaxX;
- for i:=0 to delka-1 do
- if obraz[adr+i].barva=barva then obraz[adr+i].barva:=bar else obraz[adr+i].barva:=barva;
- end;
-
- { Funkce "Posun" pohybuje kurzorem. }
- function Posun(xmin,xmax,ymin,ymax:byte;var x,y:byte):byte;
- label cek,opakuj;
- var kl,kl2:byte;
- begin
- if xmin<1 then xmin:=1;
- if ymin<1 then ymin:=1;
- if xmax>MaxX then xmax:=MaxX;
- if ymax>MaxY then ymax:=MaxY;
- if (x<xmin) or (x>xmax) then x:=xmin;
- if (y<ymin) or (y>ymax) then y:=ymin;
- if (xmin>xmax) or (ymin>ymax) then begin Posun:=0;exit;end;
- opakuj:
- Kurzor(x,y,1);kl:=ord(ReadKey);
- if kl=0 then begin
- kl2:=ord(ReadKey);
- if (kl2=77) and (x<xmax) then begin Kurzor(x,y,1);x:=x+1;goto opakuj;end;
- if (kl2=75) and (x>xmin) then begin Kurzor(x,y,1);x:=x-1;goto opakuj;end;
- if (kl2=72) and (y>ymin) then begin Kurzor(x,y,1);y:=y-1;goto opakuj;end;
- if (kl2=80) and (y<ymax) then begin Kurzor(x,y,1);y:=y+1;goto opakuj;end;
- end;
- Kurzor(x,y,1);Posun:=kl;
- end;
-
- { Procedure "Nastav" uloæí barvy znaku a pozadí, aby po zru¿ení kurzoru,
- kurzor opravdu zmizel. Vybarví pozadí celé obrazovky na zeleno. }
- procedure Nastav;
- begin
- case LastMode of
- 0..1: begin MaxX:=40;MaxY:=25;end; {text 40x25}
- 2..3: begin MaxX:=80;MaxY:=25;end; {text 80x25}
- 256: begin MaxX:=40;MaxY:=50;end; {text 40x50}
- else begin Writeln(cs('Obrazovka p⌐epnuta do neznámého módu.'));end;
- end;
- Window(1,1,80,25);TextBackGround(Green);TextColor(Yellow);
- ClrScr;barva:=obraz[1].barva;GotoXY(1,1);
- end;
-
- { Procedure "P1" nakreslí jednoduchou vodorovnou çáru v textovém reæimu,
- vstup je ¿í⌐ka ve znacích. }
- procedure P1(sirka:integer);
- var i:byte;
- begin
- for i:=1 to sirka do write(chr(196));
- end;
-
- { --------------------------------------------------------------------------
- Následují procedury s okénky jako v Turbo-Vision. Pro zaçáteçníky je to
- jednodu¿¿í, neæ se uçit ne p⌐íli¿ jednoduché Turbo-Vision.
- Jedná se o procedury: Zacatek,Radek,Radek2,Linka,Menu a Menu2.
-
- Procedura "Zacatek" definuje zaçátek nového okénka, v p⌐ípadê, æe chcete,
- aby okénko mêlo nadpis, zadejte ho mezi apostrofy: Zacatek('Nápis okénka').
- Pokud nechcete mít nápis, zadejte Zacatek(''). Je nutné zdûraznit, æe je
- nutné, aby byla procedura pouæita p⌐ed kaædÿm novÿm okénkem, protoæe nuluje
- své promênné (vlastní ⌐etêzce a jejich poçet). }
- procedure Zacatek(nadpis:string);
- begin
- pocet:=0;text[0]:=cs(nadpis);
- for i:=1 to max0 do begin text[i]:='';polozky[i]:=true;cara[i]:=false;end;
- end;
-
- { Procedure "Radek" definuje jednotlivé volby (⌐ádky) do okénka s poloækami.
- Vstupem je ⌐etêzec jednotlivé poloæky okénka, zadává se do apostrofû:
- Radek('1. poloæka'). }
- procedure Radek(pom:string);
- begin
- if pocet>=max0 then exit;
- pocet:=pocet+1;text[pocet]:=cs(pom);polozky[pocet]:=true;cara[pocet]:=false;
- end;
-
- { Procedura "Radek2" definuje jednotlivé volby (⌐ádky) do okénka s poloækami.
- Vstupem je ⌐etêzec jednotlivé poloæky okénka, zadává se do apostrofû:
- Radek('1. poloæka'), dal¿í parametr je, zda-li poloæka bude aktivní - tzn.
- jestli ji lze aktivovat stiskem klávesy Enter. P⌐íkladem neativních poloæek
- je v Turbo-Pascalu menu Edit, poloæky Cut, Copy, Paste, které fungují pouze
- v p⌐ípadê oznaçeného bloku textu v editoru. V p⌐ípadê, æe je vstupní pro-
- mênná Polozka=True, potom je aktivní, jinak pasivní. }
- procedure Radek2(pom:string;polozka:boolean);
- begin
- if pocet>=max0 then exit;
- pocet:=pocet+1;text[pocet]:=cs(pom);polozky[pocet]:=polozka;cara[pocet]:=false;
- end;
-
- { Procedura "Linka" vloæí do okénka vodorovnÿ ⌐ádek, kterÿ p⌐eskakuje kurzor.
- Slouæí pro oddêlení poloæek rûzného vÿznamu v jednom menu. P⌐íklad ⌐ádku
- je v Borland-Pascalu 7.0 v menu Edit ⌐ádky mezi Redo a Cut; mezi Clear a
- Show clipboard. Procedura nemá æádnÿ vstup. }
- procedure Linka;
- begin
- if (pocet<1) or (pocet>=max0) then exit;
- if cara[pocet]=true then exit;
- Radek2('',false);cara[pocet]:=true;
- end;
-
- { Funkce "Menu" vykreslí rámeçek okna, jednotlivé poloæky, v menu je pak
- moæné se pohybovat kurzorem pomocí kláves se ¿ipkami a zvolenou poloæku
- vybrat klávesou Enter. Vstupy funkce jsou sou⌐adnice levého horního rohu
- menu X a Y, druh çáry rámeçku (viz procedura "Obdelnik"), typ kurzoru:
- True =log.1........kurzor p⌐es celé menu
- False=log.0........kurzor je pouze p⌐es název poloæky
- Vÿstup funkce je çíslo poloæky:
- poloæka 1. (1. pouæití "Radek" po "Zacatek") má çíslo 1
- poloæka 2. (2. pouæití "Radek" po "Zacatek") má çíslo 1
- ... atd. }
- function Menu(x,y,ram:byte;kur:boolean):byte;
- label opakuj;
- var i,del,l,max,w:byte;
- begin
- if (WindMin<>0) or (WindMax<>6223) then Nastav;
- textcolor(white);if cara[pocet]=true then pocet:=pocet-1;
- max:=1;l:=1;for i:=0 to pocet do if length(text[i])>max then max:=length(text[i]);
- if length(text[0])>0 then i:=i+2;
- if (x=0) or (y=0) then begin x:=round((80-(max+2))/2);y:=round((25-(i+2))/2);end;
- if length(text[0])>0 then i:=i-2;
- if length(text[0])=0 then obdelnik(x,y,max,i,ram,32,false)
- else begin obdelnik(x,y,max,i,ram,32,true);gotoxy(x+1,y+1);write(text[0]);y:=y+2;end;
- barva:=obraz[(x-1)+(y-1)*160+1].barva;
- for i:=1 to pocet do
- begin
- if cara[i]=true then
- begin
- TextColor(White);GotoXY(x,y+i);Write(chr(a5));for w:=1 to max do Write(chr(a2));Write(chr(a6));
- end else begin
- if polozky[i]=true then textcolor(white) else textcolor(black);
- gotoxy(x+1,y+i);write(text[i]);for w:=length(text[i])+1 to max do write(' ');
- end;
- end;
- opakuj:
- if kur=false then del:=length(text[l]) else del:=max;
- barva:=obraz[x+(y+l-1)*80+1].barva;Kurzor(x+1,y+l,del);
- repeat
- w:=ord(readkey);
- if (w=72) and (l<=1) then begin Kurzor(x+1,y+l,del);l:=i;goto opakuj;end;
- if w=72 then
- begin
- Kurzor(x+1,y+l,del);Dec(l);
- if cara[l]=true then Dec(l);
- goto opakuj;
- end;
- if (w=80) and (l>=i) then begin Kurzor(x+1,y+l,del);l:=1;goto opakuj;end;
- if w=80 then
- begin
- Kurzor(x+1,y+l,del);Inc(l);
- if cara[l]=true then Inc(l);
- goto opakuj;
- end;
- until (w=13) and (polozky[l]=true);
- Menu:=l;
- end;
-
- { Funkce "Menu2" je stejná jako funkce "Menu", rozdíl je v hnêdém pozadí
- vnit⌐ku okénka, odli¿ném zpûsobu kreslení rámeçku (viz procedura
- "Obdelnik2"). Navíc jsou na obrazovku vypisované názvzy okének a poloæek
- do dialogového okna, které lze otev⌐ít procedurou "Dialogove_Okno". }
- function Menu2(x,y,ram:byte;kur:boolean):byte;
- label opakuj;
- var i,del,l,max,pa,px,py,y0,w:byte;
- wmin,wmax:word;
- begin
- if (WindMin<>5377) or (WindMax<>5966) then Dialogove_Okno;
- px:=WhereX;py:=WhereY;wmin:=WindMin;wmax:=WindMax;pa:=TextAttr;
- clrscr;textcolor(white);if cara[pocet]=true then pocet:=pocet-1;
- textbackground(brown);
- max:=1;l:=1;for i:=0 to pocet do if length(text[i])>max then max:=length(text[i]);
- if length(text[0])>0 then i:=i+2;
- if (x=0) or (y=0) then begin x:=round((80-(max+2))/2);y:=round((25-(i+2))/2);end;
- if length(text[0])>0 then i:=i-2;
- if length(text[0])=0 then begin obdelnik2(x,y,max,i,ram,32,false);y0:=1;end
- else begin obdelnik2(x,y,max,i,ram,32,true);gotoxy(2,2);write(text[0]);y:=y+2;y0:=3;end;
- barva:=obraz[(x-1)+(y-1)*80+1].barva;
- for i:=1 to pocet do
- begin
- if cara[i]=true then
- begin
- TextColor(White);GotoXY(1,y0+i);Write(chr(a5));for w:=1 to max do Write(chr(a2));Write(chr(a6));
- end else begin
- if polozky[i]=true then textcolor(white) else textcolor(black);
- gotoxy(2,y0+i);write(text[i]);for w:=length(text[i])+1 to max do write(' ');
- end;
- end;
- textcolor(white);textbackground(pa div 16);textcolor(pa mod 16);
- window((wmin mod 256)+1,(wmin div 256)+1,(wmax mod 256)+1,(wmax div 256)+1);
- gotoxy(1,1);if length(text[0])>0 then write(text[0],' ');
- writeln(cs('Klávesami se ¿ipkami vyberte çinnost, pak stisknête ENTER.'));
- opakuj:
- GotoXY(1,2);DelLine;InsLine;Writeln(cs('Çinnost: '+text[l]));
- if kur=False then del:=length(text[l]) else del:=max;
- barva:=obraz[x+(y+l-1)*80+1].barva;Kurzor(x+1,y+l,del);
- repeat
- w:=ord(readkey);
- if (w=72) and (l<=1) then begin Kurzor(x+1,y+l,del);l:=i;goto opakuj;end;
- if w=72 then
- begin
- Kurzor(x+1,y+l,del);Dec(l);
- if cara[l]=true then Dec(l);
- goto opakuj;
- end;
- if (w=80) and (l>=i) then begin Kurzor(x+1,y+l,del);l:=1;goto opakuj;end;
- if w=80 then
- begin
- Kurzor(x+1,y+l,del);Inc(l);
- if cara[l]=true then Inc(l);
- goto opakuj;
- end;
- until (w=13) and (polozky[l]=true);
- Menu2:=l;
- end;
-
- { Vÿstupem funkce "Zjisti" je název poloæky v menu: "Menu" nebo "Menu2".
- Promênná "pol" udává çíslo poloæky v menu. V p⌐ípadê pol=0 vrací funkce
- nadpis tabulky, pokud nadpis nebyl zadán, pak prázdnÿ ⌐etêzec. }
- function Zjisti(pol:byte):string;
- begin
- if pol>pocet then begin Nastav;Writeln(cs('Tato poloæka nebyla je¿tê zadána !!!'));Readln;Halt(1);end;
- Zjisti:=text[pol];
- end;
-
- { Funkce "AnoNe2" je stejná jako funkce "AnoNe", av¿ak uæivatel má moænost
- odpovêdêt pomocí menu. }
- function AnoNe2(text:string):boolean;
- var w:byte;
- begin
- w:=length(text);
- if w<3 then text:=cs('Souhlasíte?');
- Zacatek(text);Radek('Ne');Radek('Ano');w:=Menu3(0,0,1,true);
- if w=1 then AnoNe2:=False else AnoNe2:=True;
- end;
-
- { Po pouæití procedury "Zapni_Zvuk" bude u procedur Sound1 a Sound2 sly¿et
- zvuk. }
- procedure Zapni_Zvuk;
- begin
- Zvuk:=True;
- end;
-
- { Po pouæití procedury "Vypni_Zvuk" nebude u procedur Sound1 a Sound2 sly¿et
- zvuk, pouze bude dané zpoædêní. }
- procedure Vypni_Zvuk;
- begin
- Zvuk:=False;
- end;
-
- { Procedura "Sound1" pípne frekvencí (f), poté çeká (d1) milisekund,
- poté pípnutí p⌐eru¿í a çeká (d2) milisekund. Pípnutí se opakuje celkem
- pêtkrát. }
- procedure Sound1(f,d1,d2:word);
- var i:byte;
- begin
- for i:=1 to 5 do begin
- if zvuk=true then sound(f);delay(d1);nosound;delay(d2);
- end;
- end;
-
- { Procedura "Sound2" zvy¿uje (sniæuje) frekvenci zvuku od (f1) do (f2), çímæ
- dosáhne houkaçky. Je-li (f1)<(f2), tak se frekvence zvy¿uje, jinak se
- sniæuje. Mezi zvÿ¿ením frekvence o 1 Hz se çeká (d) ms. }
- procedure Sound2(f1,f2,d:word);
- var i:word;
- begin
- if f1<f2 then for i:=f1 to f2 do begin if zvuk=true then sound(i);delay(d);end;
- if f1>f2 then for i:=f1 downto f2 do begin if zvuk=true then sound(i);delay(d);end;
- nosound;
- end;
-
- { Procedura "Proc1" vytiskne zadanÿ text v apostrofech a provede houkaçku. }
- procedure Proc1(text:string);
- begin
- writeln(cs(text));sound2(50,200,2);
- end;
-
- { Procedura "Proc2" vytiskne zadanÿ text a 5x pípne. }
- procedure Proc2(text:string);
- begin
- writeln(cs(text));sound1(50,300,100);
- end;
-
- { Funkce "Proc3" uloæí do 1 vÿstupního ⌐etêzce:
- 1. ⌐etêzec "retezec1", çíslo "cislo" a 2.⌐etêzec "retezec2". Pouæití
- nap⌐íklad pro OutText v grafice, aby se nemusel p⌐íkaz OutText nêkolikrát
- opakovat. }
- function Proc3(retezec1:string;cislo:real;retezec2:string):string;
- var ret1,ret2:string;
- begin
- ret1:=cs(retezec1);System.Str(cislo:3:0,ret2);
- system.insert(ret2,ret1,length(ret1)+1);
- system.insert(retezec2,ret1,length(ret1)+1);proc3:=ret1;
- end;
-
- { Procedura "Cekej" çeká na stisk libovolné klávesy. }
- procedure Cekej;
- begin
- i:=ord(klavesa);if i=0 then i:=ord(klavesa);
- end;
-
- { Procedura "Dialogove_Okno" otev⌐e dialogové okno, které je vhodné p⌐i
- pouæívání funkcí "Menu2" a "AnoNe2". }
- procedure Dialogove_Okno;
- begin
- Obdelnik2(1,21,78,3,1,32,false);TextBackGround(red);Window(2,22,79,24);ClrScr;GotoXY(1,1);
- end;
-
-
-
- { Procedury a funkce pro pouæívání hodin, které se pí¿í na obrazovku
- pomocí p⌐eru¿ení, které mikroprocesor pravidelnê vykonává a provádí
- tudíæ proceduru "TimerHandler".
- !!! Dûleæité upozornêní !!! Hodiny je nutné vypnout bêhem operací
- se za⌐ízeními (harddisk, disketová jednotka apod.), jinak se systém
- zasekne a bude nutné provést RESET. Hodiny jsou udêlané pouze pro
- textovÿ reæim !!! }
-
- { Tato procedura "TimerHandler" je automaticky volaná jako p⌐eru¿ení
- systémem, kdyæ jsou hodiny zapnuté. }
- {$F+,S-,W-}
- procedure TimerHandler; interrupt;
- var hod,min,sek,sek100,den,den_v_tydnu,mes,rok,wmax,wmin:word;
- x,y:byte;
- begin
- asm
- STI
- end;
- wmin:=WindMin;wmax:=WindMax;x:=WhereX;y:=WhereY;Window(1,1,80,25);
- GetDate(rok,mes,den,den_v_tydnu);GetTime(hod,min,sek,sek100);GotoXY(xh,yh);Write('Ças: ');
- Write(hod:2,':',min:2,':',sek:2,' (',sek100:2,') Datum: ',den:2,'.',mes:2,'.',rok,
- ' Dnes je ',cs(DoplnNa(dny[den_v_tydnu],7)),'.');
- Window((wmin mod 256)+1,(wmin div 256)+1,(wmax mod 256)+1,(wmax div 256)+1);GotoXY(x,y);
- { BorderColor(Random($20));}
- OldTimer;
- asm
- CLI
- end;
- end;
- {$F-,S+}
-
- { Funkce "Hodiny" vrací True v p⌐ípadê, æe hodiny jdou a False, v p⌐ípadê,
- æe hodiny nejdou. (Hodiny DOSu a CMOS samoz⌐ejmê jdou po⌐ád.) }
- function Hodiny:boolean;
- begin
- Hodiny:=hod;
- end;
-
- { Procedura "Zapni_Hodiny" zapne tisknutí çasu a datumu na obrazovku,
- poçátek je v sou⌐adnicích "x","y" v textovém reæimu. }
- procedure Zapni_Hodiny(x,y:byte);
- begin
- if hod=True then exit;
- xh:=x;yh:=y;hod:=True;
- GetIntVec($1C,@OldTimer);GetIntVec($1C,Int1CSave);
- SetIntVec($1C,Addr(TimerHandler));
- end;
-
- { Procedura "Vypni_Hodiny" vypne tisknutí hodin (hodiny na obrazovce
- zûstanou s çasem, kdy byla tato procedura pouæita). Procedura p⌐esmêruje
- vektor p⌐eru¿ení na standartní hodnotu. }
- procedure Vypni_Hodiny;
- begin
- if hod=False then exit;
- SetIntVec($01C,Int1CSave);hod:=False;
- GotoXY(xh,yh);DelLine;GotoXY(xh,yh);InsLine;
- end;
-
- { Funkce "Soubor_Existuje" má vÿstup True v p⌐ípadê, æe soubor "jmeno"
- existuje, jinak má funkce vÿstup False. }
- function Soubor_Existuje(jmeno:string):boolean;
- var f:file;a:integer;
- begin
- System.Assign(F,jmeno); {$I-} System.Reset(F); {$I+}
- a:=IOResult;Soubor_Existuje:=(a=0);
- {$I-}System.Close(F);{$I+};a:=IOResult;
- end;
-
- { Funkce "Menu3" je stejná jako funkce "Menu2", narozdíl je umoænêñ vÿbêr
- poloæek menu i my¿í. }
- function Menu3(x,y,ram:byte;kur:boolean):byte;
- label opakuj,konec;
- var i,del,l,max,pa,px,py,y0,w:byte;
- tlacitka,xm,ym,wmin,wmax:word;
- pom:Boolean;
- begin
- if (WindMin<>5377) or (WindMax<>5966) then Dialogove_Okno;
- px:=WhereX;py:=WhereY;wmin:=WindMin;wmax:=WindMax;pa:=TextAttr;
- clrscr;textcolor(white);if cara[pocet]=true then pocet:=pocet-1;textbackground(brown);
- max:=1;l:=1;for i:=0 to pocet do if length(text[i])>max then max:=length(text[i]);
- if length(text[0])>0 then i:=i+2;
- if (x=0) or (y=0) then begin x:=round((80-(max+2))/2);y:=round((25-(i+2))/2);end;
- if length(text[0])>0 then i:=i-2;
- if length(text[0])=0 then begin Obdelnik2(x,y,max,i,ram,32,false);y0:=1;end
- else begin Obdelnik2(x,y,max,i,ram,32,true);gotoxy(2,2);write(text[0]);y:=y+2;y0:=3;end;
- barva:=obraz[(x-1)+(y-1)*80+1].barva;
- for i:=1 to pocet do begin
- if cara[i]=true then begin
- TextColor(White);GotoXY(1,y0+i);Write(chr(a5));for w:=1 to max do Write(chr(a2));Write(chr(a6));
- end else begin
- if polozky[i]=true then textcolor(white) else textcolor(black);
- gotoxy(2,y0+i);write(text[i]);for w:=length(text[i])+1 to max do write(' ');
- end;
- end;
- textcolor(white);textbackground(pa div 16);textcolor(pa mod 16);
- window((wmin mod 256)+1,(wmin div 256)+1,(wmax mod 256)+1,(wmax div 256)+1);
- gotoxy(1,1);if length(text[0])>0 then write(text[0],' ');
- writeln(cs('Klávesami se ¿ipkami vyberte çinnost, pak stisknête ENTER.'));
- r.ax:=1;Intr(Mouse,r);
- opakuj:
- GotoXY(1,2);DelLine;InsLine;Writeln(cs('Çinnost: '+text[l]));
- if kur=False then del:=length(text[l]) else del:=max;
- barva:=obraz[x+(y+l-1)*MaxX+1].barva;kurzor2(x+1,y+l,del);
- r.ax:=1;Intr(Mouse,r);pom:=False;
- repeat
- repeat
- r.ax:=3;Intr(Mouse,r);xm:=r.cx div 8;ym:=r.dx div 8;tlacitka:=r.bx;
- if (tlacitka=0) and (pom) then goto konec;
- if (tlacitka>0) and (xm>=x) and (xm<x+max) and (ym>=y) and (ym<y+pocet) then
- begin
- if polozky[ym-y+1]=True then
- begin pom:=True;
- if tlacitka>0 then
- begin
- if (l<>ym-y+1) then
- begin
- Kurzor2(x+1,y+l,del);l:=ym-y+1;r.ax:=2;Intr(Mouse,r);
- GotoXY(1,2);DelLine;InsLine;Writeln(cs('Çinnost: '+text[l]));
- r.ax:=1;Intr(Mouse,r);
- Kurzor2(x+1,y+l,del);pom:=True;
- end;
- end;
- end;
- end else pom:=False;
- until Keypressed;
- w:=ord(readkey);
- if (w=72) and (l<=1) then begin kurzor2(x+1,y+l,del);l:=i;goto opakuj;end;
- if w=72 then
- begin
- kurzor2(x+1,y+l,del);Dec(l);
- if cara[l]=true then Dec(l);
- goto opakuj;
- end;
- if (w=80) and (l>=i) then begin kurzor2(x+1,y+l,del);l:=1;goto opakuj;end;
- if w=80 then
- begin
- kurzor2(x+1,y+l,del);Inc(l);
- if cara[l]=true then Inc(l);
- goto opakuj;
- end;
- until (w=13) and (polozky[l]=true);
- konec: r.ax:=2;Intr(Mouse,r);Menu3:=l;
- end;
-
- { Funkce "Posun2" pohybuje kurzorem. }
- function Posun2(xmin,ymin,xmax,ymax,sirka,krokx,kroky:byte;var x,y:byte):byte;
- label opakuj;
- var kl,kl2:Byte;
- begin
- if xmin<1 then xmin:=1;
- if ymin<1 then ymin:=1;
- if xmax>MaxX then xmax:=MaxX;
- if ymax>MaxY then ymax:=MaxY;
- if (x<xmin) or (x>xmax) then x:=xmin;
- if (y<ymin) or (y>ymax) then y:=ymin;
- if (xmin>xmax) or (ymin>ymax) then begin Posun2:=0;Exit;end;
- opakuj:
- Kurzor(x,y,sirka);kl:=Ord(ReadKey);
- if kl=0 then begin
- kl2:=Ord(ReadKey);posledni:=kl2;
- if (kl2=77) and ((x+krokx)<=xmax) then if uziv1 then begin Kurzor(x,y,sirka);x:=x+krokx;Kurzor(x,y,sirka);end;
- if (kl2=75) and ((x-krokx)>=xmin) then if uziv2 then begin Kurzor(x,y,sirka);x:=x-krokx;Kurzor(x,y,sirka);end;
- if (kl2=72) and ((y-kroky)>=ymin) then if uziv3 then begin Kurzor(x,y,sirka);y:=y-kroky;Kurzor(x,y,sirka);end;
- if (kl2=80) and ((y+kroky)<=ymax) then if uziv4 then begin Kurzor(x,y,sirka);y:=y+kroky;Kurzor(x,y,sirka);end;
- end;
- Kurzor(x,y,sirka);Posun2:=kl;
- end;
-
- procedure Cekej2;
- label Konec;
- var tlacitka:Word;
- x,y:Byte;
- begin
- r.ax:=1;Intr(Mouse,r);
- x:=WhereX;y:=WhereY;
- if doba=0 then
- begin {Nekoneçné çekání}
- repeat
- r.ax:=3;Intr(Mouse,r);tlacitka:=r.bx;
- if (tlacitka>0) then
- begin
- repeat
- r.ax:=3;Intr(Mouse,r);tlacitka:=r.bx;
- until tlacitka=0;
- goto Konec;
- end;
- until Keypressed;
- Cekej;
- end {Nekoneçné çekání}
- else
- begin {Çekání "doba" sekund}
- for i:=0 to doba*10 do
- begin
- GotoXY(x,y);Write(Str(1+(doba*10-i) div 10):3);
- r.ax:=3;Intr(Mouse,r);tlacitka:=r.bx;
- if (tlacitka>0) then {Stisknuto nêjaké tlaçítko na my¿i}
- begin
- repeat
- r.ax:=3;Intr(Mouse,r);tlacitka:=r.bx;
- until tlacitka=0; {Dokud tlaçítko nepustím}
- goto Konec;
- end;
- if KeyPressed then begin Cekej;goto Konec;end;
- Delay(100);
- end;
- end; {Çekání "doba" sekund}
- Konec: r.ax:=2;Intr(Mouse,r);GotoXY(x,y);ClrEol;
- end;
-
- { Procedura "Kurzor2" je podobná procedu⌐e "Kurzor", rozdíl je pouze v tom
- æe pro zobrazení a smazání kurzoru je pouæita funkce XOR. }
- procedure Kurzor2;
- var adr:integer;
- begin r.ax:=2;Intr(Mouse,r);adr:=(x-1)+(y-1)*MaxX;
- for i:=0 to delka-1 do
- obraz[adr+i].barva:=obraz[adr+i].barva XOR 16;
- r.ax:=1;Intr(Mouse,r);
- end;
-
- { Vypí¿e zprávu "Stiskni libovolnou klávesu..." a potom
- çeká na stisk klávesy. }
- procedure Cekani;
- var x,y:Byte;
- begin
- x:=WhereX;y:=WhereY;
- Write(cs('Stisknête libovolnou klávesu nebo tlaçítko na my¿i...'));
- Cekej2;GotoXY(x,y);ClrEol;
- end;
-
- procedure Cekani0;
- begin
- Writeln;Cekani;
- end;
-
- { Funkce "Menu3" je stejná jako funkce "Menu2", narozdíl je umoænêñ vÿbêr
- poloæek menu i my¿í.
- Funkce "Menu4" je¿tê navíc umoæñuje jakési rolování menu v p⌐ípadê, æe se
- v¿echny poloæky na obrazovku nevejdou. }
- function Menu4(x,y,ram:byte;kur:boolean):byte;
- label opakuj,prekresli,preskok,konec;
- var i,del,l,max,pa,px,py,y0,w:Byte;
- tlacitka,xm,ym,wmin,wmax:Word;
- pom:Boolean;
- radku:Byte; {Poçet ⌐ádkû, které zabírá menu na obrazovce:}
- od:Byte; {Çíslo první poloæky zobrazené v menu sníæené o 1, standartnê 0,
- av¿ak p⌐i pohybu dolû p⌐i rolování se zvy¿uje a p⌐i pohybu nahoru p⌐i
- rolování se sniæuje.}
- pomoc:Boolean; {Zda bylo provedeno rolování a proto potom bude nutno
- p⌐epsat poloæky menu:}
- begin
- if (WindMin<>5377) or (WindMax<>5966) then Dialogove_Okno; {Získání parametrû nastavenÿch p⌐íkazem Window,
- umoæñuje zjistit, zda jiæ bylo pouæito Dialogove_Okno, jinak se vykreslí.}
- px:=WhereX;py:=WhereY;wmin:=WindMin;wmax:=WindMax;pa:=TextAttr; {Uloæení pûvodních hodnot.}
-
- od:=0;
-
- if cara[pocet]=True then Dec(pocet);
- max:=1;l:=1;for i:=0 to pocet do if Length(text[i])>max then max:=Length(text[i]);
- if Length(text[0])>0 then Inc(i,2); {V p⌐ípadê, æe je uveden nêjakÿ nadpis menu:}
- if i>10 then radku:=10 else radku:=i;
- if (x=0) or (y=0) then begin x:=Round((80-(max+2))/2);y:=Round((25-(radku+2))/2);end; {Automatická pozice menu:}
- if Length(text[0])>0 then Dec(radku,2); {V p⌐ípadê, æe je uveden nêjakÿ nadpis menu:}
-
- Prekresli: r.ax:=2;Intr(Mouse,r);
- ClrScr;TextColor(White);TextBackGround(Brown);
- barva:=obraz[(x-1)+(y-1)*80+1].barva;
-
- if Length(text[0])=0 then begin Obdelnik2(x,y,max,radku,ram,32,False);y0:=1;end
- else begin Obdelnik2(x,y,max,radku,ram,32,True);Gotoxy(2,2);Write(text[0]);Inc(y,2);y0:=3;end;
- for i:=1 to radku do begin
- if cara[od+i]=True then begin
- TextColor(White);GotoXY(1,y0+i);Write(chr(a5));for w:=1 to max do Write(chr(a2));Write(chr(a6));
- end else begin
- if polozky[od+i] then TextColor(White) else TextColor(Black);
- GotoXY(2,y0+i);Write(text[od+i]);for w:=Length(text[od+i])+1 to max do Write(' ');
- end;
- end;
- TextBackGround(pa div 16);TextColor(pa mod 16);
- Window((wmin mod 256)+1,(wmin div 256)+1,(wmax mod 256)+1,(wmax div 256)+1);
- GotoXY(1,1);if Length(text[0])>0 then Write(text[0],' ');
- Writeln(cs('Klávesami se ¿ipkami vyberte çinnost, pak stisknête ENTER.'));
- r.ax:=1;Intr(Mouse,r);
-
- opakuj:
- GotoXY(1,2);DelLine;InsLine;Writeln(cs('Çinnost: '+text[od+l]));
- if kur=False then del:=Length(text[l]) else del:=max;
- barva:=obraz[x+(y+l-1)*80+1].barva;Kurzor2(x+1,y+l,del);
- Znak(x+max+1,y+radku,25);Znak(x+max+1,y+1,24);
- r.ax:=1;Intr(Mouse,r);pom:=False;
- repeat
- repeat
- r.ax:=3;Intr(Mouse,r);xm:=r.cx div 8;ym:=r.dx div 8;tlacitka:=r.bx;
- if (tlacitka=0) and pom then goto konec;
- if (tlacitka>0) and (xm>=x) and (xm<x+max) and (ym>=y) and (ym<y+radku) then
- begin
- if polozky[ym-y+1]=True then
- begin pom:=True;
- if tlacitka>0 then
- begin
- if l<>ym-y+1 then
- begin
- Kurzor2(x+1,y+l,del);l:=ym-y+1;r.ax:=2;Intr(Mouse,r);
-
- { Pozor p⌐i pohybu kurzorem my¿í p⌐i parametru kur=False se nemêní velikost
- kurzoru p⌐i rûznê dlouhÿch poloækách. Vylep¿it !!!}
-
- { if kur=False then del:=Length(text[l]) else del:=max;}
- GotoXY(1,2);DelLine;InsLine;Writeln(cs('Çinnost: '+text[od+l]));
- r.ax:=1;Intr(Mouse,r);
- Kurzor2(x+1,y+l,del);pom:=True;
- end;
- end;
- end;
- end else pom:=False;
- if (tlacitka>0) and (xm=x+max) and (ym=y) then begin w:=72;Delay(100);goto preskok;end;
- if (tlacitka>0) and (xm=x+max) and (ym=y+radku-1) then begin w:=80;Delay(100);goto preskok;end;
- until KeyPressed;
- w:=Ord(Readkey);
- preskok: Znak(x+max+1,y+radku,25);Znak(x+max+1,y+1,24);
-
- if (w=72) and (l+od<=1) then {Pohyb kurzorem nahoru:}
- begin
- if Length(text[0])>0 then Dec(y,2);
- Kurzor2(x+1,y+l,del);l:=radku;od:=pocet-radku;goto prekresli;
- end;
- if w=72 then
- begin
- Kurzor2(x+1,y+l,del);Dec(l);pomoc:=False;
- while l<1 do begin Inc(l);Dec(od);pomoc:=True;end;
- if cara[l]=True then Dec(l);
-
- while l<1 do begin Inc(l);Dec(od);pomoc:=True;end;
- if pomoc then
- begin
- if Length(text[0])>0 then Dec(y,2);
- goto Prekresli;
- end else goto opakuj;
- goto opakuj;
- end;
-
- if (w=80) and (l+od>=pocet) then {Pohyb kurzorem dolû:}
- begin
- if Length(text[0])>0 then Dec(y,2);
- Kurzor2(x+1,y+l,del);l:=1;od:=0;goto prekresli;
- end;
- if w=80 then {Pohyb kurzorem dolû:}
- begin
- Kurzor2(x+1,y+l,del);Inc(l);pomoc:=False;
- while l>radku do begin Dec(l);Inc(od);pomoc:=True;end;
- if cara[l] then Inc(l);
-
- while l>radku do begin Dec(l);Inc(od);pomoc:=True;end;
- if pomoc then
- begin
- if Length(text[0])>0 then Dec(y,2);
- goto Prekresli;
- end else goto opakuj;
- end;
- until (w=13) and (polozky[l]=true);
- konec: r.ax:=2;Intr(Mouse,r);Menu4:=od+l;
- end;
-
- {Vrací hodnotu 2 umocnênou na "mocnina".}
- function Dve(mocnina:Byte):Longint;
- var i:Byte;p:Longint;
- begin
- if mocnina in [0..30] then
- begin
- p:=1;for i:=1 to mocnina do p:=p*2;
- end;
- Dve:=p;
- end;
-
- {Vrací hodnotu "i"-tého bitu v çísle "hodnota".
- Bity: ... 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
- Çíslo: ... X X X X X X X X X X X X X X X X}
- function TestBitu(hodnota:Longint;i:Byte):Boolean;
- begin
- hodnota:=hodnota mod Dve(i+1); {Nastaví nulové bity od nejvy¿¿ího aæ
- k levému sousednímu bitu "i".}
- TestBitu:=hodnota>=Dve(i);
- end;
-
- {Lep¿í, kdyæ je Str funkce.}
- function Str(b:Longint):String;
- var p:String;
- begin
- System.Str(b,p);Str:=p;
- end;
-
- {Umoæñuje zadat délku vÿstupního ⌐etêzce.}
- function Str2;
- var p:String;i:Byte;
- begin
- System.Str(b:pocet,p);
- for i:=1 to Length(p) do if p[i]=' ' then p[i]:='0';
- Str2:=p;
- end;
-
- {Pomocí menu uæivatel vybere existující soubor na aktuálním disku,
- umoæñuje mênit aktuální adresá⌐e, funkce vrátí disk:cestu:jméno souboru.
- maska = nap⌐. *.*, *.exe, *.pas apod.
- text = bude se vypisovat p⌐i vÿbêru soubru}
- function VyberSouboru;
- label Opakuj;
- var DirInfo:SearchRec;
- path,S:String;
- p:Word;
- a,D:Byte;
- begin
- {"S" bude obsahovat pûvodní adresá⌐, "path" se bude postupnê (nêkdy i
- chaoticky) mênit podle toho, jak bude uæivatel zu⌐ivê "jezdit" po souborech
- a adresá⌐ích kurzorem v menu:}
- GetDir(0,S);path:=S;D:=0;
- opakuj:
- GetDir(D,path);Nastav;Zacatek(text+' v adresá⌐i '+path);if path[Length(path)]<>'\' then path:=path+'\';
- FindFirst(path+maska,Directory,DirInfo);p:=1;
- while DosError = 0 do with DirInfo do
- begin
- {V podadresá⌐ích je poloæka "." - ukazující na stejnÿ podadresá⌐ (která
- se v menu neobjeví - proç taky - v VC nebo v NC se také nezobrazuje)}
- if Name<>'.' then begin pole[p]:=TestBitu(Attr,4);Radek(Name);Inc(p);end;
- FindNext(DirInfo);
- end;
- a:=Menu4(0,0,1,True);
- if pole[a] then {Zmêna adresá⌐e}
- begin
- ChDir(Zjisti(a));Goto opakuj;
- end else begin {Volba souboru}
- VyberSouboru:=path+Zjisti(a);
- end;
- ChDir(s); {Obnovení pûvodního adresá⌐e.}
- end;
-
- function Bin(n:Word):String;
- begin
- for i:=15 downto 0 do
- begin
- Write(Ord(TestBitu(n,i)));
- end;
- Writeln(cs(' v binární soustavê.'));
- end;
-
- function VyberJednotky(text:String):Char;
- var i:Byte;
- DirInfo:SearchRec;
- p:String;
- begin Zacatek(text);Radek('A:');Radek('B:');
- for i:=67 to 90 do
- begin
- FindFirst(Chr(i)+':\*.*',Directory,DirInfo);
- if (DosError=0) or (DosError=18) or (DosError=152) then Radek(Chr(i)+':');
- end;
- Nastav;
- i:=Menu4(0,0,1,True);
- p:=Zjisti(i);VyberJednotky:=p[1];Nastav;
- end;
-
- {Vrací ASCII kód písmene s háçkem a krouækem.}
- function Hacek(NadJakymPismenem:Char):Byte;
- var a:Byte;
- begin
- a:=Pos(NadJakymPismenem,bezha);
- if a>0 then Hacek:=Ord(hacky[a])
- else Hacek:=0;
- end;
-
- {Vrací ASCII kód písmene s çárkou.}
- function Carka(NadJakymPismenem:Char):Byte;
- var a:Byte;
- begin
- a:=Pos(NadJakymPismenem,bezca);
- if a>0 then Carka:=Ord(carky[a])
- else Carka:=0;
- end;
-
- procedure Pipej(pole:Array of zaznam);
- var i:Byte;
- begin
- for i:=0 to High(pole) do with pole[i] do if zvuk then
- begin
- Sound(f);Delay(p);
- end;
- NoSound;
- end;
-
- {Vrací znak podle çeské klávesnice, nêkteré znaky vrací v pûvodní podobê,
- jiné konvertuje.}
- function Klavesa2:Char;
- label preskok,opakuj;
- const z1:Array[1..9] of zaznam=
- ((f:50;p:100),(f:100;p:200),(f:200;p:100),
- (f:400;p:100),(f:200;p:200),(f:800;p:100),
- (f:600;p:100),(f:400;p:200),(f:200;p:100));
- z2:Array[1..3] of zaznam=
- ((f:50;p:50),(f:100;p:100),(f:200;p:50));
- var a:Char;
- begin
- { Pokud nebylo v minulém volání vráceny v¿echny kódy (nap⌐. p⌐i vracení
- roz¿í⌐eného kódu) se nejd⌐íve vrátila 0 a nyní je v promênné "pamatuj"
- roz¿í⌐enÿ ASCII kód speciální klávesy.
- Uæivatelskÿ program musí dostat i nulu i roz¿í⌐enÿ ASCII kód !!!
-
- Dûvod této metody je, æe samotná funkce testuje, zda není stisknutá
- kombinace kláves Alt+F1, která zapíná/vypíná çeskou klávesnici. Pokud
- je, zapne resp. vypne çeskou klávesu a volá funkci ReadKey a çeká na stisk
- dal¿í klávesy. Uæivatelskÿ program se o stisku kombinace kláves Alt+F1
- nedozví, funkce Klavesa vydá pouze zvukovÿ signál, æe je klávesa p⌐epnuta,
- p⌐i zapínání çeské klávesnice zahraje více tónû, p⌐i vypínání zahraje ménê
- tónû.
- Pokud je zapnutá çeská klávesnice a je stisknuta klávesa >=<, program
- çeká na stisk písmena, nad kterÿm se pí¿e çárka, kód písmena s çárkou
- vrátí jako vÿstup funkce.
- Podobnê p⌐i stisku '+' slouæí pro psaní písmen s háçkem, zde stejnê jako
- u çárky se çeká na stisk dal¿í klávesy s písmenem, funkce vrátí jako svûj
- vÿstup písmeno s háçkem.
-
- Uæivatelská otázka: A jak napí¿u písmeno: "û" nebo "ª"?
- Odpovêâ: 1. "û" napí¿ete stiskem ";".
- 2. "û" i "ª" lze napsat stiskem "+" a potom "u" nebo "U".
- }
- if vrat then begin Klavesa2:=pamatuj;vrat:=False;Exit;end;
- opakuj:
- a:=ReadKey;
- if stav=vypnuta then begin Klavesa2:=a;goto Preskok;end;
- case a of
- '1': Klavesa2:='+';
- '2': Klavesa2:='ê';
- '3': Klavesa2:='¿';
- '4': Klavesa2:='ç';
- '5': Klavesa2:='⌐';
- '6': Klavesa2:='æ';
- '7': Klavesa2:='ÿ';
- '8': Klavesa2:='á';
- '9': Klavesa2:='í';
- '0': Klavesa2:='é';
- '!': Klavesa2:='1';
- '@': Klavesa2:='2';
- '#': Klavesa2:='3';
- '$': Klavesa2:='4';
- '%': Klavesa2:='5';
- '^': Klavesa2:='6';
- '&': Klavesa2:='7';
- '*': Klavesa2:='8';
- '(': Klavesa2:='9';
- ')': Klavesa2:='0';
- '-': Klavesa2:='=';
- '_': Klavesa2:='%';
- '[': Klavesa2:='ú';
- '{': Klavesa2:='/';
- ']': Klavesa2:=')';
- '}': Klavesa2:='(';
- ';': Klavesa2:='û';
- ':': Klavesa2:='"';
- {apostrof} Chr(39): Klavesa2:='¡';
- '"': Klavesa2:='!';
- '=': begin a:=ReadKey;if Carka(a)>0 then Klavesa2:=Chr(Carka(a)) else Klavesa2:=a;end; {çárka nad písmenem}
- '+': begin a:=ReadKey;if Hacek(a)>0 then Klavesa2:=Chr(Hacek(a)) else Klavesa2:=a;end; {háçek nad písmenem}
- '<': Klavesa2:='?';
- '>': Klavesa2:=':';
- '/': Klavesa2:='-';
- '?': Klavesa2:='_';
- else Klavesa2:=a;
- end;
- preskok:
- if a=Chr(0) then begin {>Alt<+>F1<}
- a:=ReadKey;
- pamatuj:=a; {Pokud nebude Alt+F1, potom bude vrácena jako vÿstup funkce
- hodnota Chr(0) a p⌐i následujícím volání vrácena zapamatovaná klávesa,
- která je zapamatovaná v promênné "pamatuj".}
- if Ord(a)=AltF1 then
- begin
- if stav=Zapnuta then Pipej(z2) else Pipej(z1);
- stav:=Not(stav);goto opakuj;
- end else begin Klavesa2:=Chr(0);vrat:=True;end;
- end;{>Alt<+>F1<}
- end;
-
- procedure TvarKurzoru(StartLine,EndLine:Byte);
- var r:Registers;
- begin
- r.AH:=1;
- r.CH:=StartLine;
- r.CL:=EndLine;
- Intr($10,r);
- end;
-
- function CtiString;begin CtiString:=CtiString2(zprava,False,False);end;
-
- {Funkce která v podobê malého textového editoru umoæní zadat z klávesnice
- 1 ⌐ádek a vrátí ho jako vÿstup funkce.
- Vstupy: Zprava = Zpráva, která se objeví na rámeçku.
- PouzeCisla = True : Umoæní zadání pouze çíslice, desetinnou teçku a
- minus
- = False: Jakÿkoliv text
- Tajne = True : Nevypisuje p⌐i vstupu z klávesnice do ⌐ádku
- znaky, pouze 1 nastavenÿ znak, aƒ je stisknutá
- jakákoliv klávesa (znaková, çíselná, grafická).
- Nastavení tohoto znaku viz: NastavTajnyZnak}
- function CtiString2;
- var pom:String;
- begin
- pom:='';CtiString3(zprava,PouzeCisla,Tajne,pom);CtiString2:=pom;
- end;
-
- {Nastavení tajného znaku, pokud p⌐i funkci CtiString2 poæadujete nevypisovat
- znaky (nap⌐. p⌐i heslu), tak jakÿ znak má poçítaç vypisovat.}
- procedure NastavTajnyZnak;
- begin
- TajnyZnak:=znak;
- end;
-
- {Zji¿têní tajného znaku nastaveného procedurou NastavTajnyZnak. Poznámka:
- Pokud jako tajny znak zadáte mezeru ' ', potom ostatní lidé ¿patnê odhadnou,
- kolik znakû má heslo. Ale v tom p⌐ípadê neuvidíte, kolik znakû jste napsali.}
- function ZjistiTajnyZnak;
- begin
- ZjistiTajnyZnak:=TajnyZnak;
- end;
-
- procedure NastavCekani(delka:Byte);
- begin
- doba:=delka;
- end;
-
- {Procedury z jednotky SYSTEM: Vêt¿inou vrací chyby a ukonçují program.}
- procedure Assign(var f:System.Text;s:String);begin {$I-}System.Assign(f,s);{$I+}chyba:=IOResult;end;
- procedure Reset(var f:System.Text);begin {$I-}System.Reset(f);{$I+}chyba:=IOResult;end;
- procedure Rewrite(var f:System.Text);
- begin
- {$I-}System.Rewrite(f);{$I+}
- chyba:=IOResult;
- end;
- procedure Append(var f:System.Text);begin {$I-}System.Append(f);{$I+}chyba:=IOResult;end;
- procedure Close(var f:System.Text);begin {$I-}System.Close(f);{$I+}chyba:=IOResult;end;
- procedure ChDir(s:String);var pom:String;
- begin
- if s[Length(s)]='\' then
- pom:=Copy(s,1,Length(s)-1)
- else
- pom:=s;
- {$I-}System.ChDir(pom);{$I+}chyba:=IOResult;
- end;
- procedure MkDir(s:String);var pom:String;
- begin if s[Length(s)]='\' then pom:=Copy(s,1,Length(s)-1) else pom:=s;{$I-}System.MkDir(pom);{$I+}chyba:=IOResult;end;
-
- {Nové procedury a funkce:}
-
- {Vÿstupem funkce je Tru, v p⌐ípadê, æe je rok "r" p⌐estupnÿ, jinak False}
- function Prestupny;
- begin
- Prestupny:=((r/4)=Int(r/4)) and ((r/100)<>Int(r/100)) or ((r/500)=Int(r/500));
- end;
-
- {Vrací poçet dnû v mêsíci "mesic" v roce "rok":}
- function Pocet2;
- begin
- Pocet2:=0;if (mesic<1) or (mesic>12) then Exit;
- if mesic<>2 then Pocet2:=Pocty[mesic]
- else if Prestupny(rok) then Pocet2:=29 else Pocet2:=Pocty[mesic];
- end;
-
- {Vrací True v p⌐ípadê, æe datum d.m.r je moæné, jinak False}
- function SpravneDatum;
- begin
- SpravneDatum:=(m in [1..12]) and (d>=1) and (d<=Pocet2(m,r));
- end;
-
- {Do d2.m2.r2 uloæí zít⌐ej¿í datum, jestliæe dnes je d1.m1.r1}
- procedure Zitra;
- begin
- if SpravneDatum(d1,m1,r1)=False then begin Writeln(cs('Procedura Zitra: ¢patné datum.'));Cekani;Konec;end;
- if d1<Pocet2(m1,r1) then begin d2:=d1+1;m2:=m1;r2:=r1;end else
- begin
- d2:=1;m2:=m1;r2:=r1;Inc(m2);if m2>12 then begin m2:=1;Inc(r2);end;
- end;
- end;
-
- {Do d2.m2.r2 uloæí vçerej¿í datum, jestliæe dnes je d1.m1.r1}
- procedure Vcera;
- begin
- if SpravneDatum(d1,m1,r1)=False then begin Writeln(cs('Procedura Vcera: ¢patné datum.'));Cekani;Konec;end;
- if d1>1 then begin d2:=d1-1;m2:=m1;r2:=r1;end else
- begin
- m2:=m1;r2:=r1;Dec(m2);if m2<1 then begin m2:=12;Dec(r2);end;
- d2:=Pocet2(m2,r2);
- end;
- end;
-
- {function Str(cislo:Longint):String;
- var s:String;
- begin
- System.Str(cislo,s);Str:=s;
- end;}
-
- procedure UlozBarvy; {Uloæí barvy textu a pozadí do svÿch promênnÿch.}
- begin
- b:=TextAttr;
- end;
-
- procedure ObnovBarvy; {Obnoví barvy textu a pozadí ze svÿch promênnÿch.}
- begin
- TextBackGround(b div 16);TextColor(b mod 16);
- end;
-
- function Hledej(soubor,Hledat:String):Longint;
- label vyskok;
- var f:File of Byte; {Binární soubor}
- b,i:Byte; {Çtenÿ Byte}
- p:Longint; {Stará pozice v souboru}
- nalezeno:Byte;
- begin
- nalezeno:=0;
- {$I-}
- System.Assign(f,soubor);System.Reset(f);
- {$I+}
- if IOResult = 0 then
- begin
- Writeln(cs('Testuji a prohledávám '+soubor));
- while Not(Eof(f)) do
- begin
- p:=FilePos(f);Read(f,b);
- if b=Ord(Hledat[1]) then
- begin
- for i:=2 to Length(hledat) do
- begin
- Seek(f,p+(i-1)*13);Read(f,b);
- if b<>Ord(Hledat[i]) then
- begin
- Seek(f,p+1);Write('x');Goto vyskok;
- end; {end of if}
- end; {end of for}
- Write('*');Hledej:=p;Inc(nalezeno);
-
- vyskok:
- end; {end of if}
- end; {end of while}
- System.Close(f);Writeln(cs(' O.K.,soubor '+soubor+' byl prohledán.'));Writeln;
- if nalezeno<>1 then Hledej:=-1;
- end else Hledej:=-1;
- end;
-
- function Hledej2(soubor,Hledat:String):Longint;
- label preskok,vyskok;
- const max=2048;
- var f:File;
- i,w:Word; {Çtenÿ Byte}
- p:Longint; {Stará pozice v souboru}
- nalezeno:Byte;
- NumRead,NumRead2:Word;
- Buf:array[1..max] of Char;
- begin
- nalezeno:=0;
- {$I-}
- System.Assign(f,soubor);System.Reset(f,1);
- {$I+}
- if IOResult = 0 then
- begin
- Write(cs('Testuji a prohledávám '+soubor+'...'));
- repeat
- p:=FilePos(f); {uloæení pûvodní hodmoty ukazatele v souboru, protoæe
- se bude mênit}
- BlockRead(f,Buf,SizeOf(Buf),NumRead);
- if NumRead=0 then goto vyskok;
-
- for i:=1 to NumRead do {v¿echny znaky v bufferu se porovnají s 1. znakem v ⌐etêzci "hledat":}
- begin
- if Buf[i]=Hledat[1] then {nalezen znak v bufferu Buf na pozici "i":}
- begin
-
- for w:=2 to Length(hledat) do {kontrolují se dal¿í znaky textu:}
- begin
- {má bÿt nalezeno na pozici 9558 v souboru REGISTRA.EXE}
- Seek(f,p+i-1+(w-1)*13);BlockRead(f,Buf,1,NumRead2);
- if Buf[1]<>Hledat[w] then
- begin
- Seek(f,p);goto preskok; {vÿskok z cyklu for i}
- end; {end of if}
- end; {end of for}
- {Pokud je celÿ text nalezen:}
- Hledej2:=p+i-1;Seek(f,p);Inc(nalezeno);Write('*',#7);
- preskok:
-
- end; {end of if}
- { goto nalezen1znak;}
- end; {end of for}
- Seek(f,p+NumRead);
- goto vyskok; {prohledávání dal¿ího bloku souboru v bufferu:}
-
-
- vyskok:
- until NumRead=0;
- System.Close(f);Writeln('O.K.');
- if nalezeno<>1 then Hledej2:=-1;
- end else Hledej2:=-1;
- end;
-
- {Sample code for the BlockRead and BlockWrite procedures.}
- procedure CopyFile(input,output:String);
- label preskok;
- var FromF, ToF: file;
- NumRead, NumWritten: Word;
- Buf: array[1..2048] of Char;
- begin
- Writeln(cs('Kopíruji soubor '+input+' => '+output));
- {$I-}
- System.Assign(FromF,input); { Open input file }
- System.Reset(FromF, 1); { Record size = 1 }
- {$I+}
- if IOResult=0 then {Otev⌐ení souboru pro çtení se poda⌐ilo.}
- begin
- {$I-}
- System.Assign(ToF,output); { Open output file }
- System.Rewrite(ToF, 1); { Record size = 1 }
- {$I+}
-
- if IOResult=0 then {Otev⌐ení souboru pro zápis se poda⌐ilo.}
- begin
- Writeln(cs('Kopíruji celkem '+ Str(FileSize(FromF))+' bytû...'));
- repeat
- {$I-} BlockRead(FromF, Buf, SizeOf(Buf), NumRead); {$I+}
- if IOResult<>0 then
- begin
- Writeln(cs('!!! Chyba p⌐i çtení dat v souboru !!!'));goto preskok;
- end;
- {$I-} BlockWrite(ToF, Buf, NumRead, NumWritten); {$I+}
- if IOResult<>0 then
- begin
- Writeln(cs('!!! Chyba p⌐i zápisu dat do souboru !!!'));goto preskok;
- end;
- until (NumRead = 0) or (NumWritten <> NumRead);
- preskok:
- {$I-}System.Close(ToF);{$I+}if IOResult<>0 then Writeln(cs('Soubor '+output+' nelze zav⌐ít.'));
- end else Writeln(cs('!!! Chyba p⌐i zápisu, soubor '+output+' nelze otev⌐ít !!!'+Chr(7)));
-
- {$I-}System.Close(FromF);{$I+}if IOResult<>0 then Writeln(cs('Soubor '+input+' nelze zav⌐ít.'));
-
- end else Writeln(cs('!!! Chyba p⌐i çtení+soubor'+input+' nelze otev⌐ít !!!'+Chr(7)));
- end;
-
- function Dekoduj(co:String):String;
- var a,b,i:Byte;
- begin
- Dekoduj[0]:=co[0];
- for i:=1 to Length(co) do
- begin
- a:=Ord(co[i]);
- b:=a-10;
- b:=b XOR 2;
- b:=b+7;
- b:=b XOR 128;
- b:=b-5;
- Dekoduj[i]:=Chr(b);
- end;
- end;
-
- function DelkaSouboru(jmeno:String):Longint;
- var f:File of Byte;
- begin
- {$I-}
- System.Assign(f,jmeno);System.Reset(f);
- {$I+}
- if IOResult=0 then
- begin
- DelkaSouboru:=FileSize(f);
- System.Close(f);
- end else DelkaSouboru:=-1;
- end;
-
- {Funkce provádí kontrolní souçet souboru standarntí názornou metodou:
- V cyklu çteme jednotlivé Byty souboru a p⌐itom je sçítáme.}
- function Soucet1;
- var s:Longint;
- b:Byte;
- f:File of Byte;
- begin
- {$I-}
- System.Assign(f,jmeno);System.Reset(f);
- {$I+}
- s:=0;
- if IOResult=0 then
- begin
- while Not(Eof(f)) do begin Read(f,b);Inc(s,b);end;
- System.Close(f);Soucet1:=s;
- end else Soucet1:=-1;
- end;
-
- {Metoda pro kontrolní souçet souboru je naprogramován je¿tê jinak:
- Zde je definován typ "pamet", kterÿ je promênná typu pole. To se naçte
- ze souboru jako 1 promênná. Potom se teprve seçtou prvky v poli.
- Tato druhá metoda je sice pouæitelná pouze u souboru p⌐edem známé délky a
- dostateçnê velké pamêti (resp. zásobníku), ale je mnohokrát rychlej¿í.
-
- Dále je naprogramovaná funkce Soucet2:
- Funkce "Soucet1" a "Soucet2" udêlají totéæ, av¿ak "Soucet2" nêkolikrát
- rychleji.
- Zrovna mi to p⌐ipomíná programování na ATARI 800 XL/XE a to porovnání
- rychlosti mezi interpretem ATARI-BASIC (nepot⌐eboval ani zpoæâovací smyçky)
- s kompilátorem ACTION!, kde se rychlost dala srovnat s programem napsanÿm
- rovnou ve strojovém kódu µP 6502. Programátor v ATARI-BASICu musel (pokud
- chtêl mít alespoñ trochu rychlÿ program) hledat nêkolik rûznÿch metod
- (hlavnê p⌐i vÿpoçtech, ATARI totiæ nemêlo matematickÿ koprocesor) a nêkdy
- z programu v BASICu dokonce odstartovat p⌐eloæenÿ program ve strojovém
- kódu µP 6502. A také prográmky têchto programátorû poznáte podle toho, æe
- se v¿echny vejdou do 64 kB, vêt¿inou byl limit 48 kB a dále velká rychlost
- (kdyby se teoreticky spustili na ATARI nap⌐. s frekvencí 10 MHz.), potom
- by byly asi stejnê rychlé jako podobné algoritmy na 486 s koprocesorem
- a frekvencí 66 MHz a více.
-
- A nebo kdyby se v¿echny programy programovaly na XT nebo 286, potom by
- v¿echny programy byly dost rychlé (ale ne v¿ichni programáto⌐i to dêlají).}
-
- function Soucet2;
- var s:Longint;
- f:File;
- i,NumRead:Word;
- Buf:array[1..2048] of Byte;
- begin
- {$I-}
- System.Assign(f,jmeno);System.Reset(f,1);
- {$I+}
- s:=0;
- if IOResult=0 then
- begin
- repeat
- BlockRead(f,Buf,SizeOf(Buf),NumRead);
- for i:=1 to NumRead do Inc(s,Buf[i]);
- until (NumRead=0);
- System.Close(f);Soucet2:=s;
- end else Soucet2:=-1;
- end;
-
- { P⌐eçte çíslo z klávesnice:}
- function CtiCislo(text:String):Real;
- var s:String;pom:Real;i:Integer;stara:Boolean;
- begin
- stara:=stav;stav:=vypnuta;
- repeat
- s:=CtiString2(text+' Potom ukonçete zadání çísla klávesou >Enter<.',True,False);
- System.Val(s,pom,i);
- until i=0;
- CtiCislo:=pom;stav:=stara;
- end;
-
- { Vÿznam procedur Cti_Byte, Cti_Real, Cti_LongInt je zamezení p⌐eru¿ení
- programu p⌐i zadáním nesmyslnÿch znakû, kdyæ poçítaç çeká na vstup çísla: }
- function Cti_Byte;
- var r:Real;
- begin
- repeat
- r:=CtiCislo(text);
- until (r=Int(r)) and (r>=0) and (r<=255);
- Cti_Byte:=Round(r);
- end;
-
- function Cti_Real;
- var r:Real;
- begin
- Cti_Real:=CtiCislo(text);
- end;
-
- function Cti_LongInt;
- var r:Real;
- begin
- repeat
- r:=CtiCislo(text);
- until (r=Int(r)) and (r>=-2147483647) and (r<=2147483647);
- Cti_LongInt:=Round(r);
- end;
-
- procedure BorderColor(barva:Byte);
- var r:Registers;
- begin
- with r do
- begin
- r.ah:=$0B;r.bh:=0;r.bl:=barva;Intr($10,r);
- end;
- end;
-
- procedure CtiString3;
- label preskok,vykresli;
- const z1:Array[1..9] of zaznam=
- ((f:150;p:50),(f:300;p:100),(f:50;p:50),
- (f:400;p:50),(f:500;p:100),(f:1000;p:50),
- (f:600;p:50),(f:400;p:100),(f:800;p:50));
- z2:Array[1..3] of zaznam=
- ((f:500;p:50),(f:250;p:100),(f:400;p:50));
-
- var l,x,xmin,xmax,y:Byte;
- kl:Byte;
- pom:String; {Zde se ukládá text bêhem editace ⌐ádku.}
- ins:Boolean; {Obsahuje True v insert reæimu, jinak obsahuje False
- v p⌐episovacím reæimu.}
-
- procedure Vypis;
- var i:Byte;
- begin
- GotoXY(xmin,y);
- if Tajne then
- begin
- for i:=1 to Length(pom) do Write(TajnyZnak);
- Writeln(' ');
- end else
- if Length(pom)<l then Writeln(cs(pom),' ') else Writeln(cs(DoplnNa(pom,l)));
- end;
-
- begin
- Window(1,1,80,25);Pipej(z1);pom:=text;TvarKurzoru($1E,$1F);ins:=True;
- l:=Length(zprava);if l>78 then begin zprava[0]:=Chr(78);l:=78;end;
- xmin:=1+((80-l) div 2);xmax:=xmin+l-1;
- x:=xmin;y:=11;x:=xmin+Length(pom);
- vykresli:
- Obdelnik(xmin-1,y-1,Length(zprava),1,1,32,False);
- Vypis;GotoXY(xmin,y-1);Writeln(cs(zprava));
- repeat
- GotoXY(xmin,y+1);if ins then Write(cs('Vkládací reæim───')) else Write(cs('P⌐episovací reæim'));
- Write(cs('─>F1<=nápovêda'));GotoXY(x,y);
- kl:=Ord(Klavesa2);
- case kl of
- 0: begin
- kl:=Ord(Klavesa2);
- if (kl=Right) and (x<xmax) and (x<xmin+Length(pom)) then Inc(x);
- if (kl=Left) and (x>xmin) then Dec(x);
- if (kl=Home) then x:=xmin;
- if (kl=KlavesaEnd) then x:=xmin+Length(pom);
- if (kl=Delete) and (x<xmin+Length(pom)) then begin System.Delete(pom,x-xmin+1,1);Vypis;end;
- if (kl=Insert) then
- begin
- ins:=Not(ins);
- if ins then
- begin
- TvarKurzoru($1E,$1F);Pipej(z2);
- end else begin
- TvarKurzoru($00,$1F);Pipej(z1);
- end;
- end;
- if kl=F1 then
- begin
- Pipej(z1);Nastav;
- TextColor(Red);Writeln(cs('Nápovêda k editaci ⌐ádku:'));TextColor(Blue);
- Writeln(cs('Nyní poçítaç çeká na vstup z klávesnice (pokud ji nemáte, máte smûlu),'));
- Writeln(cs('protoæe se nedoçkáte. Mêli byste (ve vlastním zájmu) nêjakou tu klávesu'));
- Writeln(cs('stisknout nebo se nic nestane.'));Writeln;
- TextColor(White);Writeln(cs('Jedná se o malÿ textovÿ editor pro jeden ⌐ádek:'));TextColor(Yellow);
- Writeln(cs('1. Má dva reæimy: P⌐episovací (replace) a vkládací (insert). P⌐epínání'));
- Writeln(cs(' mezi obêma reæimy se provede stiskem klávesy >Insert<.'));
- Writeln(cs('2. Pohyb kurzoru po jiæ napsaném textu klávesami >'+Chr(27)+'<,>'+Chr(26)+'<.'));
- Writeln(cs('3. Ukonçení editace >Enter< nebo >Esc<.'));
- Writeln(cs('4. >Delete< mazání znaku pod kurzorem.'));
- Writeln(cs('5. >Back Space< na klávesnici oznaçena >'+Chr(27)+'< mazání levého znaku'));
- Writeln(cs(' a posun kurzoru doleva.'));
- Writeln(cs('6. >F1< tato nápovêda'));Writeln;
- TextColor(White);Writeln(cs('Funkce çeské klávesnice:'));TextColor(Yellow);
- Writeln(cs('1. >Alt<+>F1< zapnutí/vypnutí çeské klávesnice'));
- Writeln(cs('2. >=< znamená, æe nad následujícím písmenem se napí¿e çárka'));
- Writeln(cs('3. >+< znamená, æe nad následujícím písmenem se napí¿e háçek(krouæek)'));
- Writeln(cs('4. Ostatní çeská písmena - viz çervenÿ potisk na klávesnici (pokud ho'));
- Writeln(cs(' klávesnice má).'));
- Writeln(cs('!!! Volby 2,3,4 pouze v p⌐ípadê, æe je zapnutá çeská klávesa - viz bod 1, jinak'));
- Writeln(cs('se po stisku uvedenÿch kláves napí¿í normální çerné znaky na klávesnici !!!'));Writeln;
- Cekani;Nastav;Pipej(z2);goto vykresli;
- end;
- end;
- 8: begin {Mazání znaku a posun kurzoru doleva:}
- if x>xmin then
- begin
- System.Delete(pom,x-xmin,1);Vypis;Dec(x);
- end;
- end;
- 32..255: begin
- if PouzeCisla then
- begin
- if (kl=45) and (x<>xmin) then begin Write(#7);goto Preskok;end; {"-" je dovoleno jenom na 1. pozici}
- if (kl=46) and ((Pos('.',pom)<>0) or (x=xmin) or Not(pom[x-xmin] in ['0'..'9'])) then
- begin {desetinná "." je povolena jen 1x, nesmí bÿt na 1. pozici (x=xmin) a musí bÿt p⌐ed ní çíslice}
- Write(#7);goto Preskok;
- end;
- if Not(kl in [45,46,48..57]) then begin Write(#7);goto Preskok;end; {pokud není '.','-' nebo çíslice}
- end;
-
- if ((x<xmax) and ((Length(pom)+1)<l)) or
- ((ins=False) and (x<xmax)) then
- begin
- if ins then System.Insert(Chr(kl),pom,x-xmin+1)
- else
- begin
- if x>=xmin+Length(pom) then pom[0]:=Chr(x-xmin+1);
- pom[x-xmin+1]:=Chr(kl);
- end;
- Vypis;Inc(x);
- end;
- Preskok:
- end;
- end;
- until (kl=13) or (kl=27);
- Nastav;TvarKurzoru($1E,$1F);
- text:=pom;Pipej(z2);
- end;
-
- function DoplnNa(co:String;NaDelku:Byte):String;
- begin
- if Length(co)>=NaDelku then co[0]:=Chr(NaDelku)
- else begin
- while Length(co)<NaDelku do co:=co+' ';
- end;
- DoplnNa:=co;
- end;
-
- function Secti(x,y:Char):Char;
- var i,i1,i2:Byte;
- pom:Smery;
- begin
- i1:=0;i2:=0;
- for i:=1 to pocet0 do {Prohledání celého tabulky v poli "pole0":}
- begin
- if (x=pole0[i].znak) then i1:=i; {Pozice v poli, na které byl nalezen znak "x", uloæ do "i1":}
- if (y=pole0[i].znak) then i2:=i; {Pozice v poli, na které byl nalezen znak "y", uloæ do "i2":}
- end;
- if i1=0 then begin Secti:=y;Exit;end; {V tomto p⌐ípadê vraƒ znak "y", protoæe "x" nebylo nalezeno.}
- if i2=0 then begin Secti:=x;Exit;end; {V tomto p⌐ípadê vraƒ znak "x", protoæe "y" nebylo nalezeno.}
-
- {Nyní jiæ jsou vylouçené p⌐ípady, æe buâ "x" nebo "y" nebylo v tabulce nalezeno,
- tzn. "x" i "y" byly nalezeny v tabulce:}
- pom.nahoru:=pole0[i1].nahoru or pole0[i2].nahoru;
- pom.dolu:=pole0[i1].dolu or pole0[i2].dolu;
- pom.doleva:=pole0[i1].doleva or pole0[i2].doleva;
- pom.doprava:=pole0[i1].doprava or pole0[i2].doprava;
-
- for i:=1 to pocet0 do {Prohledání celého tabulky v poli "pole0":}
- begin
- if (pom.nahoru=pole0[i].nahoru) and (pom.dolu=pole0[i].dolu) and
- (pom.doleva=pole0[i].doleva) and (pom.doprava=pole0[i].doprava) then
- begin
- Secti:=pole0[i].znak;Exit; {Nalezen znak, kterÿ odpovídá seçtení "x" s "y":}
- end;
- end;
- Writeln(cs('Znak, kterÿ vznikl seçtením "'+x+'" s "'+y+'" nebyl nalezen.'));
- with pole0[i] do
- begin
- Writeln('Nahoru: ',nahoru,' Dolu: ',dolu,' Doleva: ',doleva,' Doprava: ',doprava);
- Cekani;Konec;
- end;
- end;
-
- {Funkce Locate vrací znak, kterÿ je na obrazovce na pozici x,y:}
- {Parametr "znaku" udává poçet znakû na ⌐ádku v textovém reæimu:}
- function Locate(x,y:Byte):Char;
- var adr:Word;
- begin
- adr:=x-1+(y-1)*MaxX;Locate:=Chr(Fr_Sok.obraz[adr].ascii);
- end;
-
- procedure PisZnak(ASCII:Char);
- var x,y:Byte;
- begin
- x:=WhereX;y:=WhereY;Znak(x,y,Ord(Secti(ASCII,Locate(x,y))));
- if x<MaxX then GotoXY(x+1,y) else GotoXY(1,y+1);
- end;
-
- function VratTrue:Boolean;
- begin
- VratTrue:=True;
- end;
-
- function Sude(c:Longint):Boolean;
- begin
- Sude:=(c mod 2)=0;
- end;
-
- function Liche(c:Longint):Boolean;
- begin
- Liche:=(c mod 2)=1;
- end;
-
- function Min(c1,c2:Longint):Longint;
- begin
- if c1<c2 then Min:=c1 else Min:=c2;
- end;
-
- function Max(c1,c2:Longint):Longint;
- begin
- if c1>c2 then Max:=c1 else Max:=c2;
- end;
-
- {Tisk na obrazovku od pozice kurzoru bez rolování v p⌐ípadê tisku na poslední
- ⌐ádku obrazovky nebo bez p⌐echodu na novÿ ⌐ádek v p⌐ípadê tisku do posledního
- sloupce obrazovky.}
- procedure Tisk;
- var adr:Integer;
- b,i:Byte;
- begin
- adr:=x-2+(y-1)*MaxX;b:=TextAttr;
- for i:=1 to Length(text) do
- begin
- obraz[adr+i].barva:=b;obraz[adr+i].ascii:=Ord(text[i]);
- end;
- end;
-
- procedure Prohlizec;
- var a1,a2,chyba,posunX,radek:Byte;
- {a1,a2...stisknutá klávesa; posunX...hodnota,která se p⌐ipoçte ke v¿em indexûm v ⌐etêzci,
- její zmênou se umoæní horizontální rolování}
- posunY,i:Word; {posunY...hodnota,která se p⌐ipoçte ke v¿em indexûm v poli ⌐etêzci,její zmênou se
- umoæní vertikální rolování}
- jmeno:String; {jméno souboru do kterého se uloæí obsah prohlíæeçe}
- soubor:System.Text; {soubor je normální textovÿ soubor,identifikátor Text byl jiæ pouæit v jednotce Fr_Sok,
- proto bylo nutné p⌐idat System.}
- stara:Boolean;
-
- function ZjistiRadek(cislo:Word):String;
- begin
- ZjistiRadek:=cs('₧ádek çíslo ')+Str(cislo);
- end;
-
- procedure Pis(text:String);
- var p:Boolean;i:Byte;
- begin
- p:=False;
- for i:=1 to Length(text) do
- begin
- if text[i]='~' then p:=Not(p) else Write(cs(text[i]));
- if p then TextColor(Crt.Red) else Textcolor(Crt.Black);
- end;
- end;
-
- {Tato funkce upravuje vÿstup funkce f definované uæivatelem na 78 znakû
- na ⌐ádce, zaji¿ƒuje vÿpis çásti ⌐etêzce a tím i horizontální (rolování):}
- function f0(cislo:Word):String;
- begin
- f0:=Copy(f(cislo),posunX,78);
- end;
-
- procedure Prekresli(vsechno:Boolean);
- var i:Byte;
- begin
- if vsechno then
- begin
- Nastav;TextColor(Crt.Yellow);
- TextBackGround(Crt.Blue);Window(1,2,80,24);ClrScr;
- TextColor(Crt.White);Obdelnik2(1,2,78,19,2,32,True);
- Window(1,1,80,1);TextBackGround(Crt.LightGray);ClrScr;
- Window(1,25,80,25);TextBackGround(Crt.LightGray);ClrScr;
- end;
- Window(2,5,79,23);TextColor(Crt.Yellow);TextBackGround(Crt.Blue);
- if Not(vsechno) then
- begin
- Window(2,5,79,23);ClrScr;
- end;
- for i:=1 to Min(19,max) do Tisk(2,4+i,cs(f0(posunY+i)));
- if vsechno then
- begin
- Window(1,1,80,25);GotoXY(2,3);Write(cs(napis));
- TextBackGround(Crt.LightGray);GotoXY(1,1);
- Pis(' ~F~ile ~H~elp');
- GotoXY(1,25);Pis(' ~F1~ Help ~F10~ Menu ~Alt+X~ Exit');
- end;
- TextColor(Crt.Yellow);Window(2,5,79,23);TextBackGround(Crt.Blue);
- end;
-
- begin
- posunX:=1;posunY:=0;Prekresli(True);
- repeat
- a1:=Ord(ReadKey);if a1=0 then a2:=Ord(ReadKey);
- if (a1=0) and (a2=59) then {F1}
- begin
- Nastav;Writeln(cs('Velice struçná nápovêda:'));
- Writeln(cs('Tento prohlíæeç má nastavením barev a nápisy p⌐ipomínat slavné Turbo-Vision,'));
- Writeln(cs('kde by ale ⌐e¿ení tohoto problému bylo dost obtíæné (snad to v¿echno uloæit'));
- Writeln(cs('do souboru a ten potom zobrazit v Turbo-Vision).'));
- Writeln;Writeln(cs('K prohlíæení slouæí tyto klávesy:'));
- Writeln(cs('>'+Chr(24)+'< pro pohyb o ⌐ádek nahoru'));
- Writeln(cs('>'+Chr(25)+'< pro pohyb o ⌐ádek dolu'));
- Writeln(cs('>F1< tato nápovêda'));
- Writeln(cs('>F2< uloæení prohlíæeného textu do souboru'));
- Writeln(cs('>Ctrl<+>PrintScreen< tisk obsah prohlíæeçe na tiskárnê SEP 510'));
- Writeln(cs('>F10< menu (není je¿tê dostupné v této verzi)'));
- Writeln(cs('>Esc< nebo >Alt<+>X< konec prohlíæení'));
- Writeln(cs('>PageUp< pro pohyb o stránku nahoru'));
- Writeln(cs('>PageDown< pro pohyb o stránku dolu'));
- Writeln(cs('>Home< pro posun na zaçátek'));
- Writeln(cs('>End< pro posun na konec'));
- Writeln;
- Cekani;Prekresli(True);
- end;
- if (a1=0) and (a2=60) then {F2}
- begin
- stara:=stav;stav:=vypnuta;Nastav;jmeno:=CtiString('Zadejte jméno souboru do tohoto rámeçku, potom stisknête >Enter<:');
- Writeln(cs('Çekejte, zapisuji do souboru '+jmeno));
- {$I-}Assign(soubor,jmeno);Rewrite(soubor);{$I+}
- chyba:=IOResult;
- if chyba<>0 then Writeln(cs('Chyba ç.'+Str(chyba)+' p⌐i otevírání souboru pro zápis - '+Chyby.Chyba(chyba)+'.'))
- else begin
- for i:=1 to max do
- begin
- {$I-}Writeln(soubor,f(i));{$I+}
- chyba:=IOResult;
- if chyba<>0 then
- begin
- Writeln(cs('Chyba ç.'+Str(chyba)+' p⌐i zápisu do souboru - '+Chyby.Chyba(chyba)+'.'));Break;
- end;
- end;
- {$I-}Close(soubor);{$I+}
- chyba:=IOResult;
- if chyba<>0 then
- begin
- Writeln(cs('Chyba ç.'+Str(chyba)+' p⌐i zavírání souboru - '+Chyby.Chyba(chyba)+'. Tato chyba se stává dost málo...'));
- end;
- end;
- Cekani;Prekresli(True);stav:=stara;
- end;
- if (a1=0) and (a2=114) then {>Ctrl<+>PrintScreen<}
- begin {Tisk na tiskárnê SEP 510:}
- Nastav;Writeln(cs('Pokud se Vám p⌐i tisku na tisku SEP 510 ohlasí PC chybu:'));
- Writeln(cs('1. splnêno?: propojení PC a funkçní zapnuté tiskárny SEP 510'));
- Writeln(cs('2. odstartovanÿ jako rezidentní PRINTFIX (nejlépe hned po nahrátí COMMAND.COM)'));
- Writeln(cs('Pokud nemáte PRINTFIX a budete chtít tisknout na tiskárnê SEP 510, máte prostê'));
- Writeln(cs('smûlu... (vêt¿inou je v adresá⌐i, kde je MS-DOS)'));Writeln;
- Writeln(cs('V p⌐ípadê, æe vlastníte tuto tiskárnu, rád bych si s Vámi popovídal na'));
- Writeln(cs('telefonu (02)4725312 nebo po Internetu: E-MAIL: SOKOLOVSKY@KM1.FJFI.CVUT.CZ'));
- Writeln(cs('Franti¿ek Sokolovskÿ'));
- stara:=stav;stav:=vypnuta;jmeno:='PRN';
- radek:=Cti_Byte('Zadejte poçet ⌐ádek na stránku (0-dostateçnê dlouhÿ traktorovÿ papír):');
- Writeln(cs('Çekejte, tisknu na tiskárnê SEP 510...'));
- {$I-}Assign(soubor,jmeno);Rewrite(soubor);{$I+}
- chyba:=IOResult;
- if chyba<>0 then Writeln(cs('Chyba ç.'+Str(chyba)+' p⌐i otevírání souboru pro tisk - '+Chyby.Chyba(chyba)+'.'))
- else begin
- for i:=1 to max do
- begin
- Writeln(cs('Nyní tisknu ⌐ádek çíslo '+Str(i)+'. Prosím, çekejte.'));
- {$I-}Write(soubor,f(i),#10);{$I+}
- chyba:=IOResult;
- if chyba<>0 then
- begin
- Writeln(cs('Chyba ç.'+Str(chyba)+' p⌐i tisku dat - '+Chyby.Chyba(chyba)+'.'));Break;
- end;
- if (radek>0) and (i mod radek=0) then
- begin
- Writeln(cs('Nyní je poçítaç p⌐inucen trochu poçkat na vÿmênu papíru...'));
- Cekani;
- end;
- end;
- {$I-}Close(soubor);{$I+}
- chyba:=IOResult;
- if chyba<>0 then
- begin
- Writeln(cs('Chyba ç.'+Str(chyba)+' p⌐i zavírání souboru - '+Chyby.Chyba(chyba)+'. Tato chyba se stává dost málo...'));
- end;
- end;
- Cekani;Prekresli(True);stav:=stara;
- end;
- if (a1=0) and (a2=68) then {F10}
- begin Nastav;Writeln(cs('Menu nefunguje. Snad v dal¿í verzi...'));Cekani;Prekresli(True);end;
- if (a1=0) and (a2=80) and (posunY+19<max) then
- begin {><}
- Inc(posunY);GotoXY(1,1);DelLine;Tisk(2,23,cs(f0(posunY+19)));
- end;
- if (a1=0) and (a2=72) and (posunY>0) then
- begin {><}
- GotoXY(1,1);InsLine;Tisk(2,5,cs(f0(posunY)));Dec(posunY);
- end;
- if (a1=0) and (a2=77) and (posunX<(255-78)) then {doprava}
- begin { 255=mamimální délka ⌐etêzce,
- 78=poçet znakû v ⌐ádku (reæim 80x25, ale
- 2 znaky zabírá rámeçek)}
- Inc(posunX);Prekresli(False);
- end;
- if (a1=0) and (a2=75) and (posunX>1) then {doleva}
- begin
- Dec(posunX);Prekresli(False);
- end;
- if (a1=0) and (a2=81) and (posunY+19<max) then
- begin {>PageDown<}
- if posunY+38<max then Inc(posunY,19) else if posunY>=19 then posunY:=max-19 else posunY:=0;
- Prekresli(False);
- end;
- if (a1=0) and (a2=73) and (posunY>0) then
- begin {>PageUp<}
- if posunY>=19 then Dec(posunY,19) else posunY:=0;
- Prekresli(False);
- end;
- if (a1=0) and (a2=79) and (max>19) and (posunY<max-19) then
- begin {End}
- if max-19>=0 then posunY:=max-19 else posunY:=0;
- Prekresli(False);
- end;
- if (a1=0) and (a2=71) and (posunY>0) then
- begin {Home}
- posunY:=0;Prekresli(False);
- end;
- until ((a1=0) and (a2=45)) or (a1=27);
- Nastav;
- end;
-
- procedure Exec2(ProgramName,CmdLine:String);
- begin
- SwapVectors;Exec(ProgramName, CmdLine);SwapVectors;
- if DosError <> 0 then{ Error? }
- begin
- Write('Dos error #', DosError,' = ');
- case DosError of
- 2: Writeln('File not found');
- 3: Writeln('Path not found');
- 5: Writeln('Access denied');
- 6: Writeln('Invalid handle');
- 8: begin
- Writeln('Not enough memory');
- Writeln(cs('Zkuste p⌐idat do svého programu na první ⌐ádek, kterÿ pouæívá jednotku Fr_Sok,'));
- Writeln(cs('tento p⌐íkaz: "{$M $4000,0,0}" a potom zkuste program znovu p⌐eloæit a spustit.'));
- Writeln(cs('Potom by mêlo jít program správnê pouæívat.'));
- end;
- 10: Writeln('Invalid environment');
- 11: Writeln('Invalid format');
- 18: Writeln('No more files');
- else Writeln('Unknow error');
- end {end of case}
- end {end of if} else
- WriteLn('Exec successful. ',
- 'Child process exit code = ',
- DosExitCode);
- end;
-
- procedure Command(Com:String);
- begin
- if Com <> '' then
- Com := '/C ' + Com;
- SwapVectors;
- Exec(GetEnv('COMSPEC'), Com);
- SwapVectors;
- if DosError <> 0 then
- begin
- Writeln('Could not execute COMMAND.COM');
- Writeln(cs('P⌐esvêdçte se, æe promênná COMSPEC ukazuje na nezniçenÿ COMMAND.COM (mûæete ji'));
- Writeln(cs('nastavit i p⌐íkazem SHELL=disk:\cesta\COMMAND.COM) a æe máte v 1.⌐ádce Va¿eho'));
- Writeln(cs('programu uvedeno: "{$M $4000,0,0}". Potom by to mêlo jiæ fungovat.'));
- end;
- end;
-
- {$L NEKO.OBJ}
- function Nekonecno:Double; External;
-
- procedure Konec;
- begin
- TextColor(stand mod 16);TextBackGround(stand div 16);
- Window(1,1,80,25);ClrScr;
- Writeln;Writeln('Konec programu:');Halt;
- end;
-
- function Str3(prom:Extended;celkem,desetinnych:Byte):String;
- var pom:String;
- begin
- System.Str(prom:celkem:desetinnych,pom);
- Str3:=pom;
- end;
-
- { P⌐evádí celÿ ⌐etêzec na velké písmena: }
- function UpCaseString;
- var i:byte;
- begin
- for i:=0 to Length(s) do UpCaseString[i]:=UpCase(s[i]);
- end;
-
- function OdstranMezery(s:String):String;
- begin
- while Pos(' ',s)>0 do System.Delete(s,Pos(' ',s),1);
- OdstranMezery:=s;
- end;
-
- function StringBoolean(s:String):Boolean;
- begin
- s:=UpCaseString(OdstranMezery(s));
- StringBoolean:=s[1]='T'; {T - první písmeno slova TRUE}
- end;
-
- procedure Vloz(co:String;var kam:String;pozice:Byte);
- begin
- while Length(kam)<pozice-1 do kam:=kam+' ';
- System.Insert(co,kam,pozice);
- end;
-
- { Funkce "Menu3" je stejná jako funkce "Menu2", narozdíl je umoænêñ vÿbêr
- poloæek menu i my¿í.
- Funkce "Menu4" je¿tê navíc umoæñuje jakési rolování menu v p⌐ípadê, æe se
- v¿echny poloæky na obrazovku nevejdou.
- Funkce "Menu5" vÿbêr z menu, jehoæ poloæky jsou vÿstupy funkce:
- - function f(cislo:Word):String;
- - tedy pro rûzné parametry se vrátí rûzné ⌐etêzce, pro cislo=i se vrátí
- i.⌐etêzec, kterÿ se zároveñ objeví jako i. poloæka v menu (kde i je
- p⌐irozené çíslo z intervalu 1..65535, coæ je horní mez typu Word), menu
- se samoz⌐ejmê roluje, pokud je poçet poloæek vêt¿í, neæ se vejde na
- obrazovku. }
- function Menu5(x,y,ram:byte;kur:boolean;pocet:Word;f:Tfce):Word;
- label opakuj,prekresli,preskok,konec;
- var del,i,l,max,od,pa,px,py,radku,tlacitka,xm,y0,ym,w,wmin,wmax:Word;
- pom:Boolean;
- {radku = Poçet ⌐ádkû, které zabírá menu na obrazovce:}
- {od = Çíslo první poloæky zobrazené v menu sníæené o 1, standartnê 0,
- av¿ak p⌐i pohybu dolû p⌐i rolování se zvy¿uje a p⌐i pohybu nahoru p⌐i
- rolování se sniæuje.}
- pomoc:Boolean; {Zda bylo provedeno rolování a proto potom bude nutno
- p⌐epsat poloæky menu:}
- begin
- zobraz:=False;
- if (WindMin<>5377) or (WindMax<>5966) then Dialogove_Okno; {Získání parametrû nastavenÿch p⌐íkazem Window,
- umoæñuje zjistit, zda jiæ bylo pouæito Dialogove_Okno, jinak se vykreslí.}
- px:=WhereX;py:=WhereY;wmin:=WindMin;wmax:=WindMax;pa:=TextAttr; {Uloæení pûvodních hodnot.}
-
- od:=0;
-
- max:=1;l:=1;for i:=0 to pocet do if Length(f(i))>max then max:=Length(f(i));
- if Length(f(0))>0 then Inc(i,2); {V p⌐ípadê, æe je uveden nêjakÿ nadpis menu:}
- if i>10 then radku:=10 else radku:=i;
- if (x=0) or (y=0) then begin x:=Round((80-(max+2))/2);y:=Round((25-(radku+2))/2);end; {Automatická pozice menu:}
- if Length(f(0))>0 then Dec(radku,2); {V p⌐ípadê, æe je uveden nêjakÿ nadpis menu:}
-
- Prekresli: r.ax:=2;Intr(Mouse,r);
- ClrScr;TextColor(White);TextBackGround(Brown);
- barva:=obraz[(x-1)+(y-1)*80+1].barva;zobraz:=True;
-
- if Length(f(0))=0 then begin Obdelnik2(x,y,max,radku,ram,32,False);y0:=1;end
- else begin Obdelnik2(x,y,max,radku,ram,32,True);Gotoxy(2,2);Write(f(0));Inc(y,2);y0:=3;end;
- for i:=1 to radku do begin
- TextColor(White);
- GotoXY(2,y0+i);Write(f(od+i));for w:=Length(f(od+i))+1 to max do Write(' ');
- end;
- TextBackGround(pa div 16);TextColor(pa mod 16);
- Window((wmin mod 256)+1,(wmin div 256)+1,(wmax mod 256)+1,(wmax div 256)+1);
- GotoXY(1,1);if Length(f(0))>0 then Write(f(0),' ');
- Writeln(cs('Klávesami se ¿ipkami vyberte çinnost, pak stisknête ENTER.'));
- r.ax:=1;Intr(Mouse,r);
-
- opakuj:
- GotoXY(1,2);DelLine;InsLine;Writeln(cs('Çinnost: '+f(od+l)));
- if kur=False then del:=Length(f(l)) else del:=max;
- barva:=obraz[x+(y+l-1)*80+1].barva;Kurzor2(x+1,y+l,del);
- Znak(x+max+1,y+radku,25);Znak(x+max+1,y+1,24);
- r.ax:=1;Intr(Mouse,r);pom:=False;
- repeat
- repeat
- r.ax:=3;Intr(Mouse,r);xm:=r.cx div 8;ym:=r.dx div 8;tlacitka:=r.bx;
- if (tlacitka=0) and pom then goto konec;
- if (tlacitka>0) and (xm>=x) and (xm<x+max) and (ym>=y) and (ym<y+radku) then
- begin
- pom:=True;
- if tlacitka>0 then
- begin
- if l<>ym-y+1 then
- begin
- Kurzor2(x+1,y+l,del);l:=ym-y+1;r.ax:=2;Intr(Mouse,r);
-
- { Pozor p⌐i pohybu kurzorem my¿í p⌐i parametru kur=False se nemêní velikost
- kurzoru p⌐i rûznê dlouhÿch poloækách. Vylep¿it !!!}
-
- { if kur=False then del:=Length(f(l)) else del:=max;}
- GotoXY(1,2);DelLine;InsLine;Writeln(cs('Çinnost: '+f(od+l)));
- r.ax:=1;Intr(Mouse,r);
- Kurzor2(x+1,y+l,del);pom:=True;
- end;
- end;
- end else pom:=False;
- if (tlacitka>0) and (xm=x+max) and (ym=y) then begin w:=72;Delay(100);goto preskok;end;
- if (tlacitka>0) and (xm=x+max) and (ym=y+radku-1) then begin w:=80;Delay(100);goto preskok;end;
- until KeyPressed;
- w:=Ord(Readkey);
- preskok: Znak(x+max+1,y+radku,25);Znak(x+max+1,y+1,24);
-
- if (w=72) and (l+od<=1) then {Pohyb kurzorem nahoru:}
- begin
- if Length(f(0))>0 then Dec(y,2);
- Kurzor2(x+1,y+l,del);l:=radku;od:=pocet-radku;goto prekresli;
- end;
- if w=72 then
- begin
- Kurzor2(x+1,y+l,del);Dec(l);pomoc:=False;
- while l<1 do begin Inc(l);Dec(od);pomoc:=True;end;
- if cara[l]=True then Dec(l);
-
- while l<1 do begin Inc(l);Dec(od);pomoc:=True;end;
- if pomoc then
- begin
- if Length(f(0))>0 then Dec(y,2);
- goto Prekresli;
- end else goto opakuj;
- goto opakuj;
- end;
-
- if (w=80) and (l+od>=pocet) then {Pohyb kurzorem dolû:}
- begin
- if Length(f(0))>0 then Dec(y,2);
- Kurzor2(x+1,y+l,del);l:=1;od:=0;goto prekresli;
- end;
- if w=80 then {Pohyb kurzorem dolû:}
- begin
- Kurzor2(x+1,y+l,del);Inc(l);pomoc:=False;
- while l>radku do begin Dec(l);Inc(od);pomoc:=True;end;
- if cara[l] then Inc(l);
-
- while l>radku do begin Dec(l);Inc(od);pomoc:=True;end;
- if pomoc then
- begin
- if Length(f(0))>0 then Dec(y,2);
- goto Prekresli;
- end else goto opakuj;
- end;
- until (w=13);
- konec: r.ax:=2;Intr(Mouse,r);Menu5:=od+l;
- end;
-
- { Odstraní písmena s háçky a çárkami ze zadaného ⌐etêzce: }
- function Odstran_Hacky_Carky;
- var a,i:byte;
- begin
- for i:=1 to Length(s) do
- begin
- a:=Pos(s[i],male);if a>0 then s[i]:=mbez[a];
- a:=Pos(s[i],velke);if a>0 then s[i]:=vbez[a];
- end;
- Odstran_Hacky_Carky:=s;
- end;
-
- function Kod852; {P⌐evod z kódu B⌐í Kamenickÿch - kód 852}
- label vyskok;
- begin
- case c of
- 'é': begin c:=Chr(130);end;
- 'û': begin c:=Chr(133);end;
- 'É': begin c:=Chr(144);end;
- 'å': begin c:=Chr(155);end;
- 'ƒ': begin c:=Chr(156);end;
- 'ç': begin c:=Chr(159);end;
- 'á': begin c:=Chr(160);end;
- 'í': begin c:=Chr(161);end;
- 'ó': begin c:=Chr(162);end;
- 'ú': begin c:=Chr(163);end;
- 'Æ': begin c:=Chr(166);end;
- 'æ': begin c:=Chr(167);end;
- 'Ç': begin c:=Chr(172);end;
- 'Å': begin c:=Chr(181);end;
- 'ë': begin c:=Chr(183);end;
- 'à': begin c:=Chr(210);end;
- 'â': begin c:=Chr(212);end;
- 'Ñ': begin c:=Chr(213);end;
- 'ï': begin c:=Chr(214);end;
- 'ê': begin c:=Chr(216);end;
- 'ª': begin c:=Chr(222);end;
- 'ò': begin c:=Chr(224);end;
- 'ñ': begin c:=Chr(229);end;
- '¢': begin c:=Chr(230);end;
- '¿': begin c:=Chr(231);end;
- 'ù': begin c:=Chr(233);end;
- 'ÿ': begin c:=Chr(236);end;
- '¥': begin c:=Chr(237);end;
- '₧': begin c:=Chr(252);end;
- '⌐': begin c:=Chr(253);end;
- end;
- vyskok: Kod852:=c;
- end;
-
- function Kod1250; {P⌐evod z kódu B⌐í Kamenickÿch - kód 1250 (Windows)}
- label vyskok;
- begin
- case c of
- '¢': begin c:=Chr(138);goto vyskok;end;
- 'å': begin c:=Chr(141);goto vyskok;end;
- 'Æ': begin c:=Chr(142);goto vyskok;end;
- '¿': begin c:=Chr(154);goto vyskok;end;
- 'ƒ': begin c:=Chr(157);goto vyskok;end;
- 'æ': begin c:=Chr(158);goto vyskok;end;
- 'Å': begin c:=Chr(193);goto vyskok;end;
- 'Ç': begin c:=Chr(200);goto vyskok;end;
- 'É': begin c:=Chr(201);goto vyskok;end;
- 'ë': begin c:=Chr(204);goto vyskok;end;
- 'ï': begin c:=Chr(205);goto vyskok;end;
- 'à': begin c:=Chr(207);goto vyskok;end;
- 'Ñ': begin c:=Chr(210);goto vyskok;end;
- 'ò': begin c:=Chr(211);goto vyskok;end;
- '₧': begin c:=Chr(216);goto vyskok;end;
- 'ª': begin c:=Chr(217);goto vyskok;end;
- 'ù': begin c:=Chr(218);goto vyskok;end;
- '¥': begin c:=Chr(221);goto vyskok;end;
- 'á': begin c:=Chr(225);goto vyskok;end;
- 'ç': begin c:=Chr(232);goto vyskok;end;
- 'é': begin c:=Chr(233);goto vyskok;end;
- 'ê': begin c:=Chr(236);goto vyskok;end;
- 'í': begin c:=Chr(237);goto vyskok;end;
- 'â': begin c:=Chr(239);goto vyskok;end;
- 'ñ': begin c:=Chr(242);goto vyskok;end;
- 'ó': begin c:=Chr(243);goto vyskok;end;
- '⌐': begin c:=Chr(248);goto vyskok;end;
- 'û': begin c:=Chr(249);goto vyskok;end;
- 'ú': begin c:=Chr(250);goto vyskok;end;
- 'ÿ': begin c:=Chr(253);goto vyskok;end;
- end;
- vyskok: Kod1250:=c;
- end;
-
- function cs;
- begin
- case cskod of
- 1: cs:=text; {vstup je v kódu B⌐í Kamenickÿch, vÿstup je také, beze zmêny}
- 2: cs:=Kod852String(text);
- 3: cs:=Kod1250String(text);
- 4: cs:=Odstran_Hacky_Carky(text);
- end;
- end;
-
- function Kod852String; {P⌐evod z kódu B⌐í Kamenickÿch - kód 852}
- var i:Byte;
- begin
- Kod852String[0]:=s[0];for i:=1 to Length(s) do Kod852String[i]:=Kod852(s[i]);
- end;
-
- function Kod1250String; {P⌐evod z kódu B⌐í Kamenickÿch - kód 1250 (Windows)}
- var i:Byte;
- begin
- Kod1250String[0]:=s[0];for i:=1 to Length(s) do Kod1250String[i]:=Kod1250(s[i]);
- end;
-
- function Hlaseni(s:String):String;
- var i:Byte;
- begin
- Nastav;Zacatek(s);Radek('Stisknête Enter pro pokraçování...');i:=Menu3(0,0,2,True);
- end;
-
- function Adresar_Existuje(jmeno:string):Boolean;
- var puvodni:String;
- begin
- {$I-}GetDir(0,puvodni);{$I+}chyba:=IOResult;
- if chyba<>0 then begin Writeln(cs('Není moæné zjistit aktuální adresá⌐. Mûæe to nêkdy nastat???'));Konec;end;
- ChDir(jmeno);if chyba<>0 then {Nepoda⌐ilo se nastavit adresá⌐, adresá⌐ buâ neexistuje nebo je ¿patnÿ?}
- begin {Adreá⌐ neexistoval, takæe se ani nemohl zmênit (snad)..., není nutné (snad) obnovovat pûvodní adresá⌐}
- Adresar_Existuje:=False;
- end else begin
- Chdir(puvodni); {Adreá⌐ existoval a zmênil se, je nutné nastavit pûvodní...}
- if chyba<>0 then
- begin
- Writeln(cs('Nebylo moæné zmênit aktuální adresá⌐ na pûvodní adresá⌐. Mûæe to nêkdy nastat???'));Konec;
- end;
- Adresar_Existuje:=True;
- end;
- end;
-
- {const male :string[15]='áçâêéíñó⌐¿ƒúûÿæ';
- mbez :string[15]='acdeeinorstuuyz';
- velke:string[15]='ÅÇàëÉïÑò₧¢åùª¥Æ';
- vbez :string[15]='ACDEEINORSTUUYZ';}
- function UpCase(c:Char):Char;
- var a:Byte;
- begin
- if c in['a'..'z'] then Dec(c,32);
- a:=Pos(c,male);
- if a>0 then {bylo nalezeno malé písmeno} c:=velke[a];
- UpCase:=c;
- end;
-
- function DownCase(c:Char):Char;
- var a:Byte;
- begin
- if c in['A'..'Z'] then Inc(c,32);
- a:=Pos(c,velke);
- if a>0 then {bylo nalezeno velké písmeno} c:=male[a];
- DownCase:=c;
- end;
-
- function DownCaseString(s:String):String;
- var i:Byte;
- begin
- for i:=0 to Length(s) do DownCaseString[i]:=DownCase(s[i]);
- end;
-
- function OdstranZbytecneMezery(s:String):String;
- begin
- if Length(s)>0 then while (s[1]=' ') do System.Delete(s,1,1);
- while (s[Length(s)]=' ') do System.Delete(s,Length(s),1);
- while (Pos(' ',s)>0) do System.Delete(s,Pos(' ',s),1);
- OdstranZbytecneMezery:=s;
- end;
-
- procedure Vypis(var f:System.Text);
- var pom:TTextRec;
- begin
- Move(f,pom,SizeOf(TTextRec));
- Writeln('Handle: ',pom.Handle);
- Writeln('Mode: ',pom.Mode);
- Writeln('BufSize: ',pom.BufSize);
- Writeln('Private: ',pom.Private);
- Writeln('BufPos: ',pom.BufPos);
- Writeln('BufEnd: ',pom.BufEnd);
- Write('UserData: ');for i:=1 to 16 do Write(pom.UserData[i]);Writeln;
- Write('Name: ');for i:=0 to 79 do Write(pom.Name[i]);Writeln;
- Write('Buffer: ');for i:=0 to 127 do Write(pom.Buffer[i]);Writeln;
- ReadKey;
- end;
-
- var Stare0:TTextRec;
- l0:Longint;
- procedure UschovejPozici(var f:System.Text);
- begin
- Move(f,Stare0,SizeOf(System.Text));
- r.ah:=$42;r.al:=1;r.bx:=Stare0.Handle;r.cx:=0;r.dx:=0;MsDos(r);
- l0:=r.dx*65536+r.ax;
- end;
-
- procedure ObnovPozici(var f:System.Text);
- begin
- Move(Stare0,f,SizeOf(System.Text));
- r.ah:=$42;r.al:=0;r.bx:=Stare0.Handle;r.cx:=l0 div 65535;r.dx:=l0 mod 65536;
- MsDos(r);
- end;
-
- function Val(s:String):Byte;
- var pom:Longint;
- i:Integer;
- begin
- System.Val(s,pom,i);if pom<256 then Val:=pom else Val:=0;
- end;
-
- function Prevod(zdroj:String;vstupni,vystupni:Byte):String;
- const KodKam :String='áçâêéíîñó⌐¿ƒûúÿæÅÇàëÉï£Ñò₧¢åªù¥Æ';
- const Kod852 :String='áƒ╘╪éíûσó²τ£àú∞º╡¼╥╖É╓ò╒αⁿµ¢▐Θφª';
- const Kod1250:String='ßΦ∩∞Θφσ≥≤°Ü¥∙·²₧┴╚╧╠╔═╝╥╙╪èì┘┌▌Ä';
- const KodBez :String='acdeeilnorstuuyzACDEEILNORSTUUYZ';
- var pom,pom0,pom1:String;
- i,p:Integer;
- begin
- case (vstupni) of
- 1: pom0:=KodKam;
- 2: pom0:=Kod852;
- 3: pom0:=Kod1250;
- 4: pom0:=KodBez;
- end;
- case (vystupni) of
- 1: pom1:=KodKam;
- 2: pom1:=Kod852;
- 3: pom1:=Kod1250;
- 4: pom1:=KodBez;
- end;
- for i:=1 to Length(zdroj) do
- begin
- p:=Pos(zdroj[i],pom0);
- if p>0 then zdroj[i]:=pom1[p];
- end;
- Prevod:=zdroj;
- end;
-
-
-
- { Poçáteçní nastavení promênnÿch p⌐i startu programu, kde je modul FR_SOK.TPU
- pouæíván. }
- begin
- Uziv1:=VratTrue;Uziv2:=VratTrue;
- Uziv3:=VratTrue;Uziv4:=VratTrue;
- stand:=TextAttr;cskod:=1;{vÿstup v kódu B⌐í kamenickÿch}
- stav:=Zapnuta;vrat:=False;NastavTajnyZnak('*');NastavCekani(0);
- Zapni_Zvuk;TextColor(Yellow);r.ax:=0;Intr(Mouse,r);
- end.
-