home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* READKEY.PAS *)
- (* (c) 1989 by Hagen Lehmann & TOOLBOX *)
- (* ------------------------------------------------------ *)
- {$R-,S-,I-,D-,F-,V-,B-,N-,L-}
- {$M 1024,0,0}
-
- USES Crt, Dos;
- CONST
- ErrorLevelFunc = $4C;
- DosInterrupt = $21;
- Attribute : ARRAY [1..6] Of STRING[17]
- = ('HELL',
- 'HELLUNTERSTRICHEN',
- 'INVERS',
- 'NORMAL',
- 'SCHWARZ',
- 'UNTERSTRICHEN');
- AttrWerte : ARRAY [1..6] OF BYTE
- = (15, 9, 120, 7, 0, 1);
-
- VAR
- Taste : CHAR;
- Regs : Registers;
- Farbe, Text, Tasten : STRING;
- Loop, Position : BYTE;
- AktivesAttr,
- ErwFarbe : WORD;
- Fehler : INTEGER;
- FestFarbe : BOOLEAN;
-
- FUNCTION UpString(Quelle : STRING) : STRING;
- BEGIN
- FOR Loop := 1 TO Length(Quelle) DO
- Quelle[Loop] := UpCase(Quelle[Loop]);
- UpString := Quelle;
- END;
-
- PROCEDURE SetErrorLevel(FehlerCode : BYTE);
- BEGIN
- WITH Regs DO BEGIN
- ah := ErrorLevelFunc; { Funktion auswählen }
- al := FehlerCode; { Wert des Errorlevels }
- Intr(DosInterrupt, Regs); { Wert setzen }
- END;
- END;
-
- BEGIN
- AktivesAttr := TextAttr;
- IF (ParamStr(1) = '?') OR (ParamCount = 0) THEN BEGIN
- ClrScr;
- WriteLn;
- WriteLn('Aufruf : READKEY [["Text", Tasten [Farbe]]] ');
- WriteLn;
- WriteLn(' Mögliche Farben :');
- Writeln(' Hell, Hellunterstrichen, Invers, Normal, ',
- 'Schwarz, Unterstrichen');
- Writeln;
- Writeln(' Beispiel :');
- Writeln(' readkey "_Drücken_Sie_[J]a_oder_[N]ein_",',
- 'jn invers');
- Writeln(' (`_` steht für Leerzeichen)');
- Writeln(' readkey "_Laufwerk_[A]:_oder_[C]:_?_",',
- 'ac 141');
- Writeln(' (141 ist ein erweitertes Attribut)');
- Halt;
- END;
-
- Farbe := UpString(ParamStr(2)); { Farbe übernehmen }
- FestFarbe := FALSE;
- IF Length(Farbe) > 0 THEN { ist eine Farbe gegeben? }
- FOR Loop := 1 TO 6 DO { ja, welche der 6 Farben }
- IF Farbe = Attribute[Loop] THEN BEGIN
- TextAttr := AttrWerte[Loop];
- Loop := 6;
- FestFarbe := TRUE;
- END;
- IF NOT FestFarbe THEN BEGIN
- { ist es keine vorgegebene Farbe? }
- Val(Farbe, ErwFarbe, Fehler);
- { ja, erweiterte Farbe in Zahl konvertieren }
- IF Fehler = 0 THEN { ist Farbe eine Zahl? }
- TextAttr := ErwFarbe;
- { ja, erweiterte Farbe setzen }
- END;
-
- Text := ParamStr(1); { Text übernehmen }
- Tasten := UpString(Text); { Tasten übernehmen }
- Position := Pos('",', Text);{ (Position der Tasten)-2 }
-
- IF (Text[1] = '"') AND ((Position > 1) OR
- (Text[Length(Text)]='"')) THEN BEGIN
- Delete(Text, 1, 1); { Gänsefüßchen löschen }
- IF Position > 1 THEN
- Delete(Text, Position-1, Length(Text)-Position+2)
- ELSE
- Delete(Text, Length(Text), 1);
- FOR Loop := 1 TO Length(Text) DO
- IF Text[Loop] = '_' THEN Text[Loop] := ' ';
- { Leerzeichen setzen }
- IF Position > 1 THEN
- Delete(Tasten, 1, Position+1)
- { Tasten herausfiltern }
- ELSE
- Tasten := '';
- Write(Text); { Text schreiben }
- IF Tasten <> '' THEN BEGIN
- { Abfrage mit Tastenvorgaben }
- REPEAT
- Taste := UpCase(ReadKey); { Taste einlesen }
- UNTIL Pos(Taste, Tasten) > 0;
- { Position der Taste in allen Tasten }
- TextAttr := AktivesAttr;
- { Attribut wiederherstellen }
- Writeln; { Zeilenvorschub }
- SetErrorLevel(Pos(Taste, Tasten));
- { Errorlevel = Position }
- END ELSE BEGIN
- { Abfrage ohne Tastenvorgaben }
- Taste := UpCase(ReadKey);
- TextAttr := AktivesAttr;
- Writeln;
- SetErrorLevel(Ord(Taste));
- { Errorlevel = Scancode der Taste }
- END;
- END;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von READKEY.PAS *)