При инициализации графического режима функция контролирующая ошибки инициализации

Инициализация графического режима

Все объекты, которые
входят в модуль Graph, можно использовать
только после задания, инициализации
графического режима.

Инициализация
графического режима выполняется
процедурой InitGraph:

InitGraph
(<
драйвер>:integer;
<
режим>:integer;<путь
к
файлу>:string);.

Для
инициализации графического режима с
автоматическим распознаванием драйвера
и режима, достаточно присвоить переменной,
отвечающей за драйвер, константу Detect
или 0.
Присваивать какое-либо значение
переменной режима в этом случае не
требуется. Третий параметр указывает
путь к файлу (например, EGAVGA)
с расширением bgi.
Если этот файл находится в текущем
каталоге, то путь может быть пустым
(‘’).

Ошибки,
которые могут возникнуть при инициализации
графического режима, анализируют с
помощью функции GraphResult.
Эта функция генерирует соответствующий
код ошибки. Код ошибки равен нулю, если
инициализация прошла успешно.

Для
выхода из графического режима используется
стандартная процедура без параметров
CloseGraph.
Она восстанавливает режим, существовавший
до инициализации графики.

Пример
1.
При
частой работе с графикой процесс
инициализации удобно оформить отдельной
процедурой.

Uses
Graph;

Var
Driver, Mode:integer;

Procedure
GrInit;

Begin

Driver:=Detect;
{ автораспознавание драйвера }

InitGraph
(Driver, Mode, ‘’);

If
GraphResult<>0
then

begin

Writeln
(‘Ошибка инициализации!’);

Writeln
(‘Работа программы прервана’);

Halt
(1) { остановить выполнение программы с
кодом завершения – 1 }

End

End;

Begin

GrInit;
{ графические
действия
}

Readln;

CloseGraph

End.

Управление экраном и окнами

В
графическом режиме поддерживается
концепция окон. Окно
представляет собой прямоугольную
область экрана со своей относительной
системой координат. По умолчанию окно
занимает весь экран, значения координат
его левого верхнего и правого нижнего
угла устанавливаются автоматически
процедурой инициализации (например
(0,0) и (640,480)).

Чтобы
стереть все изображение на экране, т.е.
очистить его, используется процедура
без параметров ClearDevice
или процедура GraphDefaults,
которая не только очищает экран, но и
выполняет все стартовые установки
графических параметров.

Процедура
SеtViewPort
(
X1,Y1,X2,Y2:integer;
Clip:boolean);
служит для организации окон. Здесь X1,Y1
– координаты левого верхнего угла,
X2,Y2
– координаты правого нижнего угла.
Параметр Clip
определяет, будут ли фрагменты изображения
отсекаться при попадании за пределы
окна (Clip=True
или Clip=ClipOn)
или нет (Clip=False
или Clip=ClipOff).
После создания окна началом координат
станет верхний левый угол окна, который
будет иметь координаты (0,0).

Процедура
ClearViewPort;
используется для очистки окна. Текущее
окно при этом заполняется фоновым
цветом, а текущий указатель устанавливается
в точку с координатами (0,0). Напомним,
что это координаты во внутренней системе
координат, связанной с данным окном, а
не в системе координат полного экрана.
Перейти к системе координат полного
экрана можно с помощью процедуры
ClearDevice,
или задав в процедуре установки окна
максимально возможные значения:
SetViewPort(0,0,GetMaxX,
GetMaxY,
True);.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

ПРОВЕРКА РЕЗУЛЬТАТА ИНИЦИАЛИЗАЦИИ ГРАФИЧЕСКОГО РЕЖИМА

Для
проверки успешности инициализации графического режима существует функция GraphResult , которая имеет тип
результата integer , в котором закодирован результат последнего обращения к
графическим процедурам. Если ошибка не обнаружена, значением функции будет 0, в
противном случае – отрицательное число, имеющее следующий смысл:

·       
GrOk
=0; {нет ошибок} 

·       
GrInitGraph
=-1{не инициирован графический режим}

·       
GrNotDetect
=-2 {не определен тип драйвера} 

·       
GrFileNotFind
=-3 {не найден графический драйвер} 

·       
GrInvalidDriver
=-4 {неправильный тип драйвера} 

·       
GrNoLoadMem
=-5 {нет памяти для размещения драйвера} 

·       
GrNoScanMem
=-6 {нет памяти для просмотра областей}

·       
GrNoFloodMem
=-7 {нет памяти для закраски областей} 

·       
GrFontNotFound
=-8 {не найден файл со шрифтом} 

·       
GrNoFontMem
=-9 {нет памяти для размещения шрифта} 

·       
GrInvalidMode
=-10 {неправильный графический режим} 

·       
GrError
=-11 {общая ошибка} 

·       
GrIOError
=-12 {ошибка ввода-вывода} 

·       
GrInvalidFont
=-13 {неправильный формат шрифта}

·       
GrInvalidFontNum
=-14 {неправильный номер шрифта}


Инициализирует графическую систему и переводит видеокарту в графический режим.

Объявление

 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 файл с диска. Как вариант такой динамической схемы загрузки, вы можете встроить файл драйвера (или несколько файлов) непосредственно в исполняемый файл вашей програмы.

Это можно сделать так:

  1. Преобразуйте  *.BGI  файл  в  *.OBJ  файл (используя  утилиты  BINOBJ  или  BGIOBJ)
  2. В тексте  программы  поместите  обращение к функции 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

Пример


 { Пример программы для процедуры InitGraph }

uses Graph;

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.

  • При инициализации авторизации сети steam произошла ошибка unturned
  • При импорте сос внутренняя ошибка библиотеки
  • При импорте произошла ошибка яндекс браузер
  • При импорте кода игровых настроек возникла ошибка овервотч
  • При измерении тока 50а допущена ошибка 2 определить абсолютную погрешность измерения