home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 11 / tricks / colmod.pas next >
Encoding:
Pascal/Delphi Source File  |  1990-08-07  |  5.7 KB  |  196 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      COLMOD.PAS                        *)
  3. (*    selektieren von Farbattributen aus einer Tabelle    *)
  4. (*            (c) 1990 Sven Selle & TOOLBOX               *)
  5. (* ------------------------------------------------------ *)
  6. UNIT ColMod;            { txCrt }
  7.  
  8. INTERFACE
  9.  
  10. TYPE
  11.   ActionProc = PROCEDURE;   { Prozedur bei Farbänderung    }
  12.  
  13. CONST
  14.   LDeli : CHAR = '[';
  15.   RDeli : CHAR = ']';       { Begrenzer in der Farbtabelle }
  16.  
  17. VAR
  18.   ActTxtColor,
  19.   ActBckColor  : BYTE;
  20.   ActPressKey  : CHAR;
  21.  
  22.   PROCEDURE Nothing;
  23.   { Diese Prozedur kann statt einer eigenen Action-Prozedur}
  24.   { ausgegeben werden, wenn man darauf verzichten möchte.  }
  25.  
  26.   PROCEDURE VGA_BlinkOff;
  27.  
  28.   PROCEDURE VGA_BlinkOn;
  29.   { schaltet zwischen Blinken und Intensivdarstellung bei  }
  30.   { gesetztem Blinkbit (Hintergrund > 7) um.               }
  31.  
  32.   PROCEDURE SplitAttr(Attr : BYTE; VAR tc, bc : BYTE);
  33.   { Die Prozedur berechnet aus dem kompletten Farbattribut }
  34.   { die einzelnen Bestandteile.                            }
  35.  
  36.   PROCEDURE ColorSelect(    x1, y1  : BYTE;
  37.                             AllBits : BOOLEAN;
  38.                             Action  : ActionProc;
  39.                         VAR tc, bc  : BYTE);
  40.   { Erstellt eine Farbtabelle. Wenn "AllBits" = TRUE,      }
  41.   { werden alle 255 Attribute angezeigt, ansonsten nur 127.}
  42.   { "Action" ist eine eigene Prozedur, die nach jedem      }
  43.   { Tastendruck ausgeführt wird.                           }
  44.  
  45. IMPLEMENTATION
  46.  
  47. USES Crt, Dos;
  48.  
  49.   PROCEDURE Nothing;
  50.   BEGIN
  51.     { Diese Prozedur macht rein gar nichts }
  52.   END;
  53.  
  54.   PROCEDURE VGA_BlinkOff;
  55.   VAR
  56.     Regs : Registers;
  57.   BEGIN
  58.     Regs.ah := $10;
  59.     Regs.al := $03;
  60.     Regs.bl := $00;
  61.     Intr($10, Regs);
  62.   END;
  63.  
  64.   PROCEDURE VGA_BlinkOn;
  65.   VAR
  66.     Regs : Registers;
  67.   BEGIN
  68.     Regs.ah := $10;
  69.     Regs.al := $03;
  70.     Regs.bl := $01;
  71.     Intr($10, Regs);
  72.   END;
  73.  
  74.   PROCEDURE SplitAttr(Attr : BYTE; VAR tc, bc : BYTE);
  75.   BEGIN
  76.     tc := attr AND 15;
  77.     bc := attr SHR 4;
  78.   END;
  79.  
  80.   PROCEDURE ColorSelect(    x1, y1  : BYTE;
  81.                             AllBits : BOOLEAN;
  82.                             Action  : ActionProc;
  83.                         VAR tc, bc  : BYTE);
  84.   VAR
  85.     attr      : BYTE;
  86.     max_Bckgr : BYTE;
  87.     x, y      : BYTE;
  88.  
  89.     FUNCTION XCoord(attr : BYTE) : BYTE;
  90.     { errechnet aus dem Attribut die x-Position der }
  91.     { Farbanzeige auf dem Bildschirm                }
  92.     BEGIN
  93.       XCoord := Succ(x1) + (3 * (attr DIV 16));
  94.     END;
  95.  
  96.     FUNCTION YCoord(attr : BYTE) : BYTE;
  97.     BEGIN
  98.       YCoord := Succ(x1) + (attr MOD 16);
  99.     END;
  100.  
  101.     PROCEDURE WriteXY(x, y       : BYTE;
  102.                       txtc, bckc : BYTE;
  103.                       txt        : STRING);
  104.     { Die Schreibroutine. Statt ihrer kann eine eigene }
  105.     { implementiert werden. Hauptsache, die Parameter  }
  106.     { stimmen halbwegs!                                }
  107.     BEGIN
  108.       GotoXY(x, y);
  109.       TextAttr := txtc + (bckc SHL 4);
  110.       Write(txt);
  111.     END;
  112.  
  113.   BEGIN
  114.     { An dieser Stelle sollte eine Rahmen-Routine eingefügt}
  115.     { werden, um der Farbtabelle den nötigen Schliff zu    }
  116.     { geben:                                               }
  117.     {   IF AllBits THEN                                    }
  118.     {     Rahmen(x1, y1, x1+49, y1+17)                     }
  119.     {   ELSE                                               }
  120.     {     Rahmen(x1, y1, x1+25, y1+17);                    }
  121.  
  122.     { Maximale Hintergrundfarbe setzen: }
  123.     IF AllBits THEN max_bckgr := 15
  124.                ELSE max_bckgr := 7;
  125.  
  126.     { Farbtabelle erstellen }
  127.     FOR x := 0 TO 15 DO
  128.       FOR y := 0 TO max_bckgr DO
  129.         WriteXY(Succ(x1) + (y*3), Succ(y1)+x, x, y, ' x ');
  130.  
  131.     { Voreinstellungen }
  132.     attr := tc + (bc SHL 4);
  133.     ActTxtColor := tc;
  134.     ActBckColor := bc;
  135.     IF AllBits THEN
  136.       max_bckgr := 240      { 240 + 15 = 255 Attribute }
  137.     ELSE
  138.       max_bckgr := 127;     { 112 + 15 = 127 Attribute }
  139.  
  140.     REPEAT
  141.       x := XCoord(attr);
  142.       y := yCoord(attr);
  143.  
  144.       { eingrenzen der gewählten Farbe }
  145.       IF ActBckColor < Yellow THEN BEGIN
  146.         WriteXY(x,   y, White, ActBckColor, LDeli);
  147.         WriteXY(x+2, y, White, ActBckColor, RDeli);
  148.       END ELSE BEGIN
  149.         WriteXY(x,   y, Black, ActBckColor, LDeli);
  150.         WriteXY(x+2, y, Black, ActBckColor, RDeli);
  151.       END;
  152.       WriteXY(Succ(x), y, ActTxtColor, ActBckColor, 'X');
  153.  
  154.       { eventuelle Anwender-Aktion }
  155.       Action;
  156.  
  157.       { Bewegen }
  158.       ActPressKey := ReadKey;
  159.       WriteXY(x, y, ActTxtColor, ActBckColor, ' x ');
  160.  
  161.       CASE ActPressKey OF
  162.         #72, ^E : IF ActTxtColor > Black THEN Dec(attr)
  163.                                          ELSE Inc(attr, 15);
  164.         #80, ^X : IF ActTxtColor < White THEN Inc(attr)
  165.                                          ELSE Dec(attr, 15);
  166.         #75, ^S : IF ActBckColor > Black THEN
  167.                     Dec(attr, 16)
  168.                   ELSE
  169.                     Inc(attr, max_bckgr);
  170.         #77, ^D : IF ActBckColor < LightGray THEN
  171.                     Inc(attr, 16)
  172.                   ELSE
  173.                     Dec(attr, max_bckgr);
  174.         #71, ^A : attr := 0;
  175.         #79, ^F : attr := max_bckgr + 15;
  176.       END;
  177.       SplitAttr(attr, ActTxtColor, ActBckColor);
  178.     UNTIL ActPressKey IN [#13, #27];
  179.  
  180.     IF ActPressKey = #27 THEN BEGIN
  181.       tc := 255;
  182.       bc := 255;
  183.     END ELSE BEGIN
  184.       tc := ActTxtColor;
  185.       bc := ActBckColor;
  186.     END;
  187.   END;
  188.  
  189. BEGIN
  190.   ActTxtColor := 0;
  191.   ActBckColor := 0;
  192.   ActPressKey := #0;
  193. END.
  194. (* ------------------------------------------------------ *)
  195. (*                Ende von COLMOD.PAS                     *)
  196.