Процедуры и функции

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

Procedure InitGraph(var Driver,Mode: Integer; Path: String);

Здесь Driver - переменная типа Integer, определяет тип графического драйвера; Mode - переменная того же типа, задающая режим работы графического адаптера; Path - выражение типа String, содержащее имя файла драйвера и, возможно, маршрут его поиска.

К моменту вызова процедуры на одном из дисковых носителей информации должен находиться файл, содержащий нужный графический драйвер. Процедура загружает этот драйвер в оперативную память и переводит адаптер в графический режим работы. Тип драйвера должен соответствовать типу графического адаптера. Для указания типа драйвера в модуле предопределены следующие константы:

const

Detect=0;{Режим автоопределения типа}

CGA=1;

MCGA=2;

EGA=3;

EGA64=4;

EGAMono=5;

IBM8514=6;

HercMono=7;

ATT400=8;

VGA=9;

PC3270=10;

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

const

   

{ Адаптер CGA : }

   

CGACO = 0;

{Низкое разрешение, палитра

0}

CGAC1 = 1;

{Низкое разрешение, палитра

1}

CGAC2 = 2;

{Низкое разрешение, палитра

2}

CGAC3 = 3;

{Низкое разрешение, палитра

3}

CGAHi = 4;

{Высокое разрешение}

 

{Адаптер MCGA:}

   

MCGACO = 0;

{Эмуляция CGACO}

 

MCGAC1 = 1;

{Эмуляция CGAC1}

 

MCGAC2 = 2;

{Эмуляция CGAC2}

 

MCGAC3 = 3;

{Эмуляция CGAC3}

 

MCGAMed = 4;

{Эмуляция CGAHi}

 

MCGAHi = 5;

{640x480}

 

{Адаптер EGA :}

   

EGALo = 0;

{640x200, 16 цветов}

 

EGAHi = 1;

{640x350, 16 цветов}

 

EGAMonoHi = 3;

{640x350, 2 цвета}

 

{Адаптеры HGC и

HGC+:}

 

HercMonoHi = 0;

{720x348}

 

{АдаптерАТТ400:}

 

ATT400CO = 0;

{Аналог режима CGACO}

 

ATT400C1 = 1;

(Аналог режима CGAC1}

 

ATT400C2 = 2;

{Аналог режима CGAC2}

 

ATT400C3 = 3;

{Аналог режима CGAC3}

 

ATT400Med = 4;

{Аналог режима CGAHi}

 

ATT400H1 = 5;

{640x400, 2 цвета}

 

{Адаптер VGA:}

VGALo = 0;            {640x200}

VGAMed = 1;           {640x350}

VGAHi = 2;            {640x480}

PC3270H1 = 0;         {Аналог HercMonoHi}

{Адаптер 1ВМ8514}

IBM8514LO =0;      {640x480, 256 цветов}

IBM8514H1 = 1;     {1024x768, 256 цветов}

Пусть, например, драйвер CGA.BGI находится в каталоге TP\BGI на диске С и устанавливается режим работы 320x200 с палитрой 2. Тогда обращение к процедуре будет таким:

Uses Graph; 

var

Driver, Mode : Integer; 

begin

Driver := CGA;{Драйвер}

Mode := CGAC2;{Режим работы}

InitGraph(Driver, Mode,' С:\TP\BGI') ;

.......

Если тип адаптера ПК неизвестен или если программа рассчитана на работу с любым адаптером, используется обращение к процедуре с требованием автоматического определения типа драйвера:

Driver := Detect;

InitGraph(Driver, Mode, 'C:\TP\BGI');

После такого обращения устанавливается графический режим работы экрана, а при выходе из процедуры переменные Driver и Mode содержат целочисленные значения, определяющие тип драйвера и режим его работы. При этом для адаптеров, способных работать в нескольких режимах, выбирается старший режим, т.е. тот, что закодирован максимальной цифрой. Так, при работе с CGA -адаптером обращение к процедуре со значением Driver = Detect вернет в переменной Driver значение 1 (CGA) и в Mode -значение 4 (CGAHi), а такое же обращение к адаптеру VGA вернет Driver = 9 (VGA) и Mode = 2 (VGAHi).

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

const

grOk = 0;{Нет ошибок} 

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

grNotDetected =-2;{Не определен тип драйвера} 

grFileNotFind =-3;{Не найден графический драйвер} 

grlnvalidDriver =-4;{Неправильный тип драйвера}

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

grNoScanMem = - 6;{Нет памяти для просмотра областей}

grNoFloodMem =- 7;{Нет памяти для закраски областей}

grFontNotFound = -8;{Не найден файл со шрифтом}

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

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

grError =-11;{Общая ошибка}

grIOError =-12;{Ошибка ввода-вывода}

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

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

После обращения к функции GraphResult признак ошибки сбрасывается, поэтому повторное обращение к ней вернет ноль.

Функция GraphErrorMsg.

Возвращает значение типа String, в котором по указанному коду ошибки дается соответствующее текстовое сообщение. Заголовок функции:

Function GraphErrorMsg(Code: Integer): String;

Здесь Code - код ошибки, возвращаемый функцией GraphResult.

Например, типичная последовательность операторов для инициации графического режима с автоматическим определением типа драйвера и установкой максимального разрешения имеет следующий вид:

var

Driver, Mode, Error:Integer; 

begin

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

InitGraph(Driver, Mode,' ');{Инициируем графику}

Error := GraphResult;{Получаем результат}

if Error <> grOk then{Проверяем ошибку} 

begin{Ошибка в процедуре инициации}

WriteLn(GraphErrorMsg(Error));{Выводим сообщение}

.......

end 

else{Нет ошибки}

.......

Чаще всего причиной возникновения ошибки при обращении к процедуре InitGraph является неправильное указание местоположения файла с драйвером графического адаптера (например, файла CGA.BGI для адаптера CGA). Настройка на местоположение драйвера осуществляется заданием маршрута поиска нужного файла в имени драйвера при вызове процедуры InitGraph. Если, например, драйвер зарегистрирован в подкаталоге DRIVERS каталога PASCAL на диске D, то нужно использовать вызов:

InitGraph(Driver, Mode, 'd:\Pascal\Drivers');

Замечание. Во всех следующих примерах процедура InitGraph вызывается с параметром Driver в виде пустой строки. Такая форма обращения будет корректна только в том случае, когда нужный файл графического драйвера находится в текущем каталоге. Для упрощения повторения примеров скопируйте файл, соответствующий адаптеру Вашего ПК, в текущий каталог.

Процедура CloseGraph.

Завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы экрана. Заголовок:

Procedure CloseGraph;

Процедура RestoreCRTMode.

Служит для кратковременного возврата в текстовый режим. В отличие от процедуры CloseGraph не сбрасываются установленные параметры графического режима и не освобождается память, выделенная для размещения графического драйвера. Заголовок:

Procedure RestoreCRTMode;

Функция GetGraphMode.

Возвращает значение типа Integer, в котором содержится код установленного режима работы графического адаптера. Заголовок:

Function GetGraphMode: Integer;

Процедура SetGraphMode.

Устанавливает новый графический режим работы адаптера. Заголовок:

Procedure SetGraphMode(Mode: Integer);

Здесь Mode - код устанавливаемого режима.

Следующая программа иллюстрирует переход из графического режима в текстовый и обратно:

Uses Graph;

var .

Driver, Mode, Error : Integer; 

begin

{Инициируем графический режим}

Driver := Detect;

InitGraph(Driver, Mode, '');

Error := GraphResult; {Запоминаем результат}

i£ Error <> grOk then {Проверяем ошибку}

WriteLn(GraphErrorMsg(Error)) {Есть ошибка} 

else 

begin {Нет ошибки}

WriteLn ('Это графический режим'); 

WriteLn ('Нажмите "Enter"...':20); 

ReadLn;

{Переходим в текстовый режим} 

RestoreCRTMode;

WriteLn (' А это текстовый...'); 

ReadLn;

{Возвращаемся в графический режим} 

SetGraphMode (GetGraphMode); 

WriteLn ('Опять графический режим...'); 

ReadLn; 

CloseGraph 

end 

end.

В этом примере для вывода сообщений как в графическом, так и в текстовом режиме используется стандартная процедура WriteLn. Если Ваш ПК оснащен нерусифицированным адаптером CGA, вывод кириллицы в графическом режиме таким способом невозможен, в этом случае замените соответствующие сообщения так, чтобы использовать только латинские буквы.

Процедура DetectGraph.

Возвращает тип драйвера и режим его работы. Заголовок: 

Procedure DetectGraph(var Driver,Mode: Integer);

Здесь Driver - тип драйвера; Mode - режим работы.

В отличие от функции GetGraphMode описываемая процедура возвращает в переменной Mode максимально возможный для данного адаптера номер графического режима.

Функция GetDriverName.

Возвращает значение типа String, содержащее имя загруженного графического драйвера. Заголовок:

Function GetDriverName: String;

Функция GetMaxMode.

Возвращает значение типа Integer, содержащее количество возможных режимов работы адаптера. Заголовок:

Function GetMaxMode: Integer;

Функция GetModeName.

Возвращает значение типа String, содержащее разрешение экрана и имя режима работы адаптера по его номеру. Заголовок:

Function GetModName(ModNumber: Integer): String;

Здесь ModNumber - номер режима.

Следующая программа после инициации графического режима выводит на экран строку, содержащую имя загруженного драйвера, а также все возможные режимы его работы.

Uses Graph; 

var

a,b: Integer; 

begin

a := Detect;

InitGraph(a, b, '');

WriteLn(GetDriverName);

for a := 0 to GetMaxMode do 

WriteLn(GetModeName(a):10);

ReadLn;

CloseGraph 

end.

Процедура GetModeRange.

Возвращает диапазон возможных режимов работы заданного графического адаптера. Заголовок:

Procedure GetModeRange(Drv: Integer; var Min, Max: Integer);

Здесь Drv - тип адаптера; Min - переменная типа Integer, в которой возвращается нижнее возможное значение номера режима; Мах - переменная того же типа, верхнее значение номера.

Если задано неправильное значение параметра Drv, процедура вернет в обеих переменных значение -1. Перед обращением к процедуре можно не устанавливать графический режим работы экрана. Следующая программа выводит на экран названия всех адаптеров и диапазоны возможных номеров режимов их работы.

Uses Graph; 

var

D,L,H: Integer; 

const

N: array [1..11] of String [8] =

('CGA ', 'MCGA ', 'EGA ', 

'EGA64 ', 'EGAMono ', ЧВМ8514 ', 

'HercMono', 'ATT400 ', 'VGA ', 

'PC3270 ', 'Ошибка '); 

begin

WriteLn('Адаптер Мин. Макс.'); 

for D := 1 to 11 do 

begin

GetModeRange(D, L, H); 

WriteLn(N[D], L:7, H:10) 

end 

end.