home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
readstr.inc
< prev
next >
Wrap
Text File
|
1987-02-03
|
6KB
|
156 lines
(**************************************************************************)
(* *)
(* READSTR.INC - Editieren von String-Eingaben *)
(* *)
(* --- Vers 1.0 --- *)
(* *)
(**************************************************************************)
PROCEDURE ReadStr (VAR s: strg; xpos, ypos, MaxLen: INTEGER; Prompt: Strg);
(* ASCII-Steuerzeichen: *)
CONST LEFT = ^S; (* Cursor links : CONTRL-S *)
RIGTH = ^D; (* Cursor rechts : CONTRL-D *)
WORDL = ^A; (* Cursor zum Anfang des letzten Wortes *)
WORDR = ^F; (* Cursor zum Anfang des naechsten Worts *)
CLEAR = ^G; (* Zeichen unter Cursor loeschen *)
DEL = #127; (* Zeichen links von Cursor loeschen *)
CLRWRD = ^T; (* loescht das Wort rechts vom Cursor *)
CLRALL = ^Y; (* gesamte Eingabezeile loeschen *)
RETURN = ^M; (* Abschluss der Zeile *)
PREFIX = ^Q; (* Prefix fuer die folgenden Kommandos: *)
BEGINP = ^S; (* Cursor an Anfang der Eingabezeile *)
ENDINP = ^D; (* Cursor ans Ende der Eingabezeile *)
CLREST = ^Y; (* Eingabezeile ab Cursor loeschen *)
Letters: SET OF CHAR = ['0'..'9','A'..'Z','a'..'z'];
VAR x, y, i, j, p, Len: INTEGER;
Inpt : strg;
Key,
ErasedChar : CHAR;
EndOfInpt,
WriteFlag,
ClearFlag : BOOLEAN;
BEGIN
GotoXY(xpos, ypos); Write (Prompt);
xpos := xpos + Pred(Length(Prompt));
x := xpos;
y := ypos;
p := 1; (* Cusor-Position im Srtring *)
Len := 0; (* aktuelle Laenge des Strings *)
Inpt := '';
EndofInpt := FALSE;
IF NOT (MaxLen IN [0..255]) THEN MaxLen := 0;
REPEAT
WriteFlag := FALSE;
ClearFlag := FALSE;
REPEAT UNTIL KeyPressed; (* auf Tastendruck warten *)
Read (Kbd, Key); (* und Zeichen ohne Eche lesen *)
CASE Key OF
LEFT: IF p >= 2 THEN p := Pred(p);
RIGTH: IF p <= Len THEN p := Succ(p);
WORDL: BEGIN
IF p <> 1 THEN
IF NOT (Inpt[p-1] IN Letters) THEN
WHILE NOT (Inpt[p-1] IN Letters) AND (p > 1) DO
p := Pred(p);
WHILE (Inpt[p-1] IN Letters) AND (p > 1) DO
p := Pred(p);
END;
WORDR: BEGIN
WHILE (Inpt[p] IN Letters) AND (p <= Len) DO
p := Succ(p);
WHILE NOT (Inpt[p] IN Letters) AND (p <= Len) DO
p := Succ(p);
END;
CLEAR: IF p <> Succ(Len) THEN
BEGIN
ClearFlag := TRUE;
WriteFlag := TRUE;
Delete(Inpt, p, 1);
Len := Pred(Len);
END;
CLRWRD: BEGIN
j :=0;
IF Len > 0 THEN
REPEAT
ErasedChar := Inpt[p];
Delete(Inpt,p,1);
Len := Pred(Len);
j := Succ(j);
UNTIL NOT (Inpt[p] IN Letters) OR
NOT (ErasedChar IN Letters) OR (p > Len);
Write(Copy(Inpt, p, Len-p+1));
FOR i := 1 TO j DO Write(' ');
GotoXY(x+p, y);
END;
DEL: IF p >= 2 THEN
BEGIN
ClearFlag := TRUE;
WriteFlag := TRUE;
Delete(Inpt, p-1, 1);
Len := Pred(Len);
p := Pred(p);
END;
CLRALL: BEGIN
x := xpos;
y := ypos;
p := 1;
GotoXY(x+p, y);
FOR i := 1 TO Len DO Write (' ');
Len := 0;
Inpt := '';
END;
RETURN: EndOfInpt := TRUE;
PREFIX: BEGIN
REPEAT UNTIL KeyPressed;
Read (Kbd, Key);
CASE Key OF
CLREST: BEGIN
FOR i := p TO Len DO Write (' ');
Len := Pred(p);
Inpt := Copy(Inpt, 1, Pred(p));
END;
BEGINP: BEGIN
x := xpos;
y := ypos;
p := 1
END;
ENDINP: p := Succ (Len)
END;
END;
ELSE
IF (Key >= ' ') AND (Len < MaxLen) THEN
BEGIN
Inpt := Copy(Inpt, 1, p-1) + Key + Copy(Inpt, p, Len);
Write(Key);
IF p <> Succ(Len) THEN WriteFlag := TRUE;
Len := Succ(Len);
p := Succ(p);
END;
END;
WHILE x+p > 80 DO
BEGIN
x := x - 80;
y := Succ(y);
END;
WHILE x+p < 1 DO
BEGIN
x := x + 80;
y := Pred (y);
END;
IF WriteFlag THEN
BEGIN
GotoXY(x+p, y);
Write(Copy(Inpt, p, Len-p+1));
END;
IF ClearFlag THEN Write (' ');
GotoXY(x+p, y);
UNTIL EndOfInpt;
s := Inpt;
END;
(*------------------------------------------------------------------------*)