Язык:
Русский
English
InitGraph (процедура) (модуль Graph)
Инициализирует графическую систему и переводит видеокарту в графический режим.
Объявление
Procedure InitGraph (Var GraphDriver : Integer; Var GraphMode : Integer;
PathToDriver : String);
Режим
Real, Protected
Замечания
Если значение параметра GraphDriver равно Detect (0), то производится обращение к любым определяемым пользователем подпрограммам автоматического определения, а затем вызывается функция DetectGraph. Если графическое аппаратное обеспечение обнаружено, то инициализируется соответствующий графический драйвер и включается графический режим.
Если значение GraphDriver не равно нулю (Detect), то в качестве номера драйвера принимается значение параметра GraphDriver. Видеосистема переходит в режим, определенный параметром GraphMode. Если вы отменяете автоопределение, то вы должны задать допустимый номер видеорежима для выбранного драйвера. Стандартные режимы устарели, среди них наибольший интерес представляют режимы 640х480х16 (VGAHi) (именно этот режим обычно определяется автоматически, так как ничего лучше модулю Graph не известно) и 640x350x16 (VGAMed) драйвера VGA (EGAVGA.BGI). Чаще всего достаточно 640х480х16, а необходимость использовать 640x350x16 вызвана тем, что в этом режиме видеопамяти хватает на две видеостраницы (см. SetActivePage, SetVisualPage), а в 640х480х16 — только на одну.
SVGA режимы
Для режимов с большим количеством цветов и разрешением экрана в School Pak были добавлены SVGA драйвера. Так как драйвера нестандартные, для их использования нужно делать регистрацию (RegisterBGIDriver) и предоставлять константы видеорежимов, и в старых версиях School Pak (0.9, 1.0) именно такой подход и применялся (модуль SVGA.PAS): из документации к SVGA BGI драйверам были выписаны все их видеорежимы, сделаны константами, а в секции инициализации SVGA.PAS регистрировались сразу все драйвера, и получались тоже как бы константы. Недостатками такого подхода было:
- В модуле Graph очень мало места для дополнительных драйверов, и все слоты получались забитыми
- Программы, использующие SVGA.PAS, знают про SVGA драйверы, которые указаны в SVGA.PAS, но нет способа уже скомпилированную программу заставить работать в каком–нибудь ещё режиме, который не был известен на момент написания SVGA.PAS
Поэтому в последних версиях School Pak предпочтительным считается другой модуль, ScpGraph, а инициализация графики делается InitScpGraph вместо InitGraph. InitScpGraph в качестве аргументов требует не драйвер и режим, а разрешение и количество цветов, читает текстовый файл, в котором указаны известные видеорежимы и BGI–драйвер, их реализующий, и только после этого регистрирует драйвер и инициализирует графический режим. При таком подходе, даже если программа уже скомпилирована, можно в текстовый файл добавить режимы гипотетического будущего DOSBOX.BGI, и программа начнёт их понимать. (Есть непроверенное мнение, что S3.BGI реализует поддерживаемое DOSBox ускорение некоторых примитивов.)
Другие замечания
Параметр PathToDriver определяет путь к каталога, где находится нужный графический драйвер. Если строка PathToDriver равна пустой строке, то поиск файла драйвера производится в текущем каталоге. В School Pak драйвера находятся в виртуальной директории 'X:\BP', однако, указывать её необязательно.
Обычно InitGraph загружает графический драйвер, рапределяя память для него через обращение к GraphGetMemPtr, а затем загружает соответствующий *.BGI файл с диска. Как вариант такой динамической схемы загрузки, вы можете встроить файл драйвера (или несколько файлов) непосредственно в исполняемый файл вашей програмы.
Это можно сделать так:
- Преобразуйте *.BGI файл в *.OBJ файл (используя утилиты BINOBJ или BGIOBJ)
- В тексте программы поместите обращение к функции RegisterBGIDriver перед вызовом InitGraph для того, чтобы зарегистрировать графический драйвер.
Когда вы формируете вашу программу, вы должны скомпоновать при помощи $L с ней *.OBJ файлы для зарегистрированных драйверов. Вы можете также загрузить BGI драйвер в кучу, а затем зарегистрировать его вызвав функцию RegisterBGIDriver.
Если в куче была распределена память для графического драйвера с использованием процедуры GraphGetMemPtr, то при вызове процедуры CloseGraph она будет освобождена.
После вызова InitGraph, значение переменной GraphDriver устанавливается к значению текущего графического драйвера, а значение GraphMode устанавливается к значению текущего графического режима.
Если происходит ошибка, то в переменной GraphDriver и в функции GraphResult будет возвращена одна из следующих grXXXX констант: grNotDetected, grFileNotFound, grInvalidDriver, grNoLoadMem или grInvalidMode.
Ошибка Borland
Если к файлу BGI–драйвера нет доступа на запись, инициализировать графику не удаётся. Во времена DOS к большинству файлов был доступ на запись, и эту ошибку было легко пропустить. Ситуацию усугубляет реализация Reset, используемая InitGraph, которая в неизменённом Borland Pascal открывает файл на чтение, ну а на всякий случай ещё и на запись, вдруг понадобится, и это «удобство» плохо документировано. Редко, где в лекциях про типизированные и нетипизированные файлы можно прочитать про переменную FileMode, а она довольно важна. Вот и программисты Borland ошиблись и не поставили режим только–чтение при реализации InitGraph, хотя никакой записи в BGI–драйвер не предполагается. Эта мина замедленного действия ждала своего часа и сработала в современных OS. Если в Windows 9x было нормальным иметь доступ на запись ко всей файловой системе, а ситуации, где это невозможно (CD-ROM, сетевые диски), не так часто случались, и можно было скопировать на диск программу, чтобы она заработала, то в следующих поколениях OS был взят курс на ограничение доступа к файлам там, где этот доступ не нужен. В Windows NT/2000/XP был ограничен доступ всем, кроме групп Опытных пользователей и Администраторов, а в Windows Vista/Seven даже у Администраторов программы ограничены в правах, если не запускать их в специальном режиме. По этой причине в School Pak значение FileMode по умолчанию 0 (только–чтение), а не 2 (чтение/запись), в отличие от неизменённого Borland Pascal и всех совместимых с ним компиляторов. Если у вас возникает такая проблема, измените значение FileMode на 0 перед тем, как вызывать InitGraph или используйте School Pak.
См. также
- InitScpGraph — для SVGA режимов
- Графические драйверы
- Графические режимы для каждого драйвера
- CloseGraph
- DetectGraph
- GraphResult
- RestoreCrtMode
- SetGraphBufSize
- SetGraphMode
Пример
Язык:
Русский
English
{ Пример программы для процедуры InitGraph }
var
grDriver : Integer;
grMode : Integer;
ErrCode : Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode, 'X:\BP');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
{ Графика }
Line(0, 0, GetMaxX, GetMaxY);
ReadLn;
CloseGraph;
end
else
WriteLn('Ошибка инициализации графики:', GraphErrorMsg(ErrCode));
end.