home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 05 / tricks / fenster.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-01-15  |  3.5 KB  |  141 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      FENSTER.PAS                       *)
  3. (*            (c) 1990 Simon Kröger & TOOLBOX             *)
  4. (* ------------------------------------------------------ *)
  5. UNIT Fenster;
  6.  
  7. INTERFACE
  8.  
  9. USES Crt, Dos;
  10.  
  11.   PROCEDURE Open_Window(x1, y1, x2, y2 : BYTE;
  12.                         Rahmen         : INTEGER);
  13.  
  14.   PROCEDURE Close_Window;
  15.  
  16. TYPE
  17.   Screen_Line  = ARRAY [1..80] OF INTEGER;
  18.   Screen_Array = ARRAY [1..25] OF Screen_Line;
  19.  
  20. VAR
  21.   Screen : ^Screen_Array;
  22.   Mono   : BOOLEAN;
  23.  
  24. IMPLEMENTATION
  25.  
  26. TYPE
  27.   Fenster_Feld = ARRAY [0..2000] OF INTEGER;
  28.   Fenster_Rec  = RECORD
  29.                    x1, x2, y1, y2 : BYTE;
  30.                    F              : Fenster_Feld;
  31.                  END;
  32.  
  33. VAR
  34.   Feld        : ARRAY [1..20] OF ^Fenster_Rec;
  35.   Fenster_Anz : BYTE;
  36.  
  37.   PROCEDURE Kasten(x, y, x1, y1 : INTEGER;
  38.                    doppel       : BOOLEAN);
  39.   VAR
  40.     i : INTEGER;
  41.  
  42.     PROCEDURE Print(c1, c2 : BYTE);
  43.     BEGIN
  44.       IF doppel THEN Write(Chr(c1))
  45.                 ELSE Write(Chr(c2));
  46.     END;
  47.  
  48.   BEGIN
  49.     GotoXY(x, y);
  50.     Print(201, 218);
  51.     FOR i := 1 TO x1 - x - 1 DO Print(205, 196);
  52.     Print(187, 191);
  53.     FOR i := 1 TO y1 - y - 2 DO BEGIN
  54.       GotoXY(x, i + y);
  55.       Print(186, 179);
  56.       GotoXY(x1, i + y);
  57.       Print(186, 179);
  58.     END;
  59.     GotoXY(x, y1 - 1);
  60.     Print(200, 192);
  61.     FOR i := 1 TO x1 - x - 1 DO Print (205, 196);
  62.     Print(188, 217);
  63.   END;
  64.  
  65.   PROCEDURE Init;
  66.   VAR
  67.     Regs : Registers;
  68.   BEGIN
  69.     Intr($11, Regs);
  70.     Mono := (Lo(Regs.ax) AND $30) = $30;
  71.     IF Mono THEN Screen := Ptr($B000, $0000)
  72.             ELSE Screen := Ptr($B800, $0000);
  73.     Fenster_Anz := 0;
  74.   END;
  75.  
  76.   PROCEDURE Open_Window(x1, y1, x2, y2 : BYTE;
  77.                         Rahmen         : INTEGER);
  78.   VAR
  79.     w, Fenster_Size, Z, i : INTEGER;
  80.   BEGIN
  81.     Fenster_Anz  := Fenster_Anz + 1;
  82.     w            := Fenster_Anz;
  83.     Fenster_Size := (x2 - x1 + 1) * (y2 - y1 + 1) * 2 + 4;
  84.     GetMem(Feld[W], Fenster_Size);
  85.     z := 0;
  86.     FOR i := y1 TO y2 DO BEGIN
  87.       Move(Screen^[i, x1], Feld[W]^.F[Z], (x2-x1+1) * 2);
  88.       Z := Z + (x2 - x1 + 1);
  89.     END;
  90.     Feld[w]^.x1 := x1;
  91.     Feld[w]^.y1 := y1;
  92.     Feld[w]^.x2 := x2;
  93.     Feld[w]^.y2 := y2;
  94.     Window(1, 1, 80, 25);
  95.     IF Rahmen <> 0 THEN BEGIN
  96.       IF Rahmen = 1 THEN Kasten(x1, y1, x2, y2+1, FALSE);
  97.       IF Rahmen = 2 THEN Kasten(x1, y1, x2, y2+1, TRUE);
  98.       Window(x1+1, y1+1, x2-1, y2-1);
  99.       ClrScr;
  100.     END ELSE
  101.       Window(x1, y1, x2, y2);
  102.     ClrScr;
  103.   END;
  104.  
  105.   PROCEDURE Close_Window;
  106.   VAR
  107.     w, Fenster_Size, Z, i : INTEGER;
  108.     Spalten, Zeilen,
  109.     x, y, x1, y1, x2, y2  : BYTE;
  110.   BEGIN
  111.     w := Fenster_Anz;
  112.     IF w = 0 THEN Exit;
  113.     x1 := Feld[w]^.x1;
  114.     y1 := Feld[w]^.y1;
  115.     x2 := Feld[w]^.x2;
  116.     y2 := Feld[w]^.y2;
  117.     Fenster_Size := (x2 - x1 + 1) * (y2 - y1 + 1) * 2 + 4;
  118.     z := 0;
  119.     Spalten := (x2 - x1 + 1);
  120.     Zeilen := (y2 - y1 +1);
  121.     FOR i := y1 TO y2 DO BEGIN
  122.       Move(Feld[w]^.F[z], Screen^[i, x1], Spalten * 2);
  123.       Z := Z + Spalten;
  124.     END;
  125.     FreeMem(Feld[w], Fenster_Size);
  126.     Fenster_Anz := Fenster_Anz - 1;
  127.     w := w - 1;
  128.     IF w = 0 THEN
  129.       Window(1, 1, 80, 25)
  130.     ELSE
  131.       Window(Feld[w]^.x1, Feld[w]^.y1,
  132.              Feld[w]^.x2, Feld[w]^.y2);
  133.   END;
  134.  
  135.  
  136. BEGIN
  137.   Init;
  138. END.
  139. (* ------------------------------------------------------ *)
  140. (*                Ende von FENSTER.PAS                    *)
  141.