home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* COMEDIT.INC *)
- (* Implementation des Kommandozeileneditors *)
- (* ----------------------------------------------------------------------- *)
- CONST Left = #$4B; { ........ Cursor ein Zeichen nach links }
- Right = #$4D; { ........ Cursor ein Zeichen nach rechts }
- CtrlLeft = #$73; { ........ Cursor ein Wort nach links }
- CtrlRight = #$74; { ........ Cursor ein Wort nach rechts }
- Home = #$47; { ........ Cursor an den Anfang der Eingabezeile }
- End_ = #$4F; { ........ Cursor an das Ende der Eingabezeile }
- Del = #$53; { ........ Zeichen unter Cursor löschen }
- BackSpace = #$08; { ........ Zeichen links vom Cursor löschen }
- CtrlHome = #$77; { ........ Löschen von Zeilenanfang bis Cursor }
- CtrlEnd = #$75; { ........ Löschen vom Cursor bis Zeilenende }
- Esc = #$1B; { ........ Löschen der gesamten Eingabezeile }
- Ins = #$52; { ........ Einfügemodus an/aus }
- Return = #$0D; { ........ Eingabe beenden }
- Up = #$48; { ........ holt letztes DOS-Kommando aus Puffer }
- Down = #$50; { ........ holt nächstes DOS-Kommando aus Puffer }
- CtrlPgUp = #$84; { ........ löscht gesamten Puffer }
- CtrlPgDn = #$76; { ........ löscht angezeigten Puffereintrag }
- (* ----------------------------------------------------------------------- *)
- PROCEDURE EditString (VAR s : StringType; MaxLen : BYTE);
- CONST Extended = #0;
- on = TRUE;
- off = FALSE;
- Letters : SET OF CHAR = ['A'..'Z','a'..'z','ß',
- 'Ä','Ö','Ü','ä', 'ö','ü'];
- VAR x,y,xpos,ypos,
- i,p,
- CharsChanged,
- OverwriteShape,
- InsertShape : INTEGER;
- CursorShape : INTEGER ABSOLUTE $0040:$0060; (* Cursorform *)
- MaxCols : INTEGER ABSOLUTE $0040:$004A; (* Bildschirmbreite *)
- c : CHAR;
- MacroBuffer : StringType;
- Quit,
- InsMode : BOOLEAN;
- Len : BYTE ABSOLUTE s;
- (* -------------------------------------------------------------------- *)
- (* legt Einfüge-/Überschreibmodus fest *)
- PROCEDURE SetInsMode (Mode : BOOLEAN);
- BEGIN
- InsMode := Mode;
- IF InsMode THEN SetCursorShape (InsertShape)
- ELSE SetCursorShape (OverwriteShape);
- END;
- (* -------------------------------------------------------------------- *)
- (* holt Zeichen: falls vorhanden aus Makropuffer, sonst von Tastatur *)
- PROCEDURE GetChar (VAR c : CHAR);
- BEGIN
- IF MacroBuffer = '' THEN Read (c)
- ELSE BEGIN
- c := MacroBuffer[1]; Delete (MacroBuffer,1,1);
- END;
- END;
- (* -------------------------------------------------------------------- *)
- BEGIN
- xpos := WhereX; ypos := WhereY; (* Home-Position *)
- s := ''; p := Succ (Len); (* Cursor-Position im String *)
- Quit := FALSE; (* Flagbyte für Eingabe abgeschlossen *)
- InsMode := FALSE; (* Flagbyte für Einfügemodus an/aus *)
- BufPtr := TailPtr;
- CharsChanged := 0; MacroBuffer := ''; OverwriteShape := CursorShape;
- InsertShape := (Lo(CursorShape) SHR 1) SHL 8 + Lo(CursorShape);
- REPEAT
- x := Succ ((xpos+p-2) MOD MaxCols); (* Cursor-Position in s ermitteln *)
- y := ypos + (xpos+p-2) DIV MaxCols;
- GotoXY (x,y);
- IF CharsChanged <> 0 THEN BEGIN (* hat sich in s etwas geändert? *)
- FOR i := p TO Len DO Write (s[i], ypos);
- FOR i := 1 TO -CharsChanged DO Write (' ', ypos);
- GotoXY (x,y);
- END;
- CharsChanged := 0;
- GetChar (c);
- IF c >= ' ' THEN BEGIN
- IF p = Succ(Len) THEN (* Zeichen hinten anhängen? *)
- IF Len < MaxLen THEN BEGIN
- Write (c, ypos); s := s + c; p := Succ (p)
- END
- ELSE
- ELSE IF NOT InsMode THEN BEGIN
- Write (c, ypos); s[p] := c; p := Succ (p)
- END
- ELSE IF Len < MaxLen THEN BEGIN
- s := Copy (s,1,Pred(p)) + c + Copy (s,p,Len);
- p := Succ (p); CharsChanged := +1; Write (c, ypos)
- END
- END
- ELSE BEGIN
- IF c = Extended THEN GetChar (c);
- CASE c OF
- Left : IF p > 1 THEN p := Pred(p);
- Right : IF p <= Len THEN p := Succ(p);
- CtrlLeft : BEGIN
- WHILE NOT (s[Pred(p)] IN Letters) AND (p > 1) DO
- p := Pred(p);
- WHILE (s[Pred(p)] IN Letters) AND (p > 1) DO
- p := Pred(p);
- END;
- CtrlRight : BEGIN
- WHILE (s[p] IN Letters) AND (p <= Len) DO
- p := Succ(p);
- WHILE NOT (s[p] IN Letters) AND (p <= Len) DO
- p := Succ(p);
- END;
- Home : p := 1;
- End_ : p := Succ (Len);
- Del : IF p <> Succ(Len) THEN BEGIN
- Delete (s, p, 1); CharsChanged := -1;
- END;
- BackSpace : IF p > 1 THEN BEGIN
- p := Pred (p); Delete (s, p, 1); CharsChanged := -1;
- END;
- CtrlHome : BEGIN
- IF p = Succ(Len) THEN s := ''
- ELSE s := Copy (s, p, Len-Pred(p));
- CharsChanged := -Pred(p);
- p := 1;
- END;
- CtrlEnd : BEGIN
- CharsChanged := Pred(p) - Len;
- IF p = 1 THEN s := ''
- ELSE s := Copy (s, 1, Pred(p))
- END;
- Esc : BEGIN
- SetInsMode (off);
- CharsChanged := -Len;
- s := ''; p := 1
- END;
- Ins : SetInsMode (NOT InsMode);
- Up : MacroBuffer := Esc + LastEntry (BufPtr);
- Down : MacroBuffer := Esc + NextEntry (BufPtr);
- CtrlPgUp : BEGIN
- ClearBuffer; MacroBuffer := Esc
- END;
- CtrlPgDn : BEGIN
- DeleteEntry (BufPtr);
- MacroBuffer := Esc + CurrentEntry(BufPtr)
- END;
- Return : BEGIN
- Quit := TRUE; Write (c, ypos)
- END;
- END; (* CASE *)
- END; (* ELSE *)
- UNTIL Quit;
- SetInsMode (off);
- IF s <> CurrentEntry (BufPtr) THEN
- IF Length(s) > 2 THEN AppendEntry (s)
- END;
- (* ----------------------------------------------------------------------- *)
- (* COMEDIT.INC *)
-