home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* READSTR.INC (v1.0) *)
- (* Bequeme String-Eingabe durch Ansprechen des DOS-Zeileneditors *)
- (* (c) 1987 Karsten Gieselmann & PASCAL International *)
- (* ----------------------------------------------------------------------- *)
- TYPE StringType = STRING[255];
- Registers = RECORD
- CASE INTEGER OF
- 1: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : INTEGER);
- 2: (AL,AH,BL,BH,CL,CH,DL,DH : BYTE)
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE ReadString (VAR s :StringType; MaxLen :BYTE);
- CONST DosBackColor = Black; (* hier müssen die DOS-Farben stehen! *)
- DosForeColor = LightGray;
- VAR Regs : Registers;
- TextAttr : BYTE ABSOLUTE DSeg:$0008; (* Turbo's Videoattribut *)
- Strg : StringType;
- Max : BYTE;
- (* -------------------------------------------------------------------- *)
- (* Ausgabe eines Strings über DOS (notwendig für ANSI-Sequenzen) *)
- PROCEDURE Display (s : StringType);
- VAR Regs : Registers;
- BEGIN
- s := s + '$'; (* Delimiter anfügen *)
- WITH Regs DO BEGIN
- AH := $09; (* Funktion Nr.09h: DISPLAY STRING *)
- DS := Seg (s);
- DX := Succ (Ofs(s)); (* Längenbyte ist unwichtig für DOS *)
- END;
- MsDos (Regs);
- END;
- (* -------------------------------------------------------------------- *)
- (* Umwandlung einer ganzen Zahl in eine Zeichenkette *)
- FUNCTION NumStr (Num : INTEGER) : StringType;
- VAR s : StringType;
- BEGIN
- Str (Num, s); NumStr := s
- END;
- (* -------------------------------------------------------------------- *)
- (* übergibt die im Attributbyte "Attr" enthaltenen Information an ANSI *)
- PROCEDURE SetANSIAttr (Attr : BYTE);
- VAR ForeColor,
- BackColor : BYTE;
- Blink,
- Bold : BOOLEAN;
- BEGIN
- ForeColor := Attr MOD 16; BackColor := Attr DIV 16;
- Blink := (BackColor > 7); Bold := (ForeColor > 7);
- BackColor := BackColor MOD 8; ForeColor := ForeColor MOD 8;
- Display (^['[0;' + NumStr(ForeColor+30) + ';' + NumStr(BackColor+40));
- IF Blink THEN Display (';5');
- IF Bold THEN Display (';1');
- Display ('m'); (* Abschluß der ANSI-Sequenz *)
- END;
- (* -------------------------------------------------------------------- *)
- BEGIN
- IF MaxLen < 255 THEN Max := Succ (MaxLen) (* abschließendes CR berücks. *)
- ELSE Max := MaxLen;
- SetANSIAttr (TextAttr); (* DOS auf aktuelle Turbo-Farben einstellen *)
- WITH Regs DO BEGIN
- AH := $0A; (* Funktion Nr.0Ah: BUFFERED KEYBOARD INPUT *)
- DS := Seg (Max);
- DX := Ofs (Max); (* DS:DX zeigt jetzt auf den Stack (auf Max) *)
- END;
- MsDos (Regs);
- SetANSIAttr (DosBackColor SHL 4 + DosForeColor); (* alte DOS-Farben *)
- s := Strg;
- END;
- (* ----------------------------------------------------------------------- *)
- (* READSTR.INC (v1.0) *)
-