home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 02 / titel / box1.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-11-23  |  6.9 KB  |  230 lines

  1. (* ------------------------------------------------------ *)
  2. (*                       BOX.PAS                          *)
  3. (*               Message und Antwort-Boxen                *)
  4. (*   Ausgaberoutinen schreiben direkt auf den Bildschirm  *)
  5. (*                                                        *)
  6. (*          (c) 1990 Wolfhard Rinke & TOOLBOX             *)
  7. (* ------------------------------------------------------ *)
  8. PROGRAM Box;
  9.  
  10. USES Crt;                      (* nur wegen "ReadKey" ... *)
  11.  
  12. TYPE
  13.   CrtChar  = RECORD
  14.                ch : CHAR;
  15.                at : BYTE;
  16.              END;
  17.  
  18.   CrtPage  = ARRAY [1..25, 1..80] OF CrtChar;
  19.  
  20.  
  21. VAR
  22.   Screen   : CrtPage ABSOLUTE $B800:$0000;
  23.                        (* für monochrom : $B000:$0000 *)
  24.  
  25.   TextAttr : BYTE;     (* "gültiger" als Crt.TextAttr! *)
  26.  
  27. (* ------------------------------------------------------ *)
  28.  
  29.   PROCEDURE WriteCharXY(col, row : INTEGER;
  30.                         ch       : CHAR;
  31.                         num      : INTEGER);
  32.     (* Schreibt ein Zeichen "ch" an der Stelle *)
  33.     (* "col", "row" "num"-mal in den Bildschirmspeicher. *)
  34.   VAR
  35.     i : INTEGER;
  36.   BEGIN
  37.     FOR i := 0 TO num-1 DO BEGIN
  38.       (* Bis jetzt paßt noch niemand auf, daß ein Zeichen *)
  39.       (* vom Bildschirm fällt! *)
  40.  
  41.       screen[row, col + i].ch := ch;
  42.       screen[row, col + i].at := TextAttr;
  43.            (* wenn der Parameter "attr" in den Aufruf *)
  44.            (* übernommen wird, können wir auch bunt *)
  45.            (* schreiben. Durch den "override" von *)
  46.            (* Crt.TextAttr werden auch TextBackground und *)
  47.            (* TextColor unwirksam, weil beide Prozeduren *)
  48.            (* nur  die Crt-globale TextAttr beeinflussen. *)
  49.     END;
  50.   END;
  51.  
  52. (* ------------------------------------------------------ *)
  53.  
  54.   PROCEDURE ClrScr(x1, y1, x2, y2 : INTEGER);
  55.     (* Löscht einen Bildschirmausschnitt. *)
  56.   VAR
  57.     row, col : INTEGER;
  58.   BEGIN
  59.     FOR row := y1 TO y2 DO BEGIN
  60.       WriteCharXY(x1, row, #32, x2-x1);
  61.     END;
  62.   END;
  63.  
  64. (* ------------------------------------------------------ *)
  65.  
  66.   PROCEDURE WriteTextXY(col, row : INTEGER; s : STRING);
  67.     (* Schreibt einen String in den Bildschirmspeicher *)
  68.     (* Es gibt derzeit keine Kontrolle auf korrekte Länge *)
  69.   VAR
  70.     i : INTEGER;
  71.   BEGIN
  72.     FOR i := 0 TO Length(s)-1 DO BEGIN
  73.       WriteCharXY(col+i, row, s[i+1], 1);
  74.     END;
  75.   END;
  76.  
  77. (* ------------------------------------------------------ *)
  78.  
  79.   PROCEDURE Frame(x1, y1, x2, y2 : INTEGER);
  80.     (* Zeichnet einen doppelten Rahmen um einen Bild- *)
  81.     (* schirmausschnitt. AUch hier gibt es noch keinen *)
  82.     (* Parameter-Check. Ich weiß: Quick and dirty... *)
  83.   VAR
  84.     i : INTEGER;
  85.   BEGIN
  86.     ClrScr(x1, y1, x2, y2);
  87.  
  88.     WriteCharXY(x1,   y1, #201, 1);          (* oben *)
  89.     WriteCharXY(x1+1, y1, #205, x2-x1-2);
  90.     WriteCharXY(x2-1, y1, #187, 1);
  91.  
  92.     FOR i := y1+1 TO y2-1 DO BEGIN
  93.       WriteCharXY(x1,   i, #186, 1);         (* links *)
  94.       WriteCharXY(x2-1, i, #186, 1);         (* rechts *)
  95.     END;
  96.  
  97.     WriteCharXY(x1,   y2, #200, 1);          (* unten *)
  98.     WriteCharXY(x1+1, y2, #205, x2-x1-2);
  99.     WriteCharXY(x2-1, y2, #188, 1);
  100.   END;
  101.  
  102. (* ------------------------------------------------------ *)
  103.  
  104.   PROCEDURE Shadow(x1, y1, x2, y2 : INTEGER);
  105.    (* "schattiert" den Bildschirmausschnitt. Zwischen dem *)
  106.    (* Rahmen und dem Bildschirmrand muß noch Platz für    *)
  107.    (* den Schatten sein. Kein Check!! *)
  108.   VAR
  109.     i : INTEGER;
  110.   BEGIN
  111.     FOR i := y1+1 TO y2+1 DO BEGIN
  112.       WriteCharXY(x2, i, #177, 1);      (* '▒' *)
  113.     END;
  114.     WriteCharXY(x1+1, y2+1, #177, x2-x1);
  115.   END;
  116.  
  117. (* ------------------------------------------------------ *)
  118.  
  119.   PROCEDURE Message(head     : STRING;
  120.                     col, row : INTEGER;
  121.                     s        : STRING);
  122.     (* "head" ist die Kopfzeile der Box. Wird der Leer- *)
  123.     (* string als Parameter angegeben, erscheint keine  *)
  124.     (* Kopfzeile. Der Kopf wird zentriert.              *)
  125.   VAR
  126.     i    : INTEGER;
  127.     len  : INTEGER;
  128.     hlen : INTEGER;
  129.   BEGIN
  130.     len := Length(s) + 4;
  131.       (* Für den Rahmen und je ein Blank vorne und hinten *)
  132.  
  133.     Frame(col, row, col+len, row+2);
  134.  
  135.     IF head <> '' THEN BEGIN
  136.       head := #32 + head + #32;
  137.       hlen := (len - Length(Head)) DIV 2;
  138.       WriteTextXY(col + hlen, row, head);
  139.     END;
  140.  
  141.     WriteTextXY(col+2, row+1, s);
  142.  
  143.       (* sollte optional sein: der Schatten... *)
  144.     Shadow(col, row, col+len, row+2);
  145.   END;
  146.  
  147. (* ------------------------------------------------------ *)
  148.  
  149. TYPE
  150.   EntrySet = SET OF CHAR;
  151.  
  152.  
  153.   PROCEDURE Answer(col, row : INTEGER;
  154.                    s : STRING;
  155.                    corr : EntrySet;
  156.                    VAR ch : CHAR);
  157.     (* Der Prozedur kann ein Zeichensatz übergeben werden,*)
  158.     (* der die gültige Auswahl beinhaltet.                *)
  159.     (*                                                    *)
  160.     (* VAR                                                *)
  161.     (*   ans   : CHAR;                                    *)
  162.     (*   yesno : EntrySet;                                *)
  163.     (*                                                    *)
  164.     (* BEGIN                                              *)
  165.     (*    ...                                             *)
  166.     (*   yesno := ['J', 'N'];                             *)
  167.     (*   Answer(10, 3, 'Drücken Sie [J/N] ', yesno, ans); *)
  168.     (*   IF ans = 'J' THEN                                *)
  169.     (*    ...                                             *)
  170.     (* END.                                               *)
  171.     (*                                                    *)
  172.     (* Das angewählte Zeichen wird nicht mehr ausgegeben. *)
  173.   BEGIN
  174.     Message('Answer', col, row, s);
  175.  
  176.     REPEAT
  177.       ch := UpCase(ReadKey);
  178.       IF ch IN corr THEN BEGIN
  179.         (*  WriteCharXY(col+Length(s), row+1, ch, 1); *)
  180.       END ELSE BEGIN
  181.         Sound(200); Delay(100); NoSound;
  182.         (* optional, Gerald!!! *)
  183.       END;
  184.     UNTIL ch IN corr;
  185.  
  186.   END;
  187.  
  188. (* ------------------------------------------------------ *)
  189.  
  190.   PROCEDURE Ausblick;
  191.   BEGIN
  192.     ClrScr(55, 5, 75, 20);
  193.     Frame (55, 5, 75, 20);
  194.     Shadow(55, 5, 75, 20);
  195.  
  196.     (* in allen drei Prozeduren die Parameter wegen der   *)
  197.     (* übersichtlichkeit ... (und Unabhängigkeit!)        *)
  198.  
  199.     WriteTextXY(55+2, 5+5, 'demnächst in');
  200.     WriteTextXY(55+2, 5+7, 'diesem');
  201.     WriteTextXY(55+2, 5+9, 'Theater...');
  202.  
  203.   END;
  204.  
  205. (* ------------------------------------------------------ *)
  206.  
  207. VAR
  208.   ans   : CHAR;
  209.   yesno : EntrySet;
  210.  
  211. BEGIN
  212.   TextAttr := 7;
  213.  
  214.   ClrScr(1, 1, 80, 25);
  215.  
  216.   Message('Ok-Box', 30, 15, 'Alles paletti!');
  217.  
  218.   Ausblick;
  219.  
  220.   Message('', 15, 20, 'Eine Message-Box ohne Header...');
  221.  
  222.   yesno := ['J', 'N'];
  223.   Answer(10, 3, 'Drücken Sie [J/N] ...', yesno, ans);
  224.  
  225.  
  226. END.
  227. (* ------------------------------------------------------ *)
  228. (*                   Ende von BOX.PAS                     *)
  229.  
  230.