home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* READKEY.PAS *)
- (* (c) 1990 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;
- AL := FehlerCode;
- Intr(DosInterrupt, Regs);
- 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(' A:\>readkey "_Drücken_Sie_[J]a_oder_',
- '[N]ein_",jn invers');
- WriteLn(' (`_` steht für Leerzeichen)');
- WriteLn(' A:\>readkey "_Laufwerk_[A]:_oder_[C]:_?_"',
- ' ac 141');
- WriteLn(' (141 ist ein erweitertes Attribut)');
- Halt;
- END;
- Farbe := UpString(ParamStr(2));
- FestFarbe := FALSE;
- IF Length(Farbe) > 0 THEN
- FOR Loop := 1 TO 6 DO
- IF Farbe = Attribute[Loop] THEN BEGIN
- TextAttr := AttrWerte[Loop];
- Loop := 6;
- FestFarbe := TRUE;
- END;
- IF NOT FestFarbe THEN BEGIN
- Val(Farbe, ErwFarbe, Fehler);
- If Fehler = 0 THEN
- TextAttr := ErwFarbe;
- END;
- Text := ParamStr(1);
- Tasten := UpString(Text);
- Position := Pos('",', Text);
- IF (Text[1] = '"') AND ((Position > 1) OR
- (Text[Length(Text)] = '"')) THEN BEGIN
- Delete(Text, 1, 1);
- 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;
- 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 *)