home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* README.PAS v2.31 *)
- (* Copyright (C) 1993, 1994 J. Braun & toolbox *)
- (* Compiler: Turbo Pascal/Borland Pascal 7.0 *)
- (* ------------------------------------------------------ *)
- (* Funktion: Lesen von Texten, die via »READTEXT.TPU« *)
- (* eingelinkt werden. READTEXT.PAS wird mit »MAKERD.PAS« *)
- (* erzeugt und enthält den Inhalt einer max. 63 KBytes *)
- (* großen Textdatei als Pascal-Unit. *)
- (* README.PAS darf nur im REAL-MODE compiliert werden, *)
- (* da direkte Speicherzugriffe verwendet werden. *)
- (* ====================================================== *)
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X+,P-,Q-,T-,Y-}
- {$M $3FF1,0,$FFFF}
- {$IFNDEF VER70} Fehler: Falsche Compiler-Version {$ENDIF}
- {$IFDEF Windows} Fehler: Falsches Target! {$ENDIF}
- {$IFDEF DPMI} Fehler: Falsches Target! {$ENDIF}
-
- PROGRAM ReadMe;
-
- USES
- Crt, Dos, Strings, Printer, Cursor, ReadUnit, ReadText;
-
- (* Den Quellcode der Units »ReadUnit« und »Cursor« finden *)
- (* Sie in: Borland GmbH (Hrsg.): Borland Pascal 7.0 - Das *)
- (* Buch; te-wi Verlag, 1993, ISBN 3-89362-288-8, DM 89,-- *)
- (* verwendet mit freundl. Genehmigung des te-wi Verlags *)
-
- {$I lines.inc}
-
- TYPE
- tTextScreen = ARRAY[0..24, 0..79] OF RECORD
- char: CHAR;
- attr: BYTE;
- END;
-
- CONST
- scrollwait : WORD = 333; (* Wartezeit beim Scrollen *)
- FirstPosition = 0; (* Anzahl der Spaces links vom Text *)
- (* --> in diesem Fall keine ! *)
- StatusColor : BYTE = $70; (* schwarz auf weiß *)
- ErrorColor : BYTE = $74; (* rot auf weiß *)
- PrintColor : BYTE = $47; (* weiß auf rot *)
- SearchColor : BYTE = $9F; (* weiß auf blau blinkend *)
- HelpColor : BYTE = $30; (* schwarz auf Cyan *)
- DosBoxColor : BYTE = $1F; (* weiß auf blau *)
- NormColor : BYTE = $1E; (* gelb auf blau *)
-
- MyCopyright : pChar = 'Erzeugt mit dem Readme-Builder '
- + 'der toolbox, (C) 1993 - 94 J. '
- + 'Braun & toolbox'#0;
- StatusLine : pChar =
- '['#24']['#25'] [Bild'#24']'
- + '[Bild'#25'] [Pos1][Ende] '
- + '[S]uche [W]eiter e[X]it [D]rucken'
- + ' [F1]Hilfe';
-
- Incr = TRUE;
- Decr = FALSE;
-
- VAR
- (* Es wird auf Performance-Gründen gnadenlos in den *)
- (* Bildschirmspeicher geschrieben (Untersch. HGC/Color) *)
- MonoScreen : tTextScreen ABSOLUTE $B000:$0000;
- ColorScreen : tTextScreen ABSOLUTE $B800:$0000;
-
- ActualColor : BYTE;
- DoBeep, Monochrom : BOOLEAN;
- LastSearch, LCStr : STRING;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE Beep(CONST Wait : Word);
- BEGIN
- IF DoBeep THEN BEGIN
- Sound(900);
- Delay(50);
- NoSound;
- END;
- IF Wait > 0 THEN Delay(Wait);
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE OutTextXY(CONST s : STRING;
- CONST Attr : BYTE;
- CONST Line, FirstPos : INTEGER);
-
- PROCEDURE ClearMonoLine;
- VAR
- x : INTEGER;
- BEGIN
- FOR x := 0 TO 79 DO BEGIN
- (* direkt in den BS-Speicher, kein DPMI möglich! *)
- MonoScreen[Line - 1, x].Attr := Attr;
- MonoScreen[Line - 1, x].char := ' ';
- END;
- END;
-
- PROCEDURE ClearColorLine;
- VAR
- x : INTEGER;
- BEGIN
- FOR x := 0 TO 79 DO BEGIN
- (* direkt in den BS-Speicher, kein DPMI möglich *)
- ColorScreen[Line - 1, x].Attr := Attr;
- ColorScreen[Line - 1, x].char := ' ';
- END;
- END;
-
- VAR
- x: INTEGER;
- BEGIN
- IF Monochrom THEN BEGIN
- ClearMonoLine;
- (* Display Text *)
- IF Length(s) > 0 THEN
- FOR x := 1 TO Length(s) DO
- IF x + FirstPos < 81 THEN
- MonoScreen[Line-1, x-1 + FirstPos].char := s[x];
- END ELSE BEGIN
- ClearColorLine;
- (* Display Text *)
- IF Length(s) > 0 THEN
- FOR x := 1 TO Length(s) DO
- IF x + FirstPos < 81 THEN (* wg. Überlauf! *)
- ColorScreen[Line-1, x-1 + FirstPos].char := s[x];
- END;
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE DisplayFooter;
- BEGIN
- OutTextXY(StrPas(StatusLine), StatusColor, 25, 1);
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE DisplayHeader(CONST s: STRING);
- VAR
- i : INTEGER;
- BEGIN
- IF s <> '' THEN BEGIN
- WHILE Length(InfoLine) < 79 DO
- InfoLine := ' ' + InfoLine + ' ';
- InfoLine[0] := #80;
- FOR i := 1 TO 10 DO InfoLine[68 + i] := s[i];
- Infoline[68] := '[';
- InfoLine[79] := ']';
- OutTextXY(InfoLine, StatusColor, 1, 1);
- END ELSE
- OutTextXY(InfoLine, StatusColor, 1,
- 40 - Length(InfoLine) DIV 2);
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE ScrollThruText(VAR Line : INTEGER);
- VAR
- i, y : INTEGER;
- OutStr : STRING;
- GoTop : BOOLEAN;
- BEGIN
- GoTop := FALSE;
- REPEAT
- IF GoTop THEN BEGIN (* Erweiterung v2.3 *)
- ClrScr;
- FOR i := 1 TO ScreenLines DO
- OutTextXY(StrPas(README_TEXT[i]), TextAttr,
- i + 1, FirstPosition);
- GotoXY(1, ScreenLines);
- Line := 1;
- Delay(scrollwait * 2);
- END ELSE BEGIN
- Window(1 + FirstPosition, 2, 80, Succ(ScreenLines));
- GotoXY(1, ScreenLines);
- END;
- IF Line < NumOfLines THEN y := Pred(Line)
- ELSE y := 1;
- FOR i := y + Succ(ScreenLines) TO NumOfLines DO BEGIN
- Str(i - ScreenLines + 1, LCStr);
- WHILE Length(LCStr) < 4 DO LCStr := ' ' + LCStr;
- LCStr := 'Zeile ' + LCStr;
- DisplayHeader(LCStr);
- Line := i - ScreenLines;
- OutStr := StrPas(README_TEXT[i - 1]);
- IF OutStr[0] >= Chr(80 - FirstPosition) THEN BEGIN
- (* BUGFIX v2.31, 30.3.94/jb *)
- (* Längenangleichung *)
- OutStr[0] := Chr(80 - FirstPosition); (* cut it! *)
- Write(OutStr);
- END ELSE
- WriteLn(OutStr); (* kürzer als (80-FirstPosition) *)
-
- OutTextXY(StrPas(README_TEXT[i]), TextAttr,
- Succ(ScreenLines), FirstPosition);
- IF KeyPressed THEN
- IF ReadKey = ' ' THEN BEGIN
- Inc(Line);
- Window(1, 1, 80, 25);
- Exit;
- END;
- Delay(scrollwait); (* warten *)
- END;
- GoTop := TRUE;
- UNTIL FALSE;
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE Help;
- VAR
- ch : CHAR;
-
- PROCEDURE WriteAt(CONST WhichLine : INTEGER;
- CONST MsgStr : STRING);
- BEGIN
- OutTextXY(MsgStr, HelpColor, WhichLine,
- 40 - Length(MsgStr) DIV 2);
- END;
-
- BEGIN
- WriteAt( 2, '┌──────────────────────────────────────────'+
- '──────────────────────┐');
- WriteAt( 3, '│ H I L F E Z U D E N T A S T E N ' +
- 'F U N K T I O N E N │');
- WriteAt( 4, '├──────────────────────────────────────────'+
- '──────────────────────┤');
- WriteAt( 5, '│ '+
- ' │');
- WriteAt( 6, '│ ['#24' | '#25'] Scroll' +
- 'en nach oben und unten │');
- WriteAt( 7, '│ [Pos1] Zum Textanfang '+
- 'springen │');
- WriteAt( 8, '│ [Ende] Zum Textende ' +
- 'springen │');
- WriteAt( 9, '│ [Bild'#25'] Eine Seite' +
- ' nach unten blättern │');
- WriteAt(10, '│ [Bild'#24'] Eine Seite' +
- ' nach oben blättern │');
- WriteAt(11, '│ ' +
- ' │');
- WriteAt(12, '│ [ESC], [ALT]-[X], [F10] Programm beend' +
- 'en │');
- WriteAt(13, '│ '+
- ' │');
- WriteAt(14, '│ [D] Text ausdrucken'+
- ' │');
- WriteAt(15, '│ [F2] Text in ' +
- '(anzugebender) Datei sichern │');
- WriteAt(16, '│ [S] | [W] Text suchen / T'+
- 'ext nochmals suchen │');
- WriteAt(17, '│ [L] Text automatisc'+
- 'h nach unten scrollen │');
- WriteAt(18, '│ '+
- ' │');
- WriteAt(19, '│ [>] Farbattribut um'+
- ' 1 erhöhen │');
- WriteAt(20, '│ [<] Farbattribut um'+
- ' 1 erniedrigen │');
- WriteAt(21, '│ [T] Fehlerton ' +
- '(falsche Taste) umschalten │');
- WriteAt(22, '│ [O] Dos aufruf' +
- 'en (Zurück mit »Exit« │');
- WriteAt(23, '│ ' +
- ' │');
- WriteAt(24, '└─────────────────────────────────────────' +
- '───────────────────────┘');
- OutTextXY('Hilfebildschirm - zurück mit beliebiger ' +
- 'Taste ...', StatusColor, 25, 1);
- ch := ReadKey;
- IF ch = #0 THEN ch := ReadKey;
- DisplayFooter;
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE SaveToFile;
- VAR
- test, i : INTEGER;
- FileName : STRING;
- Attr : BYTE;
- t : Text;
- BEGIN
- SetCursor(StartCursor);
- OutTextXY('Dateiname(+Pfad)+'#17#196#196#217'):',
- StatusColor, 25, 1);
- GotoXY(26, 25);
- Attr := TextAttr;
- TextAttr := StatusColor;
- FOR i := 1 TO 54 DO Write(#22);
- GotoXY(26, 25);
- FileName := ReadString(54, test); (* max. 54 Zeichen! *)
- TextAttr := Attr;
- IF test = 27 THEN (* Es wurde ESC gedrückt *)
- FileName := '';
- HideCursor;
- IF FileName = '' THEN BEGIN
- IF DoBeep THEN Beep(0);
- END ELSE BEGIN
- FOR i := 1 TO Length(FileName) DO
- FileName[i] := UpCase(FileName[i]);
- OutTextXY('Speichere Text in ' + FileName,
- StatusColor, 25, 1);
- Delay(scrollwait * 2);
- Assign(t, FileName);
- {$I-}
- Rewrite(t);
- IF IOResult <> 0 THEN BEGIN
- OutTextXY('Fehler beim Speichern von »' +
- FileName + '«!', ErrorColor, 25, 1);
- Beep(1000);
- END ELSE BEGIN
- (* Den Overhead in »ScreenLines« nicht sichern! *)
- FOR i := 1 TO NumOfLines - ScreenLines DO
- WriteLn(t, README_TEXT[i]);
- Close(t);
- END;
- END;
- DisplayFooter;
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE PrintText;
- VAR
- i : INTEGER;
- ch : CHAR;
- BEGIN
- OutTextXY('Datei wird ausgedruckt, Abbruch mit <ESC> ' +
- 'sonst bitte warten ...', PrintColor, 25, 1);
- Delay(scrollwait * 3);
- FOR i := 1 TO NumOfLines - ScreenLines DO BEGIN
- (* den Overhead in »Screenlines« nicht drucken! *)
- IF KeyPressed THEN BEGIN
- ch := ReadKey;
- IF ch = #27 THEN BEGIN
- OutTextXY('Ausdruck wird abgebrochen ...',
- ErrorColor, 25, 1);
- Beep(500);
- DisplayFooter;
- Exit;
- END;
- END;
- WriteLn(Lst, StrPas(README_TEXT[i]));
- END;
- Write(Lst, ^L); (* Seitenvorschub zum Schluß *)
- DisplayFooter;
- END;
-
- (* ------------------------------------------------------ *)
-
- PROCEDURE ChangeColor(CONST b : BOOLEAN);
- VAR
- ColStr : STRING[3];
- x, y : BYTE;
- BEGIN
- IF b THEN BEGIN (* + *)
- TextAttr := Succ(TextAttr);
- IF ((TextAttr SHR 4) AND TextAttr = 1) OR
- (TextAttr = 0) THEN
- TextAttr := Succ(TextAttr);
- END ELSE BEGIN (* - *)
- TextAttr := Pred(TextAttr);
- IF ((TextAttr SHR 4) AND TextAttr = 1) OR
- (TextAttr = 0) THEN
- TextAttr := Pred(TextAttr);
- END;
- Str(TextAttr: 3, ColStr);
- IF Monochrom THEN BEGIN
- MonoScreen[0, 68].char := ' ';
- MonoScreen[0, 69].char := ' ';
- MonoScreen[0, 70].char := ' ';
- MonoScreen[0, 71].char := ' ';
- MonoScreen[0, 72].char := ' ';
- MonoScreen[0, 73].char := ' ';
- MonoScreen[0, 74].char := ' ';
- MonoScreen[0, 75].char := ' ';
- MonoScreen[0, 76].char := ColStr[1];
- MonoScreen[0, 77].char := ColStr[2];
- MonoScreen[0, 78].char := ColStr[3];
- MonoScreen[0, 79].char := ' ';
- FOR y := 1 TO 23 DO
- FOR x := 0 TO 79 DO
- MonoScreen[y, x].attr := TextAttr;
- END ELSE BEGIN
- ColorScreen[0, 68].char := ' ';
- ColorScreen[0, 69].char := ' ';
- ColorScreen[0, 70].char := ' ';
- ColorScreen[0, 71].char := ' ';
- ColorScreen[0, 72].char := ' ';
- ColorScreen[0, 73].char := ' ';
- ColorScreen[0, 74].char := ' ';
- ColorScreen[0, 75].char := ' ';
- ColorScreen[0, 76].char := ColStr[1];
- ColorScreen[0, 77].char := ColStr[2];
- ColorScreen[0, 78].char := ColStr[3];
- ColorScreen[0, 79].char := ' ';
- FOR y := 1 TO 23 DO
- FOR x := 0 TO 79 DO
- ColorScreen[y, x].attr := TextAttr;
- END;
- Delay(scrollwait DIV 3);
- END;
-
- (* ------------------------------------------------------ *)
-
- FUNCTION SearchForString(VAR Line : INTEGER;
- again: BOOLEAN): BYTE;
- VAR
- ExitChar, i : INTEGER;
- Attr : BYTE;
- TextStr,
- SearchStr : pChar;
- SearchString : STRING;
-
- FUNCTION StrUpper(CONST s: pChar; VAR t: pChar): pChar;
- (* ... wegen Schlamperei von Borland in der Laufzeit- *)
- (* bibliothek: Die Funktion wandelt den Referenzpara- *)
- (* meter statt des Funktionsergebnisses!!! *)
- BEGIN
- StrCopy(t, s);
- StrCopy(t, Strings.StrUpper(t));
- StrUpper := t;
- END;
-
- BEGIN
- SetCursor(StartCursor);
- Attr := TextAttr;
- TextAttr := StatusColor;
- OutTextXY('Text suchen: ', TextAttr, 25, 1);
- GotoXY(15, 25);
- IF NOT again THEN BEGIN
- SearchString := ReadString(49, ExitChar);
- LastSearch := SearchString;
- END ELSE SearchString := LastSearch;
- HideCursor;
- TextAttr := Attr;
- IF ExitChar = 27 THEN BEGIN
- SearchForString := 2;
- Exit;
- END;
- IF Length(SearchString) > 0 THEN BEGIN
- GetMem(SearchStr, $100);
- GetMem(TextStr, $100);
- StrPCopy(SearchStr, SearchString);
- StrUpper(SearchStr, SearchStr);
- IF Line >= NumOfLines - ScreenLines - 1 THEN Line := 1;
- FOR i := Line + 1 TO NumOfLines DO
- IF StrLen(README_TEXT[i]) > 0 THEN BEGIN
- { nicht die aktuelle erste sondern nächste Zeile am BS }
- StrUpper(README_TEXT[i], TextStr);
- IF StrPos(TextStr, SearchStr) <> NIL THEN BEGIN
- Line := i;
- SearchForString := 1;
- FreeMem(SearchStr, $100);
- FreeMem(TextStr, $100);
- Exit;
- END;
- END;
- Line := NumOfLines;
- END ELSE BEGIN
- SearchForString := 2;
- Exit;
- END;
- Line := NumOfLines - ScreenLines;
- SearchForString := 0;
- END;
-
- (* ------------------------------------------------------ *)
-
- FUNCTION DosShell(CONST Line : INTEGER) : INTEGER;
- VAR
- Attr : BYTE;
- i, y : INTEGER;
- BEGIN
- Attr := TextAttr;
- TextAttr := DosBoxColor;
- ClrScr;
- WriteLn(^J'Zurück zum Programm mit Exit'
- + #17#196#196#217#10);
- BlockCursor;
- SwapVectors;
- Exec(GetEnv('COMSPEC'), '');
- DosShell := DosError;
- SwapVectors;
- HideCursor;
- TextAttr := Attr;
- y := 1;
- FOR i := Line TO Line + Pred(ScreenLines) DO BEGIN
- Inc(y);
- OutTextXY(StrPas(README_TEXT[i]), TextAttr, y,
- FirstPosition);
- END;
- DisplayHeader('');
- END;
-
- PROCEDURE CheckDelay;
- VAR
- value : WORD;
- test : INTEGER;
- MyName : PathStr;
- MyDir : DirStr;
- MyFName : NameStr;
- MyExt : ExtStr;
- BEGIN
- IF Pos('?', ParamStr(1)) > 0 THEN BEGIN
- MyName := FExpand(ParamStr(0));
- FSplit(MyName, MyDir, MyFName, MyExt);
- WriteLn('Aufruf: ', MyFName,
- ' [Scroll-Delay in Millisekunden]');
- WriteLn(MyCopyRight);
- Halt(0);
- END ELSE BEGIN
- Val(ParamStr(1), value, test);
- IF test = 0 THEN IF value > 0 THEN BEGIN
- scrollwait := value;
- END;
- END;
- END;
-
- (* ====================================================== *)
-
- VAR
- Key, ch : CHAR;
- LineCounter, y, OutPutLine : INTEGER;
- DefaultColor, Found : BYTE;
- LineScroll, Done : BOOLEAN;
- BEGIN
- IF IOResult <> 0 THEN ;
- IF ParamCount > 0 THEN CheckDelay;
- Monochrom := Byte(Ptr(Seg0040, $0049)^) = 7; (* HGC *)
- CheckBreak := FALSE; (* kein Abbruch *)
- DirectVideo := TRUE; (* schneller *)
- DoBeep := TRUE; (* Falls Ton unerwünscht := FALSE *)
- DefaultColor := TextAttr; (* Farben merken *)
- HideCursor; (* Unit Cursor *)
- ClrScr;
- IF Monochrom OR (Byte(Ptr(Seg0040, $49)^) = 2) THEN BEGIN
- StatusColor := $70; (* invertiert *)
- ErrorColor := $1F; (* weiß auf grau *)
- PrintColor := $10; (* invertiert *)
- SearchColor := $F0; (* invertiert + blinkend *)
- HelpColor := $0F; (* hell *)
- DosBoxColor := $0F; (* normal *)
- NormColor := $07; (* normal *)
- END; (* $01 = unterstrichen *)
- DisplayHeader('');
- DisplayFooter;
- TextAttr := NormColor;
- FOR y := 1 TO ScreenLines DO
- OutTextXY(StrPas(README_TEXT[y]), TextAttr, y + 1,
- FirstPosition);
- LineCounter := 1;
- LastSearch := '';
- REPEAT
- Str(LineCounter, LCStr);
- WHILE Length(LCStr) < 4 DO LCStr := ' ' + LCStr;
- LCStr := 'Zeile ' + LCStr;
- DisplayHeader(LCStr);
- LineScroll := FALSE;
- Key := ReadKey;
- CASE UpCase(Key) OF
- 'T' : DoBeep := NOT DoBeep; (* Umschalter *)
- 'O' : BEGIN
- IF DosShell(LineCounter) <> 0 THEN BEGIN
- OutTextXY('Shell konnte nicht ausgeführt' +
- ' werden!', ErrorColor, 25, 1);
- Beep(1500);
- END;
- DisplayFooter;
- END;
- 'W' : BEGIN (* immer weiter suchen ..., Erw. v2.3 *)
- IF LastSearch = '' THEN
- Found := SearchForString(LineCounter, FALSE)
- ELSE
- Found := SearchForString(LineCounter, TRUE);
- ActualColor := TextAttr;
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- OutPutLine := 1;
- IF Found = 1 THEN BEGIN
- OutTextXY('Textstelle gefunden!',
- StatusColor, 25, 1);
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := SearchColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := SearchColor;
- Delay(scrollwait * 3);
- END ELSE IF Found = 0 THEN BEGIN
- OutTextXY('Textstelle nicht gefunden!',
- ErrorColor, 25, 1);
- Beep(1000);
- END ELSE BEGIN
- OutTextXY('Suche wurde abgebrochen',
- ErrorColor, 25, 1);
- Beep(1000);
- END;
- TextAttr := ActualColor;
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := ActualColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := ActualColor;
- DisplayFooter;
- END;
- 'S' : BEGIN (* Immer neuen String suchen ... *)
- Found := SearchForString(LineCounter, FALSE);
- ActualColor := TextAttr;
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- OutPutLine := 1;
- IF Found = 1 THEN BEGIN
- OutTextXY('Textstelle gefunden!',
- StatusColor, 25, 1);
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := SearchColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := SearchColor;
- Delay(scrollwait * 3);
- END ELSE IF Found = 0 THEN BEGIN
- OutTextXY('Textstelle nicht gefunden!',
- ErrorColor, 25, 1);
- Beep(1000);
- END ELSE BEGIN
- OutTextXY('Suche wurde abgebrochen',
- ErrorColor, 25, 1);
- Beep(1000);
- END;
- TextAttr := ActualColor;
- IF Monochrom THEN
- FOR y := 0 TO 79 DO
- MonoScreen[1, y].attr := ActualColor
- ELSE
- FOR y := 0 TO 79 DO
- ColorScreen[1, y].attr := ActualColor;
- DisplayFooter;
- END;
- 'D': PrintText;
- 'L': BEGIN
- ActualColor := TextAttr;
- OutTextXY('Text wird endlos ge' +
- 'scrollt, Ende mit [Leertaste] ...',
- StatusColor, 25, 1);
- ScrollThruText(LineCounter);
- TextAttr := ActualColor;
- DisplayFooter;
- LineScroll := TRUE;
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- END;
- '>': ChangeColor(Incr);
- '<': ChangeColor(Decr);
- 'Q', 'X': Key := #27; (* Ende *)
- #27: ; (* einfachste Möglichkeit *)
- (* um Beep auszuschließen *)
- ELSE IF Key <> #0 THEN Beep(0);
- END;
-
- IF Key = #0 THEN BEGIN
- Done := TRUE;
- IF NOT LineScroll THEN ch := ReadKey;
- CASE ch OF
- ';': Help;
- '<': SaveToFile;
- '-', 'D': Key := #27; (* Ende *)
- 'H': IF LineCounter > 1 THEN Dec(LineCounter)
- ELSE Done := FALSE;
- 'P': IF LineCounter <
- NumOfLines - Pred(ScreenLines) THEN
- Inc(LineCounter)
- ELSE
- Done := FALSE;
- 'G': IF LineCounter > 1 THEN LineCounter:= 1
- ELSE Done := FALSE;
- 'O': IF LineCounter <
- NumOfLines - Pred(ScreenLines) THEN
- LineCounter := NumOfLines - Pred(ScreenLines)
- ELSE
- Done := FALSE;
- 'Q': IF LineCounter < (NumOfLines -
- Pred(ScreenLines) SHL 1) THEN
- Inc(LineCounter, ScreenLines)
- ELSE IF LineCounter = (NumOfLines -
- Pred(ScreenLines) SHL 1) THEN
- Done := FALSE
- ELSE
- LineCounter := NumOfLines - Pred(ScreenLines);
- 'I': IF LineCounter > (ScreenLines SHL 1) THEN
- Dec(LineCounter, ScreenLines)
- ELSE IF LineCounter = 1 THEN
- Done := FALSE
- ELSE
- LineCounter := 1;
- ELSE Beep(0); Done := FALSE;
- END;
- IF Done THEN BEGIN
- OutPutLine := 1;
- FOR y := LineCounter TO
- LineCounter + Pred(ScreenLines) DO BEGIN
- Inc(OutPutLine);
- OutTextXY(StrPas(README_TEXT[y]), TextAttr,
- OutPutLine, FirstPosition);
- END;
- END;
- END;
- UNTIL Key = #27;
- SetCursor(StartCursor);
- TextAttr := DefaultColor;
- ClrScr;
- END.
-
- (* ====================================================== *)
- (* Ende von README.PAS *)
-