home *** CD-ROM | disk | FTP | other *** search
- (**************************************************************************)
- (* *)
- (* 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;
- Write(' ':maxlen); Gotoxy(succ(x),y);
- 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;
-
- (*------------------------------------------------------------------------*)