home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 12 / tricks / zeige.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1989-09-06  |  5.5 KB  |  209 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      ZEIGE.PAS                         *)
  3. (* Ersatz für den Dos-Befehl "TYPE". Man kann damit jede  *)
  4. (* beliebige ASCII-Datei anschauen und darin vorwärts     *)
  5. (* und rückwärts blättern. Aufruf am besten mit dem       *)
  6. (* Namen der zu lesenden Datei als Parameter, sonst wird  *)
  7. (* ein Dateiname erfragt.                                 *)
  8. (*       (c) 1989  Achim Bergmeister & TOOLBOX            *)
  9. (* ------------------------------------------------------ *)
  10. PROGRAM Zeige;
  11.  
  12. USES Crt, Dos;
  13.  
  14. TYPE
  15.   Str        = STRING;
  16.   StrZeiger  = ^Str;
  17.  
  18. CONST
  19.   maxzahl = 200;      { maximale Zahl einzulesender Zeilen }
  20.  
  21. VAR
  22.   zeile     : ARRAY [1..maxzahl] OF StrZeiger;
  23.   aktzeile  : INTEGER;
  24.   max, i, j : INTEGER;
  25.   f         : TEXT;
  26.   Name,z    : STRING;
  27.   ch        : CHAR;
  28.   Regs      : Registers;
  29.  
  30.   PROCEDURE StringSpeichern(st: Str; VAR zeiger: StrZeiger);
  31.   { Speichert die jeweils gelesene Zeile in einer          }
  32.   { dynamischen Struktur                                   }
  33.   VAR
  34.     x : BYTE ABSOLUTE st;
  35.   BEGIN
  36.     GetMem(zeiger, Succ(x));
  37.     Move(st, zeiger^, Succ(x));
  38.   END;
  39.  
  40.   PROCEDURE StringLesen(zeiger: StrZeiger; VAR st: Str);
  41.   { liest die dynamisch abgespeicherten Zeilen wieder in   }
  42.   { eine normale Stringvariable ein.                       }
  43.   BEGIN
  44.     st := zeiger^;
  45.   END;
  46.  
  47.   PROCEDURE SpeicherFrei(st: StrZeiger);
  48.   { gibt den belegten Speicherplatz frei                   }
  49.   BEGIN
  50.     FreeMem(st, Succ(Ord(st^[0])));
  51.   END;
  52.  
  53.   FUNCTION Kleiner(x, y: INTEGER) : INTEGER;
  54.   BEGIN
  55.     IF x < y THEN Kleiner := x ELSE Kleiner := y;
  56.   END;
  57.  
  58.   PROCEDURE Stellung;
  59.   { gibt die Nummer der jeweils letzten auf dem Bildschirm }
  60.   { dargestellten Zeile und die Gesamtzeilenzahl aus.      }
  61.   BEGIN
  62.     Window(1,1,80,25);  TextAttr := 112;
  63.     GotoXY(36,1);
  64.     Write(aktzeile:4, ' von ', max);
  65.     TextAttr := 10;     Window (1,2,80,25);
  66.   END;
  67.  
  68.   PROCEDURE Down;
  69.   BEGIN
  70.     IF aktzeile < max THEN BEGIN
  71.       Inc(aktzeile);
  72.       StringLesen(zeile[aktzeile], z);
  73.       GotoXY(1,24);  WriteLn(z);
  74.     END;
  75.     Stellung;
  76.   END;
  77.  
  78.   PROCEDURE Up;
  79.   BEGIN
  80.     IF aktzeile > 23 THEN BEGIN
  81.       Dec(aktzeile);
  82.       StringLesen(zeile[aktzeile - 22], z);
  83.       GotoXY(1,1);  InsLine;  Write(z);
  84.     END;
  85.     Stellung;
  86.   END;
  87.  
  88.   PROCEDURE Ende;
  89.   BEGIN
  90.     IF max > 23 THEN BEGIN
  91.       ClrScr;
  92.       FOR j := max-23 TO max DO BEGIN
  93.         StringLesen(zeile[j], z);
  94.         WriteLn (z);
  95.       END;
  96.       aktzeile := max;
  97.     END;
  98.     Stellung;
  99.   END;
  100.  
  101.   PROCEDURE Anfang;
  102.   BEGIN
  103.     ClrScr;
  104.     FOR j := 1 TO Kleiner(23, max) DO BEGIN
  105.       StringLesen(zeile[j], z);
  106.       WriteLn(z);
  107.     END;
  108.     aktzeile := Kleiner(23, max);
  109.     Stellung;
  110.   END;
  111.  
  112.   PROCEDURE PageDown;
  113.   BEGIN
  114.     IF aktzeile < max - 24 THEN BEGIN
  115.       ClrScr;
  116.       FOR j := 1 TO 23 DO BEGIN
  117.         Inc(aktzeile);
  118.         StringLesen(zeile[aktzeile], z);
  119.         WriteLn(z);
  120.       END;
  121.     END ELSE
  122.       IF (aktzeile < max) AND (aktzeile >= max - 24) THEN
  123.         Ende;
  124.     Stellung;
  125.   END;
  126.  
  127.   PROCEDURE PageUp;
  128.   BEGIN
  129.     IF aktzeile > 46 THEN BEGIN
  130.       ClrScr;  Dec(aktzeile, 46);
  131.       FOR j := 1 TO 23 DO BEGIN
  132.         Inc(aktzeile);
  133.         StringLesen(zeile[aktzeile], z);
  134.         WriteLn(z);
  135.       END;
  136.     END ELSE
  137.       IF (aktzeile > 23) AND (aktzeile < 47) THEN
  138.         Anfang;
  139.     Stellung;
  140.   END;
  141.  
  142. BEGIN
  143.   IF ParamCount > 0 THEN
  144.     Name := ParamStr(1)
  145.   ELSE BEGIN
  146.     Write ('Dateiname: '); ReadLn (Name);
  147.   END;
  148.   IF Name <> '' THEN BEGIN
  149.     Assign(f, Name);
  150. {$I-}
  151.     Reset(f);
  152. {$I+}
  153.     IF IOResult <> 0 THEN BEGIN
  154.       Write('Lesefehler !');  Halt;
  155.     END;
  156.         { gewünschte Datei lesen und dynamisch abspeichern }
  157.     i := 0;
  158.     WHILE (NOT Eof (f)) AND (i < maxzahl) DO BEGIN
  159.       Inc(i);  ReadLn(f, z);
  160.       StringSpeichern(z, zeile[i]);
  161.     END;
  162.     max := i;                          { Anzahl der Zeilen }
  163.     Close(f);  ClrScr;
  164.                                      { Titelzeile ausgeben }
  165.     TextAttr := 112;
  166.     Write('Datei: ', Name);
  167.     Write(' ':73 - Length(Name));
  168.     GotoXY(49, 1);
  169.     Write('│Home│END│PgUp│PgDn│', Chr(24),
  170.           '│', Chr(25), '│Esc=Ende');
  171.     TextAttr := 10;  Window (1,2,80,25);
  172.     GotoXY(1,1);
  173.                                        { Cursor verstecken }
  174.     Regs.ah := 1;   Regs.ch := 30;
  175.     Regs.cl := 30;  Intr ($10,Regs);
  176.  
  177.     { Zunächst die ersten 23 -oder weniger- Zeilen zeigen. }
  178.     FOR j := 1 TO Kleiner (23, max) DO BEGIN
  179.       StringLesen(zeile[j], z);
  180.       WriteLn(z);
  181.     END;
  182.     aktzeile := Kleiner(23, max);
  183.     Stellung;
  184.                             { Schleife mit Tastaturabfrage }
  185.     REPEAT
  186.       ch := ReadKey;
  187.       IF ch = #0 THEN BEGIN
  188.         ch := ReadKey;
  189.         CASE ch OF
  190.           #80 : Down;
  191.           #72 : Up;
  192.           #73 : PageUp;
  193.           #81 : PageDown;
  194.           #71 : Anfang;
  195.           #79 : Ende;
  196.         END;
  197.       END;
  198.     UNTIL ch = #27;                     { bis Esc gedrückt }
  199.                          { Speicherplatz wieder freimachen }
  200.     FOR i := 1 TO max DO
  201.       SpeicherFrei(zeile[i]);
  202.     Window(1,1,80,25);   GotoXY(1,25);
  203.                                     { cursor wieder zeigen }
  204.     Regs.ah := 1;   Regs.ch := 11;
  205.     Regs.cl := 12;  Intr ($10,Regs);
  206.   END;
  207. END.
  208. (* ------------------------------------------------------ *)
  209. (*                  Ende von ZEIGE.PAS                    *)