Contributor: SWAG SUPPORT TEAM 
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 := 0ドルF;
 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.
 

AltStyle によって変換されたページ (->オリジナル) /