home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1999 September
/
Chip_1999-09_cd.bin
/
internet
/
Jeremy
/
tp
/
downloads
/
vstupy.pas
< prev
Wrap
Pascal/Delphi Source File
|
1999-08-03
|
16KB
|
483 lines
Unit Vstupy;
Interface
uses dos, crt, savewind;
const
Null = #0;
BS = #8;
TAB = #9;
CR = #13;
Esc = #27;
Space = #32;
F1 = #187;
F2 = #188;
F3 = #189;
F4 = #190;
F5 = #191;
F6 = #192;
F7 = #193;
F8 = #194;
F9 = #195;
F10 = #196;
Home = #199;
EndK = #207;
Ins = #210;
Del = #211;
Up = #200;
Down = #208;
Left = #203;
Right = #205;
PgUp = #201;
PgDn = #209;
type
CharSet = set of char;
Retezec = string[80];
var TimeOut:longint; {Round(sekundy * 18.18)}
JeSaver: boolean;
KursType: word;
procedure KbdClear;
{ maºe vyrovnávací pam╪£ klávesnice }
procedure WaitTo; { ƒeká na stisk klávesy }
procedure Saver;
function GetKey : char; { vrací znak z klávesnice }
{!! Základní funkce pro vstup, náhrada fce Readkey z unitu Crt !!}
function GetLegalKey(LegalSet : CharSet) : char;
{ ¼eká na stisk klávesy, která pat²í do mnoºiny LegalSet
(nan jiné klávesy nereaguje }
function GetString(X,Y,Delka : byte) : Retezec;
{ Naƒte ²et╪zec o zadané délce z pozice (X,Y) }
{ Delka : délka pole, do kterého se má ²et╪zec vkládat }
function GetChar(Sl, Row : byte) : char;
{ Vrací znak p²eƒten∞ z dané pozice (Sl,Row) }
{ Sl - ƒíslo sloupce vstupního pole;
Row - ƒíslo ²ádku vstupního pole }
function GetInteger(Sl,Row,Len : byte;Low,High : integer):integer;
{ Sl - ƒíslo sloupce, na kterém má vstup zaƒínat;
Row - ƒíslo ²ádku, na kterém má vstup zaƒínat;
Len - poƒet ƒíslic, které budou zadávány;
Low - nejmenτí ƒíslo, které màºe b∞t zadáno;
High - nejv╪tτí ƒíslo, které màºe b∞t zadáno:
Funkce vrací ƒíslo typu integer; }
function GetReal(Sl,Row,Len : byte;Low,High : real):real;
{ Sl - ƒíslo sloupce, na kterém má vstup zaƒínat;
Row - ƒíslo ²ádku, na kterém má vstup zaƒínat;
Len - poƒet ƒíslic, které budou zadávány;
Low - nejmenτí ƒíslo, které màºe b∞t zadáno;
High - nejv╪tτí ƒíslo, které màºe b∞t zadáno:
Funkce vrací ƒíslo typu real; }
procedure EditString(X,Y,Delka : byte; var st:string);
{ Slouºí k editaci ²et╪zce dané délky na pozici (X,Y)
P²i stisku klávesy ESC vrací prázdn∞ ²et╪zec }
procedure EditWord(Sl,Row,Len: byte;Low,High,Def: word;var w:word);
{ Slouºí k editaci ƒísla typu word na dané pozici;
Len - délka pole pro editaci ƒísla (=poƒet ƒíslic)
Low, High - nejmenτí a nejv╪tτí p²ípustné ƒíslo
Def - implicitní hodnota p²i prázdném vstupu }
function Real2Str(x: real):string;
procedure EditReal(Sl,Row,Len: byte;Low,High,def: real;var w:real);
{ Slouºí k editaci ƒísla typu real na dané pozici;
Len - délka pole pro editaci ƒísla (=poƒet ƒíslic)
Low, High - nejmenτí a nejv╪tτí p²ípustné ƒíslo
Def - implicitní hodnota p²i prázdném vstupu }
procedure skryjkursor;
procedure obnovkursor;
implementation
var screen: pbuf;
procedure skryjkursor; assembler;
asm
push AX;
push BX;
push CX;
push DX;
mov BH,0;
mov AH,03h;
int 10h;
mov KursType,CX;
or CH,20h;
mov AH,01h;
int 10h;
pop DX;
pop CX;
pop BX;
pop AX;
end;
procedure ObnovKursor; assembler;
asm
push AX;
push BX;
push CX;
mov CX,KursType;
mov AH,01h;
int 10h;
pop CX;
pop BX;
pop AX;
end;
Procedure KbdClear;assembler;
asm
@@1: mov AH,11h
int 16h
jz @@2
mov AH,10h
int 16h
jmp @@1
@@2:
end;
procedure WaitTo;
begin
KbdClear;
repeat until KeyPressed;
end;
{------------SETRIC-------------}
procedure Saver;
const
Flakes = 80;
Procedure vidMode(mode : byte);assembler;
asm
mov ah,$00;
mov al,mode;
int 10h;
end;
Procedure setPixel(pixPos : word; color : byte);
begin
mem[$A000:pixPos] := color;
end;
var
CurFlake : integer;
i : longint;
x,y, newPos: array[0..Flakes] of word;
b: byte absolute $0000:$0449;
ax, ay: byte;
BEGIN
if (JeSaver=false) or (b=7) then exit;
ax:=wherex;
ay:=wherey;
savewin(1,1,80,25,screen);
randomize;
for curFlake:=0 to Flakes do { set up snow lookup table }
begin
x[curFlake]:=random(319);
y[curFlake]:=random(199);
end;
vidMode($13); { 320x200x256 graphics mode }
i := 0; { change to 100 or higher to get rid of start explosion }
repeat
inc(i);
for curFlake:=0 to Flakes do
begin
setPixel(newPos[curFlake], 0); { erase old snowflake }
newPos[curFlake] := { set up and draw new snowflake }
round(x[curFlake]*(i*0.01)) + { new X }
round(y[curFlake]*(i*0.01)) * 320; { new Y }
setPixel(newPos[curFlake], 16-(curflake mod 8));
end; {(curFlake mod 13) + 19}
while (port[$3da] and $08) = $08 do; { wait for vRetrace to }
while (port[$3da] and $08) = $00 do; { start and end }
until keypressed;
vidMode($03); { return to 80x25 textmode }
restorewin(1,1,80,25,screen);
gotoxy(ax,ay);
end;
Function GetKey : char;
var
Key : char; t:longint;
begin
KbdClear; { vyprázdni buffer klávesnice}
t:=MemL[Seg0040:$006c]; { poƒet tikà hodin}
repeat
if (MemL[Seg0040:$006C]-t > TimeOut) then
begin
Saver;
t:=MemL[Seg0040:$006C];
KbdClear;
end;
until KeyPressed; { ƒekej na stisk libovolné klávesy }
Key := ReadKey; { p²eƒti znak z klávesnice }
if (Key = Null) and KeyPressed then
begin { jestliºe se jedná o rozτí²enou
klávesu }
Key := ReadKey;{ p²eƒti druh∞ byte kódu klávesy }
key:= Chr(Ord(Key)+128);
end;
GetKey := Key;
end;
Function GetLegalKey(LegalSet : CharSet) : char;
var
Key : char;
begin
repeat
Key := GetKey; { ƒekej na vstup z klávesnice}
until Key in LegalSet;{ pat²í znak do mnoºiny ? }
GetLegalKey := Key;
end;
function GetString(X,Y,Delka : byte) : Retezec;
{ Delka : délka pole, do kterého se má ²et╪zec vkládat }
function Input(Max : byte;
Sl,R : word;
var S : Retezec) : char;
{ Funkce ƒeká na vstup z klávesnice a vrací znakovou
reprezentaci stisknuté klávesy. }
var
Inp : char; { vkládan∞ znak }
Len : byte absolute S;{ aktuální délka vkládaného ²et╪zce}
begin
Inp := GetLegalKey([#32..#169, BS, CR]);
case Inp of
{ jestliºe se stiskne zobraziteln∞ znak ze spodní poloviny
tabulky ASCII a aktuální délka ²et╪zce je menτí neº povolené
maximum, znak se p²idá do ²et╪zce a zobrazí za posledním
znakem ²et╪zce }
#32..#169 : if Len < Max then
begin
S := S + Inp;
GotoXY(WhereX,WhereY);
Write(Inp);
end;
{ jestliºe se stiskne klávesa BackSpace, poslední vloºen∞
znak se vymaºe }
BS : if Len>0 then
begin
Write(Bs+' '+Bs);
Delete(S,Len,1);
end;
ESC : S := ESC;
end;
Input := Inp;
end;
var
S : Retezec;
Ch : char;
begin
S := ''; gotoxy(X,Y);
repeat
Ch := Input(Delka,X, Y, S);
until Ch in [ESC, CR];
if S <> ESC then
GetString := S
else
GetString := '';
end;
function GetChar(Sl, Row : byte) : char;
{ Sl - ƒíslo sloupce vstupního pole;
Row - ƒíslo ²ádku vstupního pole }
var
S : Retezec;
begin
S := GetString(Sl, Row, 1);
If S[0] <> #0 then
GetChar := S[1];
end;
function GetInteger(Sl,Row,Len : byte;Low,High : integer):integer;
var
S : Retezec; { vstupní ²et╪zec ƒíslic }
N, R : integer; { N - v∞sledek zp╪tného p²evodu }
{ R - kontrolní kód zp╪tného p²evodu }
Good : boolean; { pomocná prom╪nná }
begin
Good := False;
repeat
GotoXY(Sl,Row);Write(' ':Len);
S := GetString(Sl, Row, Len); { vstup ƒíslic do ²et╪zce }
Val(S, N, R); { p²evod ²et╪zce na ƒíslo typu integer }
Good := ((N >= Low) and (N <= High) and (R = 0) and
(S <> '')); { test správnosti ƒísla }
until Good; { opakování vstupu je-li zadání τpatné }
GetInteger := N;
end;
function GetReal(Sl,Row,Len : byte;Low,High : real):real;
{ Sl - ƒíslo sloupce, na kterém má vstup zaƒínat;
Row - ƒíslo ²ádku, na kterém má vstup zaƒínat;
Len - poƒet ƒíslic, které budou zadávány;
Low - nejmenτí ƒíslo, které màºe b∞t zadáno;
High - nejv╪tτí ƒíslo, které màºe b∞t zadáno:
Funkce vrací ƒíslo typu real; }
var
S : Retezec; { vstupní ²et╪zec ƒíslic }
N : real; { N - v∞sledek zp╪tného p²evodu }
R : integer; { R - kontrolní kód zp╪tného p²evodu }
Good : boolean; { pomocná prom╪nná }
begin
Good := False;
repeat
GotoXY(Sl,Row);Write(' ':Len);
S := GetString(Sl, Row, Len); { vstup ƒíslic do ²et╪zce }
Val(S, N, R); { p²evod ²et╪zce na ƒíslo typu integer }
Good := ((N >= Low) and (N <= High) and (R = 0) and
(S <> '')); { test správnosti ƒísla }
until Good; { opakování vstupu je-li zadání τpatné }
GetReal := N;
end;
Procedure EditString(X,Y,Delka : byte; var st:string);
{ Delka : délka pole, do kterého se má ²et╪zec vkládat }
function Input(Max : byte;
Sl,R : word;
var S : string) : char;
{ Funkce ƒeká na vstup z klávesnice a vrací znakovou
reprezentaci stisknuté klávesy. }
var
Inp : char; { vkládan∞ znak }
Len : byte absolute S;{ aktuální délka vkládaného ²et╪zce}
pos : byte;
begin
pos:=whereX-Sl; {na zaćtku nula}
Inp := GetLegalKey([#32..#169, BS, CR, Right, Left, Del]);
case Inp of
#32..#169 : if Len < Max then
if Pos=Len then
begin
S := S + Inp;
GotoXY(WhereX,WhereY); Write(Inp);
inc(pos)
end
else
begin
Inc(pos);Insert(Inp,S,Pos);
Gotoxy(X,Y);write(S);
GotoXY(X+Pos,Y);
end;
BS : if pos>0 then
begin
Delete(S,Pos,1);Dec(pos);
Gotoxy(X,Y);write(S,' ':max-len);
GotoXY(X+Pos,Y)
end;
Del : if pos<len then
begin
Delete(S,Pos+1,1);
Gotoxy(X,Y);write(S,' ':max-len);
GotoXY(X+Pos,Y)
end;
Right :if pos<Len then begin
Inc(pos);gotoxy(X+pos,Y)
end;
Left : if pos>0 then begin
Dec(pos);gotoxy(x+pos,Y)
end;
ESC : begin gotoxy(x,y);write(' ':delka);S := ESC;
end;
end;
Input := Inp;
end;
var
S : string;
Ch : char;
begin
S := St; gotoxy(X,Y);write(St);gotoxy(X,Y);
repeat
Ch := Input(Delka,X, Y, S);
until Ch in [ESC, CR];
if S <> ESC then
St := S
else
St := '';
end;
Procedure EditWord(Sl,Row,Len: byte;Low,High,def: word;var w:word);
{Def - p²eddefinovaná hodnota p²i prázdném vstupu}
var
S : string; { vstupní ²et╪zec ƒíslic }
l :byte absolute S;
N, R : word;
Good : boolean; { pomocná prom╪nná }
begin
Good := False;
if (w<Low) or (w>High) then S:='' else Str(w, S);
repeat
GotoXY(Sl,Row);Write(S,' ':len-l);
EditString(Sl, Row, Len,S); { vstup ƒíslic do ²et╪zce }
Val(S, N, R); { p²evod ²et╪zce na ƒíslo typu word }
if (r=0) and ((n<Low) or (n>high)) then s:=''; {Ēslo mimo rozsah}
Good := ((N >= Low) and (N <= High) and (R = 0))
or ((s='') and (r<>0));
if not good then s:=''
until Good ; { opakování vstupu je-li zadání τpatné }
if S='' then begin N:=def;
gotoxy(Sl, Row); write(' ':Len);
gotoxy(Sl, Row); write(N);
end;
w:=N;
end;
Function Real2Str(x: real):string;
var s:string;
i,j:byte;
nula:boolean;
len:byte absolute s; {aktuální délka ²et╪zce S}
begin
Str(x:1:12,S);
j:=len+1; nula:=true;
for i:=len downto 1 do {najde 1. nev∞znamnou nulu}
if nula and (s[i]='0') then j:=i else nula:=false;
Delete(s, j, 20); {odstraní nev∞znamné nuly na konci}
if s[len]='.' then Delete(s, j-1, 1);
Real2Str:=S;
end;
Procedure EditReal(Sl,Row,Len: byte;Low,High,def: real;var w:real);
{Def - p²eddefinovaná hodnota p²i prázdném vstupu}
var
S : string; { vstupní ²et╪zec ƒíslic }
l : byte absolute S;
N : real;
R : word;
Good : boolean; { pomocná prom╪nná }
begin
Good := False;
if (w<Low) or (w>High) then S:='' else S:=Real2Str(w);
repeat
GotoXY(Sl,Row);Write(S,' ':len-l);
EditString(Sl, Row, Len,S); { vstup ƒíslic do ²et╪zce }
R:=Pos(',', S); {nahrazeni carky teckou}
if R<>0 then S[R]:='.';
Val(S, N, R); { p²evod ²et╪zce na ƒíslo typu real }
if (r=0) and ((n<Low) or (n>high)) then s:=''; {Ēslo mimo rozsah}
Good := ((N >= Low) and (N <= High) and (R = 0))
or ((s='') and (r<>0));
if not good then s:=''
until Good ; { opakování vstupu je-li zadání τpatné }
if S='' then begin N:=def;
gotoxy(Sl, Row); write(' ':Len);
gotoxy(Sl, Row); write(real2str(N));
end;
w:=N;
end;
BEGIN
JeSaver:=false;
Timeout:=(Round(55*18.18));
END.