home *** CD-ROM | disk | FTP | other *** search
- Dokumentation zum Zusatzprogramm BINOBJ
- ───────────────────────────────────────
-
- Mit BINOBJ lassen sich binäre Dateien in .OBJ-Dateien konvertieren,
- die ihrerseits über den Compiler-Befehl {$L} in ein Turbo
- Pascal-Programm als "Prozedur" (d.h. ins Code-Segment) aufgenommen
- werden können. Abgesehen davon, daß sich so Daten (wie z.B.
- gespeicherte Bildschirme) aufnehmen lassen, deren Codierung als
- typisierte Konstante unnötig aufwendig wäre, liegt der Hauptzweck
- von BINOBJ in der Konvertierung von Grafik-Treibern und
- Zeichensätzen. (Tatsächlich haben .BGI- und .CHR-Dateien ein
- binäres Format). Ein Programm, das seine Treiber und Zeichensätze
- direkt enthält, kommt zur Laufzeit ohne weitere Dateien aus - wir
- haben das am Beispiel GRLINK.PAS (auf der Diskette III)
- demonstriert.
-
- BINOBJ wird mit drei Parametern aufgerufen:
-
- BINOBJ <Quelldatei[.BIN]> <Zieldatei[.OBJ]> <Prozedurname>
-
- <Quelldatei> steht für den Namen der zu konvertierenden Datei,
- <Zieldatei> für die Datei, die BINOBJ erzeugen soll. <Prozedurname>
- steht für den Namen der "Prozedur", unter dem die Zieldatei mit {$L}
- in das Programm aufgenommen wird, muß also ein gültiger
- Pascal-Bezeichner sein. Wenn die Angabe für <Quelldatei> kein Suffix
- enthält, fügt BINOBJ automatisch die Endung .BIN an; analoges gilt
- für die erzeugte Datei, die in diesem Fall automatisch das Suffix
- .OBJ erhält.
-
- Das folgende Beispielprogramm liest eine Datei namens MENU.DTA und
- kopiert ihren Inhalt in den Bildspeicher (insgesamt 80 * 25 * 2 =
- 4000 Bytes). Damit das Programm so übersichtlich wie möglich bleibt,
- haben wir auf Fehlerprüfungen verzichtet:
-
- program Traditionell;
- uses Crt;
- var
- MenuP : Pointer;
- MenuF : File;
-
- procedure ShowScreen(var ScreenData : Pointer);
- { Kopiert 4000 Bytes von ScreenData^ in den Bildspeicher }
- var
- ScreenSegment : Word;
- begin
- if (Lo(LastMode) = 7) then ScreenSegment := $B000 { Mono }
- else ScreenSegment := $B800;
- Move(ScreenData^,Ptr(ScreenSegment, 0)^, 4000); { Kopieren }
- end;
-
- begin { Hauptprogramm }
- Assign(MenuF, 'MENU.DTA'); Reset(MenuF, 1); { Öffnen der Datei }
- GetMem(MenuP, 4000); { Puffer auf dem Heap }
- BlockRead(MenuF, MenuP^, 4000); { Lesen der Datei }
- Close(MenuF);
- ShowScreen(MenuP); { und Kopieren }
- end.
-
- Hier werden die Daten auf "traditionelle" Weise von der Diskette
- gelesen - MENU.DTA muß also zur Laufzeit des Programms verfügbar
- sein.
-
- Alternativ dazu lassen sich die in MENU.DTA enthaltenen Daten mit
- den folgenden Schritten direkt in das Programm aufnehmen:
-
- 1. Konvertierung von MENU.DTA in eine .OBJ-Datei:
-
- binobj MENU.DTA MENUDTA MenuData
-
- Dieser Aufruf von BINOBJ liest die Datei MENU.DTA, erzeugt die Datei
- MENUDTA.OBJ (das Suffix .OBJ wird automatisch angehängt) und gibt
- den Daten den "Prozedurnamen" MenuData.
-
- 2. Das Programm wird um eine external-Deklaration und den
- entsprechenden Compiler-Befehl {$L} erweitert:
-
- program Daten_direkt;
- uses Crt;
- { <- Die Datei-Deklaration wird nicht mehr gebraucht }
-
- procedure ShowScreen(var ScreenData : Pointer); { unverändert }
- { Kopiert 4000 Bytes von ScreenData^ in den Bildspeicher }
- var
- ScreenSegment : Word;
- begin
- if (Lo(LastMode) = 7) then ScreenSegment := $B000 { Mono }
- else ScreenSegment := $B800;
- Move(ScreenData^,Ptr(ScreenSegment, 0)^, 4000); { Kopieren }
- end;
-
- procedure MenuData; external; { "Prozedur" MenuData, als external
- deklariert }
- {$L MENUDTA.OBJ} { Compiler-Befehl zur Aufnahme von
- MENUDTA.OBJ - in dieser Datei sind
- die Daten als "Prozedur MenuData"
- enthalten }
-
- begin
- ShowScreen(@MenuData); { Aufruf von ShowScreen mit
- der Adresse von MenuData }
- end.
-
- ACHTUNG: Hier wird die *Adresse* der "Prozedur" übergeben, d.h. die
- Adresse der als MenuData gespeicherten Daten.
-
- Die Vorteile dieses Verfahrens liegen auf der Hand: Erstens kommt
- das Programm ohne zusätzliche Dateien aus, zweitens entfallen die
- entsprechenden Diskettenzugriffe - und drittens können wir die Daten
- über einen normalen Pascal-Bezeichner ansprechen.
- Die Nachteile: Da die gespeicherten Daten Teil des Programms sind,
- wächst sein Umfang entsprechend - außerdem müssen Sie die Datei
- MENU.DTA nach jeder Veränderung erneut mit BINOBJ in eine .OBJ-Datei
- konvertieren.
-
- BINOBJ ist also hauptsächlich dann sinnvoll, wenn die einzubindenden
- Daten "stabil" sind, d.h. aller Voraussicht nach nicht allzuoft
- verändert werden müssen.
- Das Programm GRLINK.PAS (auf der Diskette III) zeigt eine derartige
- Anwendung: Es bindet alle verfügbaren Grafiktreiber und Zeichensätze
- in ein Programm ein, das danach ohne zusätzliche .BGI- und
- .CHR-Dateien auf jedem Computer lauffähig ist, den GRAPH
- unterstützt.
-
- Eine Beschreibung der Schritte zur Erstellung von GRLINK.EXE finden
- Sie in GRLINK.PAS, eine ausführliche Erläuterung der neuen Funk-
- tionen RegisterBGIFont und RegisterBGIDriver in der Datei GRAPH.DOC.
-