home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / turbo4 / graph.doc < prev    next >
Text File  |  1987-12-08  |  46KB  |  1,158 lines

  1.    ======================================================================
  2.         HINWEIS  HINWEIS  HINWEIS  HINWEIS  HINWEIS  HINWEIS  HINWEIS
  3.    ======================================================================
  4.  
  5. Der erste Teil dieser Datei enthält die Interface-Dokumentation des
  6. Units GRAPH. Der zweite Teil enthält Korrekturen und Erweiterungen des
  7. Referenzhandbuchs.
  8.  
  9.  
  10. {*********************************************************}
  11. {                                                         }
  12. {       Turbo Pascal Version 4.0                          }
  13. {       Interface-Dokumentation zu GRAPH                  }
  14. {                                                         }
  15. {       Copyright (c) 1987 by Borland International, Inc. }
  16. {                                                         }
  17. {*********************************************************}
  18.  
  19. {$D-,R-,S-    keine Zusatzinformationen zur Fehlersuche,
  20.               keine Bereichsprüfung, keine Prüfung des Stacks }
  21.  
  22. unit Graph;
  23.  
  24. interface
  25.  
  26. const
  27.   { Mögliche Ergebnisse von GraphResult: }
  28.   grOk               =   0;      { fehlerfreie Ausführung }
  29.   grNoInitGraph      =  -1;      { Grafikpaket nicht initialisiert }
  30.   grNotDetected      =  -2;      { kein grafikfähiger Adapter vorhanden
  31.                                    bzw. gewünschter Modus nicht setzbar }
  32.   grFileNotFound     =  -3;      { Grafik-Treiber (*.BGI) nicht gefunden }
  33.   grInvalidDriver    =  -4;      { Grafik-Treiberdatei defekt/ungültig }
  34.   grNoLoadMem        =  -5;      { nicht genug Platz im Speicher für Treiber }
  35.   grNoScanMem        =  -6;      { nicht genug Speicherplatz für FillPoly }
  36.   grNoFloodMem       =  -7;      { nicht genug Speicherplatz für FloodFill }
  37.   grFontNotFound     =  -8;      { Zeichensatz-Datei (*.CHR) nicht gefunden }
  38.   grNoFontMem        =  -9;      { nicht genug Speicherplatz für Zeichensatz }
  39.   grInvalidMode      = -10;      { Grafikmodus vom Treiber nicht unterstützt }
  40.  
  41.   grError            = -11;      { *** ungültiger Parameter beim   *** }
  42.                                  { *** Aufruf einer Grafik-Routine *** }
  43.  
  44.   grIOerror          = -12;      { I/O-Fehler beim Laden einer .BGI- oder
  45.                                    .CHR-Datei }
  46.   grInvalidFont      = -13;      { Grafik-Zeichensatzdatei zerstört/ungültig }
  47.   grInvalidFontNum   = -14;      { Zeichensatz-Nummer unbekannt }
  48.   grInvalidDeviceNum = -15;      { Gerätenummer unbekannt / ungültig }
  49.  
  50.   { Grafik-Treiberprogramme }
  51.   Detect   = 0;    { automatische Erkennung }
  52.   CGA      = 1;
  53.   MCGA     = 2;    { PS/2, Modell 30 }
  54.   EGA      = 3;
  55.   EGA64    = 4;
  56.   EGAMono  = 5;
  57.   RESERVED = 6;
  58.   HercMono = 7;
  59.   ATT400   = 8;
  60.   VGA      = 9;
  61.   PC3270   = 10;
  62.  
  63.   { Mögliche Grafikmodi der einzelnen Treiber }
  64.   CGAC0      = 0;  { 320x200 Palette 0: Hellgrün, Hellrot, Gelb; 1 Seite }
  65.   CGAC1      = 1;  { 320x200 Palette 1: Helltürkis, Hell-Magenta, Weiß }
  66.   CGAC2      = 2;  { 320x200 Palette 2: Grün, Rot, Braun }
  67.   CGAC3      = 3;  { 320x200 Palette 3: Türkis, Magenta, Hellgrau }
  68.   CGAHi      = 4;  { 640x200 S/W; 1 Seite }
  69.  
  70.   MCGAC0     = 0;  { 320x200 Palette 0: Hellgrün, Hellrot, Gelb; 1 Seite }
  71.   MCGAC1     = 1;  { 320x200 Palette 1: Helltürkis, Hell-Magenta, Weiß }
  72.   MCGAC2     = 2;  { 320x200 Palette 2: Grün, Rot, Braun }
  73.   MCGAC3     = 3;  { 320x200 Palette 3: Türkis, Magenta, Hellgrau }
  74.   MCGAMed    = 4;  { 640x200 S/W; 1 Seite }
  75.   MCGAHi     = 5;  { 640x480 S/W; 1 Seite }
  76.  
  77.   EGALo      = 0;  { 640x200 16 Farben, 4 Seiten }
  78.   EGAHi      = 1;  { 640x350 16 Farben, 2 Seiten }
  79.   EGA64Lo    = 0;  { 640x200 16 Farben, 1 Seite }
  80.   EGA64Hi    = 1;  { 640x350 4 Farben, 1 Seite }
  81.   EGAMonoHi  = 3;  { 640x350 S/W; 1 Seite mit 64K, 4 Seiten mit 256 K }
  82.   HercMonoHi = 0;  { 720x348 S/W, 2 Seiten }
  83.  
  84.   ATT400C0   = 0;  { 320x200 Palette 0: Hellgrün, Hellrot, Gelb; 1 Seite }
  85.   ATT400C1   = 1;  { 320x200 Palette 1: Helltürkis, Hell-Magenta, Weiß }
  86.   ATT400C2   = 2;  { 320x200 Palette 2: Grün, Rot, Braun }
  87.   ATT400C3   = 3;  { 320x200 Palette 3: Türkis, Magenta, Hellgrau }
  88.   ATT400Med  = 4;  { 640x200 S/W; 1 Seite }
  89.   ATT400Hi   = 5;  { 640x480 S/W; 1 Seite }
  90.  
  91.   VGALo      = 0;  { 640x200 16 Farben, 4 Seiten }
  92.   VGAMed     = 1;  { 640x350 16 Farben, 2 Seiten }
  93.   VGAHi      = 2;  { 640x480 16 Farben, 1 Seite }
  94.  
  95.   PC3270Hi   = 0;  { 720x350 1 Seite }
  96.  
  97.   { Zeichenfarben }
  98.   Black        = 0;   { Schwarz }
  99.   Blue         = 1;   { Blau }
  100.   Green        = 2;   { Grün }
  101.   Cyan         = 3;   { Türkis }
  102.   Red          = 4;   { Rot }
  103.   Magenta      = 5;   { Magentarot }
  104.   Brown        = 6;   { Braun }
  105.   LightGray    = 7;   { Hellgrau }
  106.   DarkGray     = 8;   { Dunkelgrau }
  107.   LightBlue    = 9;   { Hellblau }
  108.   LightGreen   = 10;  { Hellgrün }
  109.   LightCyan    = 11;  { helles Türkis }
  110.   LightRed     = 12;  { Hellrot }
  111.   LightMagenta = 13;  { helles Magentarot }
  112.   Yellow       = 14;  { Gelb }
  113.   White        = 15;  { Weiß }
  114.  
  115.   { Linienarten -und breiten für Get/SetLineStyle }
  116.   SolidLn    = 0;   { durchgezogen }
  117.   DottedLn   = 1;   { gepunktet }
  118.   CenterLn   = 2;   { Strich Punkt Strich }
  119.   DashedLn   = 3;   { gestrichelt }
  120.   UserBitLn  = 4;   { benutzerdefiniert (mit "Pattern" bei SetLineStyle) }
  121.  
  122.  
  123.   NormWidth  = 1;   { normale Breite (1 Pixel) }
  124.   ThickWidth = 3;   { drei Pixel }
  125.  
  126.   { Set/GetTextStyle }
  127.   DefaultFont   = 0;    { 8x8 Bit pixelweise definiert }
  128.  
  129.   TriplexFont   = 1;    { Vektor-Zeichensätze }
  130.   SmallFont     = 2;
  131.   SansSerifFont = 3;
  132.   GothicFont    = 4;
  133.  
  134.   HorizDir   = 0;       { von links nach rechts }
  135.   VertDir    = 1;       { von unten nach oben }
  136.  
  137.   UserCharSize = 0;     { benutzerdefinierte Zeichengröße }
  138.  
  139.   { Für das Abschneiden von Linien ("clipping") }
  140.   ClipOn  = True;
  141.   ClipOff = False;
  142.  
  143.   { Für Bar3D }
  144.   TopOn  = True;        { "Deckel" wird gezeichnet }
  145.   TopOff = False;       { wird nicht gezeichnet }
  146.  
  147.   { Füll-Muster für Get/SetFillStyle: }
  148.   EmptyFill       = 0;  { Füllen mit der Hintergrundfarbe }
  149.   SolidFill       = 1;  { Füllen mit der Zeichenfarbe }
  150.   LineFill        = 2;  { --- }
  151.   LtSlashFill     = 3;  { /// }
  152.   SlashFill       = 4;  { /// mit dicken Linien }
  153.   BkSlashFill     = 5;  { \\\ mit dicken Linien }
  154.   LtBkSlashFill   = 6;  { \\\ }
  155.   HatchFill       = 7;  { leicht schraffiert }
  156.   XHatchFill      = 8;  { stark schraffiert, überkreuzend }
  157.   InterleaveFill  = 9;  { abwechselnde Linien }
  158.   WideDotFill     = 10; { weit auseinanderstehende Punkte }
  159.   CloseDotFill    = 11; { dicht beieinanderstehende Punkte }
  160.   UserFill        = 12; { benutzerdefiniert }
  161.  
  162.   { BitBlt ("Bit Block Transfer") - Möglichkeiten für PutImage }
  163.   NormalPut     = 0;    { MOV }
  164.   XORPut        = 1;    { XOR }
  165.   OrPut         = 2;    { OR  }
  166.   AndPut        = 3;    { AND }
  167.   NotPut        = 4;    { NOT }
  168.  
  169.   { Horizontale / vertikale Justierung mit SetTextJustify }
  170.   LeftText   = 0;   { linksbündig }
  171.   CenterText = 1;   { zentriert }
  172.   RightText  = 2;   { rechtsbündig }
  173.  
  174.   BottomText = 0;   { unten abschließend }
  175. { CenterText = 1;  bereits definiert }
  176.   TopText    = 2;   { oben abschließend }
  177.  
  178.  
  179. const
  180.   MaxColors = 15;
  181. type
  182.   PaletteType = record
  183.       Size   : Byte;
  184.       Colors : array[0..MaxColors] of ShortInt;
  185.     end;
  186.  
  187.   LineSettingsType = record
  188.       LineStyle : Word;
  189.       Pattern   : Word;
  190.       Thickness : Word;
  191.     end;
  192.  
  193.   TextSettingsType = record
  194.       Font      : Word;
  195.       Direction : Word;
  196.       CharSize  : Word;
  197.       Horiz     : Word;
  198.       Vert      : Word;
  199.     end;
  200.  
  201.   FillSettingsType = record               { vordefiniertes Füll-Muster }
  202.       Pattern : Word;
  203.       Color   : Word;
  204.     end;
  205.  
  206.   FillPatternType = array[1..8] of Byte;  { benutzerdefiniertes Füll-Muster }
  207.  
  208.   PointType = record
  209.       X, Y : Integer;
  210.     end;
  211.  
  212.   ViewPortType = record
  213.       x1, y1, x2, y2 : Integer;
  214.       Clip           : Boolean;
  215.     end;
  216.  
  217.   ArcCoordsType = record
  218.       X, Y           : Integer;
  219.       Xstart, Ystart : Integer;
  220.       Xend, Yend     : Integer;
  221.     end;
  222.  
  223. var
  224.   GraphGetMemPtr  : Pointer;   { zeigt auf GraphGetMem und kann auf eine
  225.                                  eigene Routine gesetzt werden }
  226.   GraphFreeMemPtr : Pointer;   { zeigt auf GraphFreeMem }
  227.  
  228.  
  229. { ------------------- Routinen ---------------------- }
  230.  
  231. { *** Fehlerbehandlung *** }
  232. function GraphErrorMsg(ErrorCode : Integer) : String;
  233. function GraphResult : Integer;
  234.  
  235. { *** Prüfung der Hardware, Initialisierung und Setzen der Grafikmodi *** }
  236. procedure DetectGraph(var GraphDriver, GraphMode : Integer);
  237.  
  238. procedure InitGraph(var GraphDriver : Integer;
  239.                     var GraphMode   : Integer;
  240.                         PathToDriver : String);
  241.  
  242. function RegisterBGIFont(font : Pointer) : Integer;
  243. function RegisterBGIDriver(driver : Pointer) : Integer;
  244. procedure SetGraphBufSize(BufSize : Word);
  245. procedure GetModeRange(GraphDriver : Integer; var LoMode, HiMode : Integer);
  246. procedure SetGraphMode(Mode : Integer);
  247. function GetGraphMode : Integer;
  248. procedure GraphDefaults;
  249. procedure RestoreCrtMode;
  250. procedure CloseGraph;
  251.  
  252. function  GetX : Integer;
  253. function  GetY : Integer;
  254. function  GetMaxX : Integer;
  255. function  GetMaxY : Integer;
  256.  
  257. { *** Bildschirm, Zeichenfenster und Speicherseiten *** }
  258. procedure ClearDevice;
  259. procedure SetViewPort(x1, y1, x2, y2 : Integer; Clip : Boolean);
  260. procedure GetViewSettings(var ViewPort : ViewPortType);
  261. procedure ClearViewPort;
  262. procedure SetVisualPage(Page : Word);
  263. procedure SetActivePage(Page : Word);
  264.  
  265. { *** Einzelne Pixel und pixelweise definierte Bildausschnitte *** }
  266. procedure PutPixel(X, Y : Integer; Pixel : Word);
  267. function  GetPixel(X, Y : Integer) : Word;
  268. function  ImageSize(x1, y1, x2, y2 : Integer) : Word;
  269. procedure GetImage(x1, y1, x2, y2 : Integer; var BitMap);
  270. procedure PutImage(X, Y : Integer; var BitMap; BitBlt : Word);
  271.  
  272.  
  273. { *** Linien *** }
  274. procedure LineTo(X, Y : Integer);
  275. procedure LineRel(Dx, Dy : Integer);
  276. procedure MoveTo(X, Y : Integer);
  277. procedure MoveRel(Dx, Dy : Integer);
  278. procedure Line(x1, y1, x2, y2 : Integer);
  279. procedure GetLineSettings(var LineInfo : LineSettingsType);
  280. procedure SetLineStyle(LineStyle, Pattern, Thickness : Word);
  281.  
  282. { *** Polygone, Flächenfüllung und grafische Objekte *** }
  283. procedure Rectangle(x1, y1, x2, y2 : Integer);
  284. procedure Bar(x1, y1, x2, y2 : Integer);
  285. procedure Bar3D(x1, y1, x2, y2 : Integer; Depth : Word; Top : Boolean);
  286. procedure DrawPoly(NumPoints : Word; var PolyPoints);
  287. procedure FillPoly(NumPoints : Word; var PolyPoints);
  288. procedure GetFillSettings(var FillInfo : FillSettingsType);
  289. procedure GetFillPattern(var FillPattern : FillPatternType);
  290. procedure SetFillStyle(Pattern : Word; Color : Word);
  291. procedure SetFillPattern(Pattern : FillPatternType; Color : Word);
  292. procedure FloodFill(X, Y : Integer; Border : Word);
  293.  
  294. { *** Kreise, Kreisauschnitte und andere Kurven *** }
  295. procedure Arc(X, Y : Integer; StAngle, EndAngle, Radius : Word);
  296. procedure GetArcCoords(var ArcCoords : ArcCoordsType);
  297. procedure Circle(X, Y : Integer; Radius : Word);
  298. procedure Ellipse(X, Y : Integer;
  299.                   StAngle, EndAngle : Word;
  300.                   XRadius, YRadius  : Word);
  301. procedure GetAspectRatio(var Xasp, Yasp : Word);
  302. procedure PieSlice(X, Y : Integer; StAngle, EndAngle, Radius : Word);
  303.  
  304. { *** Farben und Farb-Paletten *** }
  305. procedure SetBkColor(Color : Word);
  306. procedure SetColor(Color : Word);
  307. function GetBkColor : Word;
  308. function GetColor : Word;
  309. procedure SetAllPalette(var Palette);
  310. procedure SetPalette(ColorNum : Word; Color : ShortInt);
  311. procedure GetPalette(var Palette : PaletteType);
  312. function GetMaxColor : Word;
  313.  
  314.  
  315. { *** Textausgabe *** }
  316. procedure GetTextSettings(var TextInfo : TextSettingsType);
  317. procedure OutText(TextString : string);
  318. procedure OutTextXY(X, Y : Integer; TextString : string);
  319. procedure SetTextJustify(Horiz, Vert : Word);
  320. procedure SetTextStyle(Font, Direction : Word; CharSize : Word);
  321. procedure SetUserCharSize(MultX, DivX, MultY, DivY : Word);
  322. function  TextHeight(TextString : string) : Word;
  323. function  TextWidth(TextString : string) : Word;
  324.  
  325. implementation
  326.  
  327.  
  328. ======================================================================
  329.                     KORREKTUREN UND ERWEITERUNGEN
  330. ======================================================================
  331.  
  332. Die Veränderungen im Unit GRAPH, die sich nach der Drucklegung des
  333. Handbuchs ergeben haben, lassen sich in drei Kategorien einteilen:
  334.  
  335.   1. Änderung der Parametertypen. Aus Gründen der Einheitlichkeit sind
  336.      *alle* formalen Parameter nach dem folgenden Schema typisiert:
  337.  
  338.      o Alle Koordinaten haben den Typ Integer - auch dann, wenn sie im
  339.        Handbuch teilweise als Word ausgewiesen sind.
  340.      o Alle Fehlercodes des Grafikpakets haben negative Werte und werden
  341.        als Integer zurückgeliefert (wie auch im Handbuch beschrieben).
  342.      o Variablen für Grafiktreiber-Nummern und Grafikmodi (in den
  343.        Beispielprogrammen durchgehend als GraphDriver, GraphMode dekla-
  344.        riert) haben den Typ Integer, weil sie auch für das Zurückliefern
  345.        von Fehlercodes benutzt werden.
  346.      o Andere numerische Parameter sind vorzeichenlose (Word oder Byte).
  347.  
  348.      Hinweis: Sowohl das Interface-Listing im ersten Teil dieser Datei
  349.      als auch die eingebaute Syntax-Hilfestellung des Editors (Ctrl-F1)
  350.      sind auf dem neuesten Stand, d.h. geben die tatsächlich verwendeten
  351.      Parametertypen wieder.
  352.  
  353.   2. Neue Prozeduren und Funktionen:
  354.  
  355.       o GetFillPattern - liefert das mit dem letzten Aufruf von
  356.         SetFillPattern gesetzte Füll-Muster zurück.
  357.       o GetMaxColor - liefert die höchste für den momentanen Treiber und
  358.         Modus verfügbare Zeichenfarbe zurück.
  359.       o GetModeRange - ermittelt, welche Grafikmodi für den momentan
  360.         verwendeten Treiber zulässig sind.
  361.       o GraphDefaults - setzt alle Parameter des Grafikpakets auf ihre
  362.         Standardwerte zurück (die Prozedur ClearDevice erfüllt diese
  363.         Funktion nicht mehr).
  364.       o RegisterBGIDriver - erlaubt die Verwendung von Grafik-Treibern,
  365.         die direkt mit {$L} in ein Programm aufgenommen wurden.
  366.       o RegisterBGIFont - erlaubt die Verwendung von Grafik-Zeichensätzen,
  367.         die direkt mit {$L} in ein Programm aufgenommen wurden.
  368.       o SetGraphBufSize - verändert die Größe des Puffers, der für
  369.         Flächenfüllungen verwendet wird.
  370.       o SetUserCharSize - ermöglicht die Skalierung von Zeichensätzen
  371.         in X- und Y-Richtung.
  372.  
  373.   3. Korrekturen und Erweiterungen bereits beschriebener Routinen und
  374.      allgemeiner Konzept des Grafikpakets.
  375.  
  376. ==========================================
  377. Änderungen und Erweiterungen zu Kapitel 23
  378. ==========================================
  379.  
  380. Grafik-Cursor
  381. -------------
  382.      Die Position des Grafik-Cursors wird durch Aufrufe der folgenden
  383.      Routinen verändert:
  384.  
  385.       InitGraph     SetGraphMode    setzen den GC auf (0,0) (relativ zum
  386.       ClearDevice   GraphDefaults   momentan definierten Zeichenfenster,
  387.       ClearViewPort SetViewPort     soweit vorhanden)
  388.  
  389.       MoveTo  MoveRel  LineTo       setzen den GC auf den angegebenen
  390.       LineRel OutText               Punkt bzw. auf den Punkt, auf dem das
  391.                                     letzte Pixel gezeichnet wurde
  392.  
  393.  
  394. Grafik-Treiber und Grafik-Zeichensätze
  395. --------------------------------------
  396.      Grafik-Treiber können nicht nur über InitGraph zur Laufzeit des
  397.      Programms von der Diskette geladen werden - sie lassen sich auch
  398.      bei der Compilierung als .OBJ-Datei einbinden, mit der neuen
  399.      Funktion RegisterBGIDriver "registrieren" und direkt starten.
  400.      Entsprechendes gilt für Grafik-Zeichensätze, die entweder über
  401.      SetTextStyle zur Laufzeit des Programms geladen oder als .OBJ-Datei
  402.      eingebunden, mit der neuen Funktion RegisterBGIFont "registriert"
  403.      und zur Laufzeit des Programms nur noch aufgerufen werden.
  404.  
  405.  
  406. Grafiktreiber für den TOSHIBA 3100
  407. ----------------------------------
  408.      Der Toshiba 3100 unterstützt einen Grafikmodus mit 640*400 Pixeln,
  409.      der zum entsprechenden Modus des AT&T kompatibel ist - lediglich
  410.      die Aktivierung dieses Modus über den Interrupt $10 funktioniert
  411.      etwas anders. Um diesen Grafikmodus auf einem Toshiba 3100 zu
  412.      verwenden, sind zwei Schritte notwendig:
  413.  
  414.      1) Ein 1-Byte-Patch des Grafiktreibers ATT.BGI. Mit den folgenden
  415.         Befehlen wird das $655.Byte dieses Treibers von $40 auf den
  416.         Wert $74 umgeändert und danach wieder gespeichert:
  417.         Auf der Kommandoebene von DOS geben Sie den Befehl
  418.         DEBUG ATT.BGI
  419.         Dadurch wird das Programm DEBUG aufgerufen und lädt ATT.BGI
  420.         in den Speicher.
  421.         Hinweis: ATT.BGI muß sich im momentan gesetzten Directory
  422.         befinden.
  423.         Innerhalb von DEBUG geben Sie die folgenden Befehle:
  424.         E655 <RETURN>   - ("Enter" 655)
  425.         74 <RETURN>     - (neuer Wert)
  426.         W <RETURN>      - (Zurückschreiben der Datei)
  427.         Q <RETURN>      - (Beenden von DEBUG)
  428.  
  429.         ACHTUNG: Dieser modifizierte Treiber kann nicht mehr auf
  430.         einem AT&T-Computer verwendet werden!
  431.  
  432.      2) Innerhalb von Grafikprogrammen müssen Sie den Treiber explizit
  433.         setzen, also beispielsweise
  434.  
  435.         program ToshibaDemo;
  436.         var
  437.           GraphDriver, GraphMode: Integer;
  438.           ...
  439.         begin
  440.           GraphDriver := ATT400; GraphMode := ATT400C0;
  441.           InitGraph(GraphDriver, GraphMode, '');
  442.            ...
  443.  
  444.  
  445. Automatische Erkennung des Grafik-Adapters
  446. ------------------------------------------
  447.      Es hat sich gezeigt, daß das von IBM vorgeschlagene Schema zur
  448.      automatischen Erkennung von Grafik-Adaptern nicht immer korrekt
  449.      arbeitet: Auf dem PCJr identifiziert sich der Grafik-Adapter in
  450.      einigen Fällen als Nummer 6 (= RESERVED). Wenn Sie mit einem PCJr
  451.      arbeiten, sollten Sie deshalb die folgenden Anweisungen zur
  452.      Initialisierung des Grafikpakets verwenden:
  453.  
  454.        uses Graph;
  455.        var
  456.          GraphDriver, GraphMode : Integer;
  457.        begin
  458.          ...
  459.          GraphDriver := CGA;        { PCjr emuliert CGA-Karte }
  460.          GraphMode := CGAC1;        { Hier geben Sie den gewünschten Modus an }
  461.          InitGraph(GraphDriver, GraphMode, '');
  462.          ...
  463.        end.
  464.  
  465.      Ähnliche Probleme treten auf dem Modell 8514 bei Verwendung des
  466.      speicherresidenten Grafik-Treibers von IBM auf, der sich ebenfalls
  467.      als Nummer 6 (RESERVED) identifiziert. Hier sollten Sie die auto-
  468.      matische Erkennung grundsätzlich mit den folgenden Anweisungen
  469.      außer Kraft setzen:
  470.  
  471.        uses Graph;
  472.        var
  473.          GraphDriver, GraphMode : Integer;
  474.        begin
  475.          ...
  476.          GraphDriver := VGA;        { IBM 8514 emuliert VGA-Karte }
  477.          GraphMode := VGAHi;        { Hier geben Sie den
  478.                                       gewünschten Modus an }
  479.          InitGraph(GraphDriver, GraphMode, '');
  480.          ...
  481.        end.
  482.  
  483.      Solange Sie den speicherresidenten Treiber von IBM nicht verwenden,
  484.      funktioniert die automatische Erkennung zuverlässig, d.h. InitGraph
  485.      benutzt den VGA-Treiber.
  486.  
  487. Dynamische Belegung des Speichers
  488. ---------------------------------
  489.      Graph belegt Teile des Heap für drei Puffer, nämlich:
  490.  
  491.      o Einen Allzweck-Puffer, dessen Größe mit SetGraphBufSize fest-
  492.        gelegt werden kann (Standard: 4 KByte). Dieser Puffer wird beim
  493.        Aufruf von InitGraph immer belegt.
  494.      o Den aktiven Grafik-Treiber, solange er als .BGI-Datei über
  495.        InitGraph geladen wird.
  496.      o Den aktiven Vektor-Zeichensatz, solange er als .CHR-Datei über
  497.        SetTextStyle geladen wird.
  498.  
  499.      Der Initialisierungsteil des Units Graph installiert eine Routine
  500.      zur Behandlung von Fehlern bei der dynamischen Speicher-
  501.      verwaltung, d.h. verändert den Zeiger HeapError. Diese Routine
  502.      arbeitet genauso wie die in Kapitel 25 beschriebene "benutzer-
  503.      definierte" Routine: Wenn ein Programm das Unit Graph aufnimmt,
  504.      liefern Aufrufe von New und GetMem den Zeigerwert nil zurück,
  505.      falls nicht genügend Speicherplatz auf dem Heap vorhanden ist.
  506.      (Wenn Graph nicht mit uses aufgenommen und keine eigene Routine
  507.      über HeapError installiert wurde, bricht das Programm mit einem
  508.      Laufzeitfehler ab, falls New oder GetMem eine Belegung nicht
  509.      ausführen können).
  510.  
  511. Interface-Listing von GRAPH
  512. ---------------------------
  513.      Hier haben sich seit der Drucklegung des Handbuchs einige Ände-
  514.      rungen ergeben. Bitte verwenden Sie die Interface-Dokumentation
  515.      aus dem ersten Teil dieser Datei.
  516.  
  517.  
  518. VGA-Grafikmodi
  519. --------------
  520.      Das Unit Graph unterstützt drei Grafikmodi für VGA-Karten:
  521.      VGALo, VGAMed und VGAHi. VGA-Karten können darüber hinaus
  522.      dem MCGA-Modus mit 640*480 Pixel, 2 Farben und 2 Speicherseiten
  523.      emulieren. Das folgende Beispiel demonstriert, wie sich dieser
  524.      Modus setzen läßt:
  525.  
  526.        uses Graph;
  527.        var
  528.          GraphDriver, GraphMode, Err : Integer;
  529.        begin
  530.          GraphDriver := MCGA;   { explizit: MCGA-Treiber }
  531.          GraphMode := MCGAHi;   { explizit: Modus MCGAHi }
  532.  
  533.          InitGraph(GraphDriver, GraphMode, '');
  534.          if GraphResult < 0 then Halt(1);
  535.          OutText('MCGA-Modus (640x480) auf VGA');
  536.          Readln;
  537.          CloseGraph;
  538.       end.
  539.  
  540.  
  541. Änderungen und Erweiterungen zum Referenzteil (Kapitel 26)
  542. ==========================================================
  543.  
  544. Bar, Bar3D
  545. ----------
  546.      Fehler während des Ausfüllens der Fläche können nicht auftreten,
  547.      GraphResult bleibt von Bar und Bar3D unbeeinflußt.
  548.      Ein Tip: Bar zeichnet keinen Umriß des Balkens - um einen Umriß
  549.      in der momentanen Linienart und -farbe zu erhalten, können Sie
  550.      Bar3D mit Depth = 0 verwenden.
  551.  
  552. ClearDevice
  553. -----------
  554.      ClearDevice löscht den gesamten Bildschirm und setzt den
  555.      Grafik-Cursor auf den Punkt (0,0) innerhalb des momentan
  556.      gesetzten Zeichenfensters. Entgegen der Angabe im Handbuch
  557.      werden die Parameter des Grafikpakets nicht zurückgesetzt -
  558.      dazu dient die neue Prozedur GraphDefaults.
  559.  
  560. CloseGraph
  561. ----------
  562.      CloseGraph entfernt Grafik-Treiber und Zeichensätze nur dann aus
  563.      dem Hauptspeicher, wenn sie als separate Dateien (.BGI und .CHR)
  564.      geladen wurden. Mit RegisterBGIDriver und RegisterBGIFont
  565.      "registrierte" Treiber und Zeichensätze, die Teil der .EXE-Datei
  566.      sind, befinden sich im entsprechenden Code-Segment (d.h. nicht
  567.      auf dem Heap) und werden folglich auch nicht entfernt.
  568.  
  569.  
  570. DrawPoly
  571. --------
  572.      GraphResult wird durch das Zeichnen von Polygonen mit DrawPoly
  573.      nicht beeinflußt.
  574.  
  575.  
  576. FillPoly
  577. --------
  578.      Im Gegensatz zu DrawPoly muß der erste und letzte Punkt nicht
  579.      doppelt angegeben werden, die sechste Angabe für die Konstante
  580.      Pentagon im Beispielprogramm ist also unnötig. FillPoly zeichnet
  581.      zuerst den Umriß des Polygons - wenn Sie zuvor die Hintergrund-
  582.      farbe als Zeichenfarbe setzen, bleibt dieser Umriß unsichtbar.
  583.  
  584. FloodFill
  585. ---------
  586.      Da die Parametertypen der Grafikfunktionen vereinheitlicht
  587.      wurden, haben die Parameter X und Y den Typ Integer. Die korrekte
  588.      Deklaration von Floodfill ist:
  589.  
  590.        procedure FloodFill(X, Y : Integer; Border : Word);
  591.  
  592.      Bitte beachten Sie, daß FloodFill die Flächenfüllung nach der
  593.      aufeinanderfolgenden Ausgabe zweier komplett leerer Linien
  594.      beendet. Bei kleinen Flächen und einem Füll-Muster, das nur
  595.      wenige gesetzte Bits enthält, wird die Fläche nicht immer
  596.      komplett gefüllt. Ein Beispiel:
  597.  
  598.        program StopFill;
  599.        uses Graph;
  600.        var
  601.          GraphDriver, GraphMode : Integer;
  602.        begin
  603.          GraphDriver := Detect;
  604.          InitGraph(GraphDriver, GraphMode, '');
  605.          if GraphResult <> grOk then Halt(1);
  606.          SetFillStyle(LtSlashFill, GetMaxColor);
  607.          Rectangle(0, 0, 8, 20);
  608.          FloodFill(1, 1, GetMaxColor);   { wird nicht ganz ausgefüllt }
  609.          Readln;
  610.          CloseGraph;
  611.        end.
  612.  
  613.      Bei der Verwendung eines dichteren Musters (z.B. SlashFill) tritt
  614.      diese Unregelmäßigkeit nicht auf.
  615.  
  616.      Der Querverweis für FloodFill sollte SetFillStyle und
  617.      SetFillPattern auflisten (anstelle der nicht existierenden
  618.      Prozedur SetFloodPattern).
  619.  
  620. GetArcCoords
  621. ------------
  622.      Der Typ ArcCoordsType ist inkorrekt wiedergegeben. Die korrekte
  623.      Deklaration ist:
  624.  
  625.        type
  626.          ArcCoordsType = record
  627.            X, Y,
  628.            Xstart, Ystart,         { nicht: Xs, Ys }
  629.            Xend, Yend : Integer;   { nicht: Word }
  630.          end;
  631.  
  632.  
  633. GetFillPattern                                       [ Neue Prozedur ]
  634. --------------
  635.        procedure GetFillPattern(var FillPattern : FillPatternType);
  636.  
  637.      Liefert das Bitmuster zurück, das mit dem letzten vorhergehenden
  638.      Aufruf von SetFillPattern gesetzt wurde. Der Typ FillPatternType
  639.      ist im Unit GRAPH folgendermaßen definiert:
  640.  
  641.       type
  642.         FillPatternType = array[1..8] of Byte;
  643.  
  644.      Falls SetFillPattern seit dem Start des Grafikpakets noch nicht
  645.      aufgerufen wurde, liefert GetFillPattern ein mit dem Wert $FF
  646.      gefülltes Array zurück.
  647.  
  648. GetGraphMode
  649. ------------
  650.      Die angegebene Liste der möglichen Ergebnisse wurde erweitert
  651.      (siehe Interface-Dokumentation im ersten Teil dieser Datei).
  652.  
  653. GetImage
  654. --------
  655.      Da die Parametertypen der Grafikfunktionen vereinheitlicht
  656.      wurden, haben die Parameter x1, y1, x2 und y2 den Typ Integer.
  657.      Die korrekte Deklaration ist:
  658.  
  659.        procedure GetImage(x1, y1, x2, y2 : Integer; var BitMap);
  660.  
  661.  
  662. GetMaxColor                                           [ Neue Funktion ]
  663. -----------
  664.        function GetMaxColor : Word;
  665.  
  666.      Liefert die Nummer der "höchsten" Zeichenfarbe zurück, der
  667.      geladene Treiber im momentan gesetzten Grafikmodus unterstützt.
  668.      Bei Verwendung einer EGA-Karte mit 256 KByte Speicher liefert
  669.      GetMaxColor beispiels- weise immer das Ergebnis 15 - SetColor
  670.      kann hier also mit beliebigen Werten im Bereich von 0..15
  671.      aufgerufen werden.
  672.      Für eine CGA-Karte im Modus "hohe Auflösung" oder eine Hercules-
  673.      Karte ist das Ergebnis von GetMaxColor der Wert 1 (in beiden
  674.      Fällen können mit SetColor nur die "Farben" 0 und 1 gesetzt
  675.      werden).
  676.  
  677. GetMaxX, GetMaxY
  678. ----------------
  679.      Da die Parametertypen der Grafikfunktionen vereinheitlicht
  680.      wurden, haben GetMaxX und GetMaxY den Ergebnistyp Integer. Die
  681.      korrekten Deklarationen sind:
  682.  
  683.        function  GetMaxX : Integer;
  684.        function  GetMaxY : Integer;
  685.  
  686. GetModeRange                                         [ Neue Prozedur ]
  687. ------------
  688.        procedure GetModeRange(GraphDriver: Integer;
  689.                               var LoMode, HiMode: Integer);
  690.  
  691.      Ermittelt den niedrigsten (LoMode) und den höchsten (HiMode)
  692.      Grafikmodus, der für den als GraphDriver angegebenen Grafik-
  693.      Treiber verwendbar ist. Ein Beispiel:
  694.  
  695.        uses Graph;
  696.        var
  697.          Lowest, Highest : Integer;
  698.        begin
  699.          GetModeRange(EGA64, Lowest, Highest);
  700.          Write('Niedrigster Grafikmodus: ', Lowest);    { 0 }
  701.          Write('Höchster Modus: ', Highest);            { 1 }
  702.        end.
  703.  
  704.      Mögliche Werte für GraphDriver gehen von 1..5 und von 7..10.
  705.      Werte außerhalb dieser Bereiche setzen die als LoMode und HiMode
  706.      übergebenen Variablen auf -1.
  707.  
  708. GetViewSettings
  709. ---------------
  710.      Da die Parametertypen der Grafikfunktionen vereinheitlicht
  711.      wurden, haben die Felder x1, y1, x2 und y2 des Record-Typs
  712.      ViewPortType den Typ Integer. Die korrekte Definition von
  713.      ViewPortType ist:
  714.  
  715.        ViewPortType = record
  716.           x1, y1, x2, y2 : Integer;
  717.           Clip           : Boolean;
  718.         end;
  719.  
  720. GraphDefaults                                        [ Neue Prozedur ]
  721. -------------
  722.        procedure GraphDefaults;
  723.  
  724.      Setzt den Grafik-Cursor auf die (Bildschirm-)Koordinaten (0,0)
  725.      und die folgenden Parameter des Grafikpakets auf ihre Standard-
  726.      werte zurück:
  727.  
  728.       o Zeichenfenster (gesamter Bildschirm)
  729.       o Farb-Palette
  730.       o Zeichenfarbe (höchste Farbnummer), Hintergrundfarbe (0)
  731.       o Linienart (durchgezogen) und -breite (normal, d.h. 1 Pixel)
  732.       o Füll-Muster (Solid), Farbe (höchste Farbnummer), benutzer-
  733.         definiertes Füll-Muster ($FF $FF ... )
  734.       o Zeichensatz (8*8), Textrichtung (horizontal), Justierung
  735.         (Linksbündig), UserCharSize (0)
  736.  
  737. GraphResult
  738. -----------
  739.      GraphResult bleibt von Bar, Bar3D und DrawPoly unbeeinflußt. Der
  740.      Aufruf einer der folgenden Routinen mit unzulässigen Parametern
  741.      läßt die entsprechenden Werte des Grafikpakets unverändert und
  742.      erzeugt den Fehlerstatus -11:
  743.  
  744.        SetAllPalette   SetFillPattern   SetFillStyle   SetLineStyle
  745.        SetPalette      SetTextJustify   SetTextStyle   SetViewPort
  746.  
  747.      GraphResult wird durch die folgenden Routinen gesetzt:
  748.  
  749.        DetectGraph, FillPoly, FloodFill, ImageSize, InitGraph,
  750.        PieSlice, RegisterBGIDriver, RegisterBGIFont, SetAllPalette,
  751.        SetFillPattern, SetFillStyle, SetGraphBufSize, SetGraphMode,
  752.        SetLineStyle, SetPalette, SetTextJustify, SetTextStyle,
  753.        SetViewPort
  754.  
  755.      Die möglichen Ergebnisse von GraphResult wurden um Werte im
  756.      Bereich von -11..-15 erweitert. Eine vollständige Liste finden
  757.      Sie in der Interface-Dokumentation im ersten Teil dieser Datei.
  758.  
  759. ImageSize
  760. ---------
  761.      Da die Parametertypen der Grafikfunktionen vereinheitlicht
  762.      wurden, haben x1, y1, x2 und y2 den Typ Integer. Die korrekte
  763.      Definition von ImageSize ist:
  764.  
  765.        function  ImageSize(x1, y1, x2, y2 : Integer) : Word;
  766.  
  767. InitGraph
  768. ---------
  769.      Zu den angegebenen Fehlercodes kommen die Möglichkeiten -10
  770.      (Grafikmodus wird vom geladenen Treiber nicht unterstützt) und
  771.      -15 (ungültige Gerätenummer) hinzu.
  772.  
  773.  
  774. OutText, OutTextXY
  775. ------------------
  776.      Die Position des Grafik-Cursors wird von OutText nur dann
  777.      verändert, wenn die Ausgabe in horizontaler Richtung (d.h. nach
  778.      dem Aufruf SetTextStyle (..., HorizDir, ...)) erfolgt und mit
  779.      linksbündiger oder rechtsbündiger Justierung (SetTextJustify)
  780.      gearbeitet wird. Ausgaben in vertikaler Richtung und/oder
  781.      mittenzentrierter Justierung ändern die Position des
  782.      Grafik-Cursors nicht! Ein Beispiel:
  783.  
  784.        program CPupdate;
  785.        uses Graph;
  786.        var
  787.          GraphDriver, GraphMode : Integer;
  788.        begin
  789.          GraphDriver := Detect;
  790.          InitGraph(GraphDriver, GraphMode, '');
  791.          if GraphResult < 0 then Halt(1);
  792.  
  793.          MoveTo(0, 0);
  794.          SetTextStyle(DefaultFont, HorizDir, 1); { Zeichengröße 1 }
  795.          SetTextJustify(LeftText, TopText);
  796.          OutText('ABC');                         { verändert den GC }
  797.          OutText('DEF');                         { verändert den GC }
  798.  
  799.          MoveTo(100, 50);
  800.          SetTextStyle(DefaultFont, HorizDir, 1); { Zeichengröße 1}
  801.          SetTextJustify(RightText, TopText);
  802.          OutText('ABC');                         { verändert den GC }
  803.          OutText('DEF');                         { verändert den GC }
  804.  
  805.          MoveTo(100, 100);
  806.          SetTextStyle(DefaultFont, VertDir, 1);  { Zeichengröße 1 }
  807.          SetTextJustify(LeftText, TopText);
  808.          OutText('ABC');                         { verändert den GC NICHT }
  809.          OutText('DEF');                         { überschreibt 'ABC ' }
  810.  
  811.          Readln;
  812.          CloseGraph;
  813.        end.
  814.  
  815.      Aufrufe von OutTextXY lassen die Position des GC immer
  816.      unverändert - egal, in welcher Richtung und mit welcher
  817.      Justierung sie erfolgen.
  818.  
  819.      Mit dem Standard-Zeichensatz (8x8) geschriebene Ausgaben werden
  820.      bei Überschreitung der Fenster- bzw. Bildschirmgrenzen nicht
  821.      abgeschnitten - stattdessen unterdrücken OutText und OutTextXY
  822.      die Ausgabe vollständig, wenn der Text nicht auf den Bildschirm
  823.      passen würde. Die folgenden Beispiele führen deshalb überhaupt
  824.      keine Ausgaben aus:
  825.  
  826.        SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn);
  827.        SetTextJustify(LeftText, TopText);
  828.        OutTextXY(-5, 0);                  { -5,0 ist außerhalb des Schirms }
  829.        OutTextXY(GetMaxX - 1, 0, 'ABC');  { ein Teil von 'A' sowie 'BC'
  830.                                             wäre außerhalb des Schirms }
  831.  
  832.      Ausgaben mit den Vektor-Zeichensätzen werden dagegen am Rand des
  833.      Bildschirms bzw. Zeichenfensters abgeschnitten, eine Unter-
  834.      drückung findet hier nicht statt.
  835.  
  836. PutImage
  837. --------
  838.      Ein mit PutImage kopierter Bildausschnitt wird nicht abge-
  839.      schnitten, wenn er die Grenzen des Zeichenfensters oder des
  840.      Bildschirms in horizontaler Richtung überschreitet oder der
  841.      Startpunkt außerhalb des Bildschirms liegt - PutImage führt in
  842.      diesen Fällen überhaupt keine Operationen aus. Die mittleren drei
  843.      Aufrufe von PutImage im folgenden Beispiel haben deshalb keine
  844.      sichtbare Wirkung:
  845.  
  846.        program NoClip;
  847.        uses graph;
  848.        var
  849.          GraphDriver, GraphMode : Integer;
  850.          p : Pointer;
  851.        begin
  852.          GraphDriver := Detect;
  853.          InitGraph(GraphDriver, GraphMode, '');
  854.          if GraphResult < 0 then Halt(1);
  855.          SetViewPort(0, 0, GetMaxX, GetMaxY, Clipon);
  856.          GetMem(p, ImageSize(0, 0, 99, 49));    { 100 * 50 Pixel }
  857.          PieSlice(50, 25, 0, 360, 45);
  858.          GetImage(0, 0, 99, 49, p^);
  859.          ClearDevice;
  860.          PutImage(GetMaxX - 99, 0, p^, NormalPut);  { paßt gerade noch ... }
  861.          PutImage(GetMaxX - 98, 0,        { X + Höhe > GetMaxX }
  862.                   p^, NormalPut);
  863.          PutImage(-1, 0,                  { -1,0 ist nicht auf dem Schirm }
  864.                    p^, NormalPut);
  865.          PutImage(0, -1,                  { 0,-1 ebenfalls nicht }
  866.                    p^, NormalPut);
  867.          PutImage(0, GetMaxY - 30,        { gibt 31 "Zeilen" des Bildes aus }
  868.                    p^, NormalPut);
  869.          Readln;
  870.          CloseGraph;
  871.        end.
  872.  
  873.      Im fünften Aufruf dieses Beispiels liegt der Startpunkt inner-
  874.      halb des Bildschirms, eine Überschreitung der Fenstergrenzen in
  875.      horizontaler Richtung findet nicht statt. Dieser Fall ist der
  876.      einzige, in dem PutImage ein "abgeschnittenes" Bild zeichnet.
  877.  
  878.  
  879.  
  880. RegisterBGIDriver, RegisterBGIFont                       [ Neue Funktionen ]
  881. ----------------------------------
  882.        function RegisterBGIDriver(driver : Pointer) : Integer;
  883.        function RegisterBGIFont(font : Pointer) : Integer;
  884.  
  885.      Normalerweise belegt GRAPH für einen Treiber (beim Aufruf von
  886.      InitGraph) und für einen der Vektor-Zeichensätze (beim Aufruf von
  887.      SetTextStyle) Speicherplatz auf dem Heap. Beim Wechsel des
  888.      Zeichensatzes wird der entsprechende Platz freigegeben, ein neuer
  889.      Block belegt und die entsprechende .CHR-Datei von der Diskette
  890.      geladen. Über RegisterBGIDriver und RegisterBGIFont lassen sich
  891.      Grafik-Treiber und Zeichensätze "registrieren" - sie bleiben dann
  892.      im Speicher und müssen bei einem erneuten Wechsel nicht erst
  893.      wieder von der Diskette geladen werden. Dieses Verfahren kostet
  894.      mehr Platz im Hauptspeicher, bietet aber zwei Vorteile:
  895.  
  896.      - Ein Wechsel zwischen Zeichensätzen und/oder Treibern geschieht
  897.        ohne Diskettenzugriffe.
  898.      - Nach einer Konvertierung über BINOBJ lassen sich Treiber und
  899.        Zeichensätze direkt in das Programm aufnehmen.
  900.  
  901.      GRAPH speichert Zeichensätze und Treiber, die zur Laufzeit des
  902.      Programms von der Diskette geladen werden, auch nach einer
  903.      "Registrierung" auf dem Heap; mit BINOBJ konvertierte .BGI- und
  904.      .CHR-Dateien, die über {$L} in ein Programm aufgenommen wurden,
  905.      befinden sich dagegen im Code-Segment des jeweiligen Moduls.
  906.  
  907.      Bei fehlerfreier Ausführung ist das Funktionsergebnis von
  908.      RegisterBGIDriver und RegisterBGIFont die interne Nummer des
  909.      Treibers bzw. Zeichensatzes, negative Werte zeigen einen Fehler
  910.      an:
  911.  
  912.         Code   Bezeichner        Erläuterung
  913.         ----   ----------        -----------
  914.          -4    grInvalidDriver   Die Kopfinformationen der .BGI-Datei sind
  915.                                  nicht auswertbar bzw. ungültig (d.h. die
  916.                                  Datei ist aus irgendeinem Grund nicht in
  917.                                  Ordnung).
  918.         -11    grError           Kein weiterer Platz in der Zeichensatz-
  919.                                  tabelle zur "Registrierung". (Die
  920.                                  Tabelle speichert maximal 10 Zeichen-
  921.                                  sätze - dieser Fehler sollte also nicht
  922.                                  vorkommen).
  923.         -13    grInvalidFont     Die Kopfinformationen der .CHR-Datei sind
  924.                                  nicht auswertbar bzw. ungültig.
  925.         -14    grInvalidFontNum  Die Zeichensatz-Nummer in der Kopfinformation
  926.                                  ist nicht bekannt.
  927.  
  928.      Das folgende Beispielprogramm lädt den Zeichensatz "Triplex" von
  929.      der Diskette auf den Heap, "registriert" ihn mit RegisterBGIFont
  930.      und schaltet dann zwischen "Triplex" und einem anderen Vektor-
  931.      Zeichensatz hin und her, wobei der zweite Zeichensatz jeweils
  932.      wieder von der Diskette geladen wird:
  933.  
  934.        program LoadFont;
  935.        uses Graph;
  936.        var
  937.          GraphDriver, GraphMode : Integer;
  938.          FontF : file;
  939.          FontP : Pointer;
  940.        begin
  941.          { Öffnung der Zeichensatz-Datei, Laden auf den Heap und
  942.            Registrierung über RegisterBGIFont }
  943.          Assign(FontF, 'TRIP.CHR'); Reset(FontF, 1);
  944.          GetMem(FontP, FileSize(FontF));
  945.          BlockRead(FontF, FontP^, FileSize(FontF));
  946.          if RegisterBGIFont(FontP) < 0 then
  947.          begin
  948.            Writeln('Fehler bei der Registrierung: ',
  949.                     GraphErrorMsg(GraphResult));
  950.            Halt(1);
  951.          end;
  952.  
  953.          { Start des Grafikpakets }
  954.          GraphDriver := Detect;
  955.          InitGraph(GraphDriver, GraphMode, '');
  956.          if GraphResult < 0 then Halt(1);
  957.  
  958.          Readln;
  959.          { Auswahl des "registrierten" Zeichensatzes: }
  960.          SetTextStyle(TriplexFont, HorizDir, 4);
  961.          OutText('Zeichensatz Triplex (direkt geladen)');
  962.          MoveTo(0, TextHeight('a'));
  963.  
  964.  
  965.          Readln;
  966.          { Auswahl eines Zeichensatzes, der von der Diskette geladen wird }
  967.          SetTextStyle(SansSerifFont, HorizDir, 4);
  968.          OutText('Das Diskettenlaufwerk sollte in Betrieb sein... ');
  969.          MoveTo(0, GetY + TextHeight('a'));
  970.  
  971.          Readln;
  972.          { Erneute Auswahl von Triplex }
  973.          SetTextStyle(TriplexFont, HorizDir, 4);
  974.          OutText('Zeichensatz Triplex - ohne Diskettenzugriffe');
  975.          Readln;
  976.          CloseGraph;
  977.        end.
  978.  
  979.  
  980.      Hinweis: Der 8*8-Zeichensatz ist immer verfügbar, die Umschaltung
  981.      zwischen "DefaultFont" und einem einmal geladenen Vektor-
  982.      Zeichensatz erfolgt also ohne Diskettenzugriffe.
  983.  
  984.  
  985.      Das folgende Beispielprogramm lädt den CGA-Treiber auf den Heap,
  986.      "registriert" ihn mit RegisterBGIDriver und ruft dann InitGraph
  987.      auf:
  988.  
  989.        program LoadDriv;
  990.        uses Graph;
  991.        var
  992.          GraphDriver, GraphMode : Integer;
  993.          DriverF : file;
  994.          DriverP : Pointer;
  995.        begin
  996.          { Öffnen der Treiberdatei, Einlesen auf den Heap und
  997.            Registrierung via RegisterBGIDriver }
  998.          Assign(DriverF, 'CGA.BGI'); Reset(DriverF, 1);
  999.          GetMem(DriverP, FileSize(DriverF));
  1000.          BlockRead(DriverF, DriverP^, FileSIze(DriverF));
  1001.          if RegisterBGIDriver(DriverP) < 0 then
  1002.          begin
  1003.            Writeln('Fehler bei der Registrierung: ',
  1004.                    GraphErrorMsg(GraphResult));
  1005.            Halt(1);
  1006.          end;
  1007.  
  1008.          { Start des Grafikpakets }
  1009.          GraphDriver := CGA;
  1010.          GraphMode := CGAHi;
  1011.          InitGraph(GraphDriver, GraphMode, '');  { keine Disk-Zugriffe! }
  1012.          if GraphResult < 0 then Halt(1);
  1013.  
  1014.          OutText('Grafik-Treiber ist geladen.');
  1015.          Readln;
  1016.          CloseGraph;
  1017.        end.
  1018.  
  1019.      Grafik-Treiber und Zeichensätze können auch direkt in die .EXE-
  1020.      Datei aufgenommen werden - ein derartiges Programm benötigt keine
  1021.      weiteren Dateien und kommt völlig ohne Diskettenzugriffe aus. Die
  1022.      notwendigen Schritte sind in der Datei BINOBJ.DOC ausführlich
  1023.      beschrieben:
  1024.  
  1025.       1. Konvertierung der entsprechenden .BGI- und .CHR-Dateien in
  1026.          .OBJ-Dateien über BINOBJ.EXE.
  1027.       2. Aufnahme dieser .OBJ-Dateien in das Programm mit dem
  1028.          Compiler-Befehl {$L}.
  1029.       3. Entsprechende Aufrufe von RegisterBGIFont und RegisterBGIDriver
  1030.          *vor* dem Start des Grafikpakets mit InitGraph.
  1031.  
  1032.      ACHTUNG: RegisterBGIDriver muß *vor* dem Start des Grafik-Pakets
  1033.      aufgerufen werden - Aufrufe zu einem späteren Zeitpunkt liefern
  1034.      den Fehlercode -11 (grError).
  1035.  
  1036. SetBkColor
  1037. ----------
  1038.      Der Aufruf SetBkColor(N) setzt den N. Eintrag der Farb-Palette
  1039.      als Hintergrundfarbe. Die einzige Ausnahme zu dieser Regel ist
  1040.      SetBkColor(0) - dieser Aufruf setzt unabhängig vom Wert des
  1041.      Paletten-Eintrags 0 immer Schwarz als Hintergrundfarbe.
  1042.  
  1043. SetFillStyle
  1044. ------------
  1045.      Die Standardvorgabe für das Füll-Muster ist "Solid", die
  1046.      Standardvorgabe für die Farbe ist die höchste verfügbare
  1047.      Farbnummer (d.h. das Ergebnis von GetMaxColor).
  1048.  
  1049. SetGraphBufSize                                      [ Neue Prozedur ]
  1050. ---------------
  1051.        procedure SetGraphBufSize(BufSize : Word);
  1052.  
  1053.      Das Unit GRAPH belegt standardmäßig einen Puffer mit 4 KByte als
  1054.      Arbeitsbereich für Flächenfüllungen (FillPoly und FloodFill),
  1055.      was für Polygone mit maximal 650 Eckpunkten ausreichend ist. Die
  1056.      Größe dieses Puffers kann über SetGraphBufSize auf einen anderen
  1057.      Wert festgelegt werden.
  1058.  
  1059.      ACHTUNG: Der Puffer wird durch InitGraph belegt - SetGraphBufSize
  1060.      muß deshalb vor dem Start des Grafikpakets aufgerufen werden
  1061.      (spätere Aufrufe werden einfach ignoriert).
  1062.  
  1063. SetLineStyle
  1064. ------------
  1065.      Das als Pattern übergebene Bitmuster wird nur dann als Linienart
  1066.      gesetzt, wenn LineStyle als UserBitLn angegeben ist, also
  1067.      beispielsweise
  1068.  
  1069.        SetLineStyle(UserBitLn, $AAAA, NormWidth);
  1070.  
  1071.      In allen anderen Fällen wird eines der vorgegebenen Bitmuster
  1072.      benutzt und der Wert von "Pattern" ignoriert.
  1073.  
  1074.      Wie die Werte der Konstanten NormWidth und ThickWidth impli-
  1075.      zieren, haben normale Linien ein Pixel Dicke, "dicke" Linien
  1076.      werden mit drei Pixeln gezeichnet:
  1077.  
  1078.       1010101010101010         { Pattern = $AAAA (UserBitLn), NormWidth }
  1079.  
  1080.       1010101010101010         { Pattern = $AAAA (UserBitLn), ThickWidth }
  1081.       1010101010101010
  1082.       1010101010101010
  1083.  
  1084. SetTextStyle
  1085. ------------
  1086.      Zu den angegebenen Fehlermöglichkeiten kommen drei weitere Codes
  1087.      hinzu:
  1088.  
  1089.        Code    Konstante              Erläuterung
  1090.        ----    ---------              -----------
  1091.         -12    grIOError              I/O-Fehler beim Laden der .CHR-Datei
  1092.         -13    grInvalidFont          Kopfinformation der .CHR-Datei nicht
  1093.                                       auswertbar
  1094.         -14    grInvalidFontNum       Zeichensatz-Nummer in der Kopf-
  1095.                                       information ist unbekannt
  1096.  
  1097.      Die Konstante NormSize ist nicht mehr definiert. Die Standardgröße
  1098.      für den Zeichensatz 8*8 ist 1.
  1099.  
  1100. SetUserCharSize                                      [ Neue Prozedur ]
  1101. ---------------
  1102.        procedure SetUserCharSize(MultX, DivX, MultY, DivY : Byte);
  1103.  
  1104.      Diese Prozedur erlaubt die Festlegung voneinander getrennter
  1105.      Vergrößerungsfaktoren in X- und Y-Richtung für Textausgaben. Der
  1106.      Vergrößerungsfaktor in X-Richtung (d.h. die Breite) ergibt sich
  1107.      aus MultX / DivX, der Vergrößerungsfaktor in Y-Richtung (d.h. die
  1108.      Höhe) aus MultY / DivY). Nach einem Aufruf von SetUserCharSize
  1109.      mit
  1110.  
  1111.        SetUserCharSize(4,1,3,2);
  1112.  
  1113.      und dem Setzen dieser beiden Faktoren über einen Aufruf von
  1114.      SetTextStyle mit
  1115.  
  1116.        SetTextStyle(..., ..., UserCharSize);
  1117.  
  1118.      arbeiten folgende Textausgaben über OutText und OutTextXY mit der
  1119.      Höhe 4 und der Breite 1.5. Ein Beispiel:
  1120.  
  1121.        program CharSize;
  1122.        uses Graph;
  1123.        var
  1124.          GraphDriver, GraphMode, Err : Integer;
  1125.  
  1126.        begin
  1127.          GraphDriver := Detect;
  1128.          InitGraph(GraphDriver, GraphMode, '');
  1129.          Err := GraphResult;
  1130.          if Err < 0 then
  1131.          begin
  1132.            Writeln('Grafik-Fehler: ', GraphErrorMsg(Err));
  1133.            Halt(1);
  1134.          end;
  1135.  
  1136.          SetTextStyle(TriplexFont, Horizdir, 4);
  1137.          OutText('Normal');
  1138.  
  1139.          SetUserCharSize(1, 3, 1, 2);
  1140.          SetTextStyle(TriplexFont, Horizdir, UserCharSize);
  1141.          OutText('Klein');
  1142.  
  1143.          SetUserCharSize(3, 1, 1, 1);
  1144.          SetTextStyle(TriplexFont, Horizdir, UserCharSize);
  1145.          OutText('Breit');
  1146.  
  1147.          Readln;
  1148.          CloseGraph;
  1149.        end.
  1150.  
  1151. SetViewPort
  1152. -----------
  1153.      Da die Parametertypen der Grafikfunktionen vereinheitlicht
  1154.      wurden, haben x1, y1, x2 und y2 den Typ Integer. Die korrekte
  1155.      Definition von SetViewPort ist:
  1156.  
  1157.        procedure SetViewPort(x1, y1, x2, y2 : Integer; Clip : Boolean);
  1158.