home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
turbo4
/
binobj.doc
< prev
next >
Wrap
Text File
|
1987-12-08
|
5KB
|
127 lines
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.