[Back to MISC SWAG index] [Back to Main SWAG index] [Original]
Unit Globals;
Interface
Uses Crt{, Dos?};
{ Special keyboard Characters: }
{ I've squeezed them into a couple of lines so that they'd fit in a
message.. might be an idea to expand them back to ~20 lines or so..}
NULL = #0; BS = #8; ForMFEED = #12; CR = #13; ESC = #27;
HOMEKEY = #199; {Values apply if only used With the 'Getkey' Function}
endKEY = #207; UPKEY = #200; doWNKEY = #208;
PGUPKEY = #201; PGDNKEY = #209; LEFTKEY = #203;
inSKEY = #210; RIGHTKEY = #205; DELKEY = #211;
CTRLLEFTKEY = #243; CTRLRIGHTKEY = #244;
F1 = #187; F2 = #188; F3 = #189; F4 = #190; F5 = #191;
F6 = #192; F7 = #193; F8 = #194; F9 = #195; F10 = #196;
Type CurType = ( off, Big, Small );
Var Ins : Boolean; { Global Var containing status of Insert key}
{-----------------------------------------------------------------------------}
Function GetKey : Char;
Procedure EdReadln(Var S : String);
Procedure Cursor( Size : CurType ); { Either off, Big or Small }
Procedure ChangeCursor( Ins : Boolean );
{-----------------------------------------------------------------------------}
Implementation
Function GetKey; { : Char; }
Var C : Char;
begin
C := ReadKey;
Repeat
if C = NULL then
begin
C := ReadKey;
if ord(C) > 127 then
C := NULL
else
GetKey := Chr(ord(C) + 128);
end else GetKey := C;
Until C <> NULL;
end; { GetKey }
{-----------------------------------------------------------------------------}
Procedure EdReadln; { (Var S : String); }
{ Legal : IString; MaxLength : Word; Var ESCPressed : Boolean); }
Var CPos : Word;
Ch : Char;
OldY : Byte;
Legal : String[1];
MaxLength : Byte;
EscPressed : Boolean;
begin
OldY := WhereY - 1;
ChangeCursor(Ins);
CPos := 1; {Place cursor at START of line}
{ CPos := Succ(Length(S));} {Whereas this places cursor at end of line}
Legal := ''; {Legal and Maxlength originally passed as params}
MaxLength := Lo( WindMax ) - Lo( WindMin );
Repeat
Cursor( off );
GotoXY(1, WhereY);
Write(S, '':(MaxLength - Length(S)));
GotoXY(CPos, WhereY);
ChangeCursor(Ins);
Ch := GetKey;
Case Ch of
HOMEKEY : CPos := 1;
endKEY : CPos := Succ(Length(S));
inSKEY : begin
Ins := not Ins;
ChangeCursor(Ins);
end;
LEFTKEY : if CPos > 1 then Dec(CPos);
RIGHTKEY : if CPos <= Length(S) then Inc(CPos);
BS : if CPos > 1 then
begin
Delete(S, Pred(CPos), 1);
Dec(CPos);
end;
DELKEY : if CPos <= Length(S) then Delete(S, CPos, 1);
CR : ;
ESC : begin
S := '';
CPos := 1;
end;
else
begin
if ((Legal = '') or (Pos(Ch, Legal) <> 0)) and
((Ch >= ' ') and (Ch <= '~')) and
(Length(S) < MaxLength) then
begin
if Ins then Insert(Ch, S, CPos) else
if CPos > Length(S) then S := S + Ch else
S[CPos] := Ch;
Inc(CPos);
end;
end;
end; { Case }
Until (Ch = CR);
Cursor( Small );
ESCPressed := Ch <> ESC;
Writeln;
end; { EditString }
{-----------------------------------------------------------------------------}
Procedure Cursor; { ( Size : CurType ); { Either off, Big or Small }
Var Regs : Registers;
begin
With Regs Do begin
Ax := $100;
Case Size of
off : Cx := $3030;
Big : Cx := $0F;
Small : Cx := $607;
end;
Intr ( $10, Regs );
end;
end;
{-----------------------------------------------------------------------------}
Procedure ChangeCursor; { ( Ins : Boolean ); }
{Changes cursor size depending on status of insert key}
begin
if Ins then Cursor( Small ) else Cursor( Big );
end;
begin
end.
[Back to MISC SWAG index] [Back to Main SWAG index] [Original]