В Турбо Паскале имеется возможность включения графического драйвера и штриховых шрифтов непосредственно в тело программы. Такое включение делает программу независимой от местоположения и наличия на диске драйверов и шрифтов, а также ускоряет подготовку графических программ к работе (шрифты и драйвер загружаются вместе с программой).
Включение драйвера и шрифтов осуществляется по следующей общей схеме. Сначала с помощью вспомогательной программы BINOBJ.EXE, входящей в комплект поставки Турбо Паскаля, драйвер и шрифты преобразуются в OBJ-файл (файл с расширением .OBJ). Для этого вне среды Турбо Паскаля необходимо вызвать утилиту BINOBJ с тремя параметрами: именем преобразуемого файла, именем получаемого OBJ-файла и глобальным именем процедуры. Эти имена в принципе могут быть произвольными, правильными для MS-DOS именами. Например:
c:tpbinobj cga.bgi cga cgadrv.
В результате такого обращения из каталога ТР на диске С будет вызвана программа BINOBJ и ей будут переданы следующие параметры:
CGA.BGI – имя файла с преобразуемым драйвером;
CGA – имя файла с расширением .OBJ, т.е. CGA.OBJ, который будет получен в результате исполнения программы BINOBJ;
CGADRV – глобальное имя, под которым этот драйвер будет известен программе.
После этого можно написать следующий фрагмент программы:
Uses Graph;
Procedure CGADRV; external;
{$L CGA.OBJ}
var
d, r, e : Integer;
begin
if RegisterBGIDriver (@CGADRV) < 0 then
begin
WriteLn ('Ошибка при регистрации драйвера');
halt
end;
d := CGA; r := CGAHi;
InitGraph (d, r, '');
.......
Как видно из этого примера, в программе объявляется внешняя процедура с именем CGADRV (глобальное имя, указанное при обращении к BINOBJ), причем дается директива компилятору отыскать в текущем каталоге и загрузить файл CGA.OBJ, в котором находится эта процедура. Затем осуществляется регистрация драйвера путем обращения к функции RegisterBGIDriver. Единственным параметром этой функции является адрес начала драйвера в памяти (@CGADRV). Функция возвращает значение типа Integer, которое служит для контроля правильности завершения процедуры регистрации драйвера: если это значение меньше нуля, обнаружена ошибка, в противном случае функция возвращает номер зарегистрированного драйвера. В примере контролируется правильность регистрации драйвера и, если ошибка не обнаружена, инициируется графический режим работы экрана.
Аналогичным образом можно присоединить к программе стандартные штриховые шрифты (матричный шрифт 8x8 входит в состав модуля Graph, и поэтому присоединять его не надо). Присоединение шрифта строится по описанной схеме за тем исключением, что для его регистрации вызывается функция RegisterBGIFont. Например, после преобразования
c:Pascalbinobj litt.chr litt litt
можно использовать операторы
Procedure Litt;External;
{$L Litt.obj}
.......
if RegisterBGIFont (@litt) < 0 then ...
Обратите внимание: регистрация и драйвера, и шрифтов должна предшествовать инициации графического режима.
Регистрировать можно также драйверы (шрифты), которые не компилируются вместе с программой, а загружаются в динамическую память. Например:
Uses Graph;
var
р: Pointer;
f: file;
begin
Assign(f,'Litt.chr'); {Открываем файл}
Reset(f,1); {LITT.CHR для чтения}
GetMem(p,FileSize(f)) ; {Резервируем для него область кучи нужного размера}
BlockRead(f,p^,FileSize(f)){Читаем файл}
WriteLn(RegisterBGIFont (p)){Регистрируем шрифт}
end.
Контрольные вопросы:
1. Назначение библиотеки GRAPH
2. Назначение и использование процедуры InitGraph.
3. Назначение и использование функции GraphResult.
4. Назначение и использование функции GraphErrorMsg.
5. Назначение и использование процедуры CloseGraph.
6. Назначение и использование функций GetMaxX и GetMaxY.
7. Назначение и использование процедуры SetViewPort.
8. Назначение и использование процедуры MoveTo.
9. Назначение и использование процедуры ClearDevice.
10. Назначение и использование процедуры ClearViewPort.
11. Назначение и использование процедуры PutPixel.
12. Назначение и использование процедуры Line.
13. Назначение и использование процедуры LineTo.
14. Назначение и использование процедуры SetLineStyle.
15. Назначение и использование процедуры Rectangle.
16. Назначение и использование процедуры DrawPoly.
17. Назначение и использование процедуры Circle.
18. Назначение и использование процедуры SetColor.
19. Назначение и использование процедуры SetBkColor.
20. Назначение и использование функции GetBkColor.
21. Назначение и использование процедуры SetFillStyle.
22. Назначение и использование процедуры SetFillPattern.
23. Назначение и использование процедуры FloodFill.
24. Назначение и использование процедуры Bar.
25. Назначение и использование процедуры Ваr3D.
26. Назначение и использование процедуры FillPoly.
27. Назначение и использование процедуры OutText.
28. Назначение и использование процедуры OutTextXY.
29. Назначение и использование процедуры SetTextStyle.
30. Назначение и использование функции TextWidth.
31. Назначение и использование функции TextHeight.