Пользовательские программы
управления динамически распределяемой памятью
Для модуля Graph предусмотрены две программы управления ди-
намически распределяемой областью GraphFrееМем и GraphGetМем.
Первая из них освобождает память, распределенную для драйверов, а
вторая - распределяет память для драйверов графических устройств.
Стандартные программы имеют следующий вид:
procedure GraphGetMem(var P : Pointer; Size : word);
{ выделить память для драйверов графических устройств }
procedure GraphFreeMem(var P : Pointer; Size : word);
{ освободить память для драйверов графических устройств }
В модуле Graph имеются два указателя, которые по умолчанию
указывают на две описанные здесь стандартные подпрограммы. Эти
указатель определяются следующим образом:
var
GraphGetMemPtr : pointer;
{ указатель на программу распределения памяти }
GraphFreeMemPtr : pointer;
{ указатель на программу освобождения памяти }
Во время инициализации модуля Graph эти указатели ссылаются
на стандартные графические программы распределения/освобождения,
которые определяются в секции реализации модуля Graph. Память
распределятся в трех различных целях:
* для многоцелевых графических буферов, размер которых уста-
навливается вызовов SegGraphBufSize (по умолчанию это 4К);
* для драйвера устройства, загружаемого InitGraph (файлы
*.BGI);
* для файла векторного шрифта, загруженного SetTextStyle
(файлы *.CHR).
Графический буфер всегда выделяется в динамически распреде-
ляемой области памяти. Память для драйвера устройства выделяется
в динамической памяти, если программа не загружает его или не
компонуется с ним вызовом RegisterBGIdriver. При выборе векторно-
го шрифта с помощью SetTextStyle также выделяется память в дина-
мически распределяемой области (если ваша программа не компонует-
ся со шрифтом и не использует RegisterBGIfont).
Чтобы задать ваше собственное управление памятью, в модуле
Graph вы можете изменить значения этих указателей так, чтобы они
ссылались на ваши собственные программы. Программы, заданные
пользователем, должны иметь тот же список параметров, что и стан-
дартные программы, и должны иметь дальний тип вызова. Приведем
B.Pascal 7 & Objects/LR - 319 -
далее пример заданных пользователем программ распределения и ос-
вобождения памяти. Заметим, что при использовании процедуры Eхit
автоматически вызывается процедура CloseGraph.
program UserHeapManegement;
{ программа показывает, как пользователь может работать с
подпрограммами управления динамически распределяемой об-
ластью памяти, используемыми в модуле Graph }
uses
Graph;
var
GraphDriver, GraphMode : Integer;
ErrorCode : Integer; { используется для
сохранения кода возврата функции GraphResult }
PreGraphExitProc : Pointer { используется для сох-
ранения исходной процедуры выхода }
{ процедуры пользователя должны использовать дальний тип
обращения }
procedure MyGetMem(var P : Pointer; Size : word); far;
{ выделить память для драйверов графических устройств }
begin
Write('Была вызвана процедура ',
'MyGetMem, нажмите :');
GetMem(P, Size);
end; { MyGetMem }
procedure MyFreeMem(ver P : Pointer; Size : word); far;
{ освободить память, занятую драйверами графических
устройств }
begin
RestoreCRTMode;
Write('Была вызвана процедура MyFreeMem, нажмите ',
':'); Readln;
if P <> Nil Then { не освобождать пустые указатели }
begin
FreeMem(P, Size);
P := Nil;
end; { MyFreeMem }
procedure MyExitProc; far;
{ процедура всегда получает вызов при прекращении работы
программы }
begin
ExitProc := PreGraphExitProc; { восстановить исходную
процедуру выхода }
CloseGraph; { очистить динамически распределяемую
область }
end; { MyExitProc }
begin
{ инициализировать программу очистки памяти }
PreGraphExitProc := ExitProc;
ExitProc := @MyExitProc;
B.Pascal 7 & Objects/LR - 320 -
GraphGetMemPtr := @MyGetMem ; { заменить распределение
памяти }
GraphFreeMemPtr := @MyFreeMem ; { заменить освобождение
памяти }
GraphDriver := Detect;
InitGraph(GraphDriver, GraphMode, '');
ErrorCode := GraphResult;
if ErrorCode <> grOk then
begin
Writeln('Графическая ошибка: ' GraphErrorMsg(ErrorCode);
Readln;
Halt(1);
end;
Line(0, 0, GetMaxX, GetMaxY);
OutText(1, 1, 'Нажмите клавишу :');
Readln;
end. { UserHeapManegement }
Если целевой платформой является защищенный режим DOS, то
при использовании подобных программ следует иметь в виду следую-
щее: вы должны обеспечить, что любой возвращаемый GetMem указа-
тель должен иметь нулевое смещение. Сделать это можно с помощью
функции GlobalAllocPtr:
procedure MyGetMem(var P: Pointer; Size: Word); far;
var
P: Pointer;
bagin
P:= GlobalAllocPtr(HeapAllocFlags, Size);
GetMem(P, 4096);
end; { MyGetMem }
B.Pascal 7 & Objects/LR - 321 -
Процедуры модуля Graph
Таблица 19.3
┌───────────────────┬───────────────────────────────────────────┐
│ Подпрограмма │ Описание │
├───────────────────┼───────────────────────────────────────────┤
│ Arс │ Рисует дугу окружности от начального угла│
│ │ до конечного угла; точка (x,y) берется в│
│ │ качестве центра окружности. │
├───────────────────┼───────────────────────────────────────────┤
│ Bаr │ Рисует столбец, используя текущий тип зак-│
│ │ раски. │
├───────────────────┼───────────────────────────────────────────┤
│ Bаr3D │ Рисует трехмерный столбец, используя те-│
│ │ кущий тип закраски. │
├───────────────────┼───────────────────────────────────────────┤
│ Circlе │ Рисует окружность с центром в точке (x,y).│
├───────────────────┼───────────────────────────────────────────┤
│ ClearDeviсе │ Сбрасывает текущие параметры, установлен-│
│ │ ные для устройства вывода, и подготавлива-│
│ │ ет его для вывода. │
├───────────────────┼───────────────────────────────────────────┤
│ ClearViewPort │ Очищает текущую область просмотра (окно│
│ │ экрана). │
├───────────────────┼───────────────────────────────────────────┤
│ CloseGraph │ Выполняет останов графической системы. │
├───────────────────┼───────────────────────────────────────────┤
│ DetectGraph │ Распознает аппаратуру и определяет, какой│
│ │ графический драйвер и режим нужно исполь-│
│ │ зовать. │
├───────────────────┼───────────────────────────────────────────┤
│ DrawPoly │ Рисует многоугольник, используя текущий│
│ │ тип линии и цвет. │
├───────────────────┼───────────────────────────────────────────┤
│ Ellipse │ Рисует эллиптическую дугу от начального│
│ │ угла до конечного угла, использую (Х,Y),│
│ │ как точку центра. │
├───────────────────┼───────────────────────────────────────────┤
│ FillPoly │ Закрашивает многоугольник, используя пре-│
│ │ образователь развертки. │
├───────────────────┼───────────────────────────────────────────┤
│ FloodFill │ Закрашивает ограниченную область, исполь-│
│ │ зуя текущий образец закраски. │
├───────────────────┼───────────────────────────────────────────┤
│ GetArcCoords │ Позволяет пользователю запрашивать коор-│
│ │ динаты последней команды Arс. │
├───────────────────┼───────────────────────────────────────────┤
│ GetAspectRatio │ Возвращает действующее разрешение графи- │
│ │ ческого экрана, на основе которого может│
│ │ быть вычислен коэффициент относительного│
│ │ удлинения (Хаsр,Yаsр). │
├───────────────────┼───────────────────────────────────────────┤
│ GetBkСоlor │ Возвращает текущий фоновый цвет. │
├───────────────────┼───────────────────────────────────────────┤
│ GetCоlor │ Возвращает текущий цвет рисунка. │
├───────────────────┼───────────────────────────────────────────┤
│ GetDefaultPalette│ В записи типа PaletteType возвращает ис-│
│ │ пользуемую по умолчанию палитру. │
├───────────────────┼───────────────────────────────────────────┤
│ GetDriverName │ Возвращает строку, содержащую имя те-│
│ │ кущего драйвера. │
├───────────────────┼───────────────────────────────────────────┤
│ GetFillPattern │ Возвращает последний образец заполнителя,│
│ │ установленный с помощью обращения к проце-│
│ │ дуре SetFillPattern. │
├───────────────────┼───────────────────────────────────────────┤
│ GetFillSetting │ Позволяет пользователю выполнить запрос о│
│ │ текущем образце и цвете закраски, установ-│
│ │ ленными с помощью процедур SetFillStyle и│
│ │ SetFillPattern. │
├───────────────────┼───────────────────────────────────────────┤
│ GetImage │ Сохраняет двоичный образ заданной области│
│ │ в буфере. │
├───────────────────┼───────────────────────────────────────────┤
│ GetGraphMode │ Возвращает текущий графический режим. │
├───────────────────┼───────────────────────────────────────────┤
│ GetLineSettings │ Возвращает текущий тип линии, образец ли-│
│ │ нии и толщину линии, заданные процедурой│
│ │ SetLineStyle. │
├───────────────────┼───────────────────────────────────────────┤
│ GetMaxColor │ Возвращает максимальное значение цвета,│
│ │ которое можно передать процедуре SetColor.│
├───────────────────┼───────────────────────────────────────────┤
│ GetMAxMode │ Возвращает максимальный номер режима для│
│ │ текущего загруженного драйвера. │
├───────────────────┼───────────────────────────────────────────┤
│ GetМахХ │ Возвращает для текущего графического драй-│
│ │ вера и режима самую правую колонку (разре-│
│ │ шение по х). │
├───────────────────┼───────────────────────────────────────────┤
│ GetМахY │ Возвращает для текущего графического драй-│
│ │ вера и режима самую нижнюю строку (разре-│
│ │ шение по у). │
├───────────────────┼───────────────────────────────────────────┤
│ GetPaletteSize │ Возвращает размер таблицы просмотра палит-│
│ │ ры. │
├───────────────────┼───────────────────────────────────────────┤
│ GetPixel │ Возвращает значение элемента изображения в│
│ │ точке Х,Y. │
├───────────────────┼───────────────────────────────────────────┤
│ GetPalette │ Возвращает текущую палитру и ее размер. │
├───────────────────┼───────────────────────────────────────────┤
│ GetTextSettings │ Возвращает текущий текстовый шрифт, нап-│
│ │ равление, размер и выравнивание для него,│
│ │ установленные с помощью процедур│
│ │ SetTextStyle и SetTextJustify. │
├───────────────────┼───────────────────────────────────────────┤
│ GetViewSettings │ Позволяет пользователю выдать запрос о те-│
│ │ кущей области изображения и параметрах от-│
│ │ сечения изображения. │
├───────────────────┼───────────────────────────────────────────┤
│ GetХ │ Возвращает координату Х текущей позиции│
│ │ (текущего указателя). │
├───────────────────┼───────────────────────────────────────────┤
│ GetY │ Возвращает координату Y текущей позиции│
│ │ (текущего указателя). │
├───────────────────┼───────────────────────────────────────────┤
│ GraphErrorMsg │ Для заданного кода ошибки возвращает стро-│
│ │ ку сообщения об ошибке. │
├───────────────────┼───────────────────────────────────────────┤
│ GraphResult │ Возвращает код ошибки для последней гра-│
│ │ фической операции. │
├───────────────────┼───────────────────────────────────────────┤
│ InitGraph │ Инициализирует графическую систему и пе-│
│ │ реводит аппаратуру в графический режим. │
├───────────────────┼───────────────────────────────────────────┤
│ ImageSize │ Возвращает число байт, которые требуют-│
│ │ ся для сохранения прямоугольной области│
│ │ экрана. │
├───────────────────┼───────────────────────────────────────────┤
│ InstallUserDriver│ Устанавливает добавленный пользователем│
│ │ драйвер в таблице драйверов устройств BGI.│
├───────────────────┼───────────────────────────────────────────┤
│ InstallUserFont │ Устанавливает новый файл шрифта, не встро-│
│ │ енный в графическую систему. │
├───────────────────┼───────────────────────────────────────────┤
│ InitGraph │ Инициализирует графическую систему и пере-│
│ │ водит аппаратные средства в графический│
│ │ режим. │
├───────────────────┼───────────────────────────────────────────┤
│ Line │ Рисует прямую линию из точки (x1,y1) в│
│ │ (x2,y2). │
├───────────────────┼───────────────────────────────────────────┤
│ LineRel │ Рисует прямую линию до точки, представ-│
│ │ ляющей собой относительное расстояние от│
│ │ текущего указателя. │
├───────────────────┼───────────────────────────────────────────┤
│ LinеTо │ Рисует линию из текущего положения в│
│ │ точку (x,y). │
├───────────────────┼───────────────────────────────────────────┤
│ МоveRеl │ Перемещает текущий указатель на расстоя-│
│ │ ние, являющееся относительным расстоянием│
│ │ от текущей позиции. │
├───────────────────┼───────────────────────────────────────────┤
│ МоvеТо │ Перемещает текущий указатель в точку│
│ │ (x,y). │
├───────────────────┼───────────────────────────────────────────┤
│ ОutText │ Посылает строку на устройство вывода, на-│
│ │ чиная с текущего указателя. │
├───────────────────┼───────────────────────────────────────────┤
│ ОutTextХY │ Посылает строку на устройство вывода. │
├───────────────────┼───────────────────────────────────────────┤
│ PieSlice │ Рисует сектор. Точка (Х,Y) используется в│
│ │ качестве центра, а сектор рисуется от на-│
│ │ чального до конечного угла. │
├───────────────────┼───────────────────────────────────────────┤
│ РutImagе │ Выводит на экран двоичный образ. │
├───────────────────┼───────────────────────────────────────────┤
│ РutРiхеl │ Строит элемент изображения в точке x,y. │
├───────────────────┼───────────────────────────────────────────┤
│ Rесtanglе │ Рисует прямоугольник, используя текущий│
│ │ тип линии и цвет. │
├───────────────────┼───────────────────────────────────────────┤
│ RegisterBGIDriver│ Регистрирует допустимый драйвер (формата│
│ │ BGI) в графической системе. │
├───────────────────┼───────────────────────────────────────────┤
│ RegisterBGIFont │ Регистрирует в графической системе допус-│
│ │ тимый (формата BGI) шрифт. │
├───────────────────┼───────────────────────────────────────────┤
│ RеstoreCRTМоdе │ Восстанавливает исходный режим экрана,│
│ │ который был установлен при инициализации│
│ │ графики. │
├───────────────────┼───────────────────────────────────────────┤
│ SetActivePage │ Устанавливает для графического вывода ак-│
│ │ тивную страницу. │
├───────────────────┼───────────────────────────────────────────┤
│ SetAllPalette │ Изменяет все цвета палитры, как было ука-│
│ │ зано. │
├───────────────────┼───────────────────────────────────────────┤
│ SetAspectRatio │ Изменяет принятый по умолчанию коэффициент│
│ │ относительного удлинения. │
├───────────────────┼───────────────────────────────────────────┤
│ SetBkСоlor │ Используя палитру, устанавливает текущий│
│ │ фоновый цвет. │
├───────────────────┼───────────────────────────────────────────┤
│ SetColor │ Используя палитру, устанавливает текущий│
│ │ цвет рисунка. │
├───────────────────┼───────────────────────────────────────────┤
│ SetFillPattern │ Выбирает образец закраски, заданный поль-│
│ │ зователем. │
├───────────────────┼───────────────────────────────────────────┤
│ SetFillStyle │ Устанавливает образец закраски и ее цвет. │
├───────────────────┼───────────────────────────────────────────┤
│ SetGraphBufSize │ Позволяет изменить размер буфера, исполь-│
│ │ зуемого для опроса и закраски. │
├───────────────────┼───────────────────────────────────────────┤
│ SetGraphMode │ Переключает систему в графический режим│
│ │ и очищает экран. │
├───────────────────┼───────────────────────────────────────────┤
│ SetLineStyle │ Устанавливает текущий тип линии и ее ши-│
│ │ рину. │
├───────────────────┼───────────────────────────────────────────┤
│ SetPalette │ Изменяет один цвет палитры, заданный пе-│
│ │ ременными Colornum и Color. │
├───────────────────┼───────────────────────────────────────────┤
│ SetGRBPalette │ Позволяет модифицировать записи палит-│
│ │ ры для драйверов IBM 8514 и VGA. │
├───────────────────┼───────────────────────────────────────────┤
│ SetTextJustify │ С помощью ОutTеxt и ОutTехtХY уста-│
│ │ навливает значения для выравнивания текс-│
│ │ та. │
├───────────────────┼───────────────────────────────────────────┤
│ SetTextStyle │ Задает текущий текстовый шрифт, его тип и│
│ │ коэффициент размера символа. │
├───────────────────┼───────────────────────────────────────────┤
│ SetUserCharSize │ Позволяет вам для векторных шрифтов из-│
│ │ менить высоту и ширину символа. │
├───────────────────┼───────────────────────────────────────────┤
│ SetViewPort │ Для графического вывода устанавливает│
│ │ текущую область вывода или окно. │
├───────────────────┼───────────────────────────────────────────┤
│ SetVisualPage │ Задает визуальный номер графической стра-│
│ │ ницы. │
├───────────────────┼───────────────────────────────────────────┤
│ SetWriteMode │ Устанавливает режим вывода на экран (ко-│
│ │ пирование или с помощью операции XOR) для│
│ │ линий, вычерчиваемых процедурами DrawPoly,│
│ │ Line, LineRel, LineTo, Rectangle. │
├───────────────────┼───────────────────────────────────────────┤
│ TехtНеight │ Возвращает высоту страниц в элементах│
│ │ изображения. │
├───────────────────┼───────────────────────────────────────────┤
│ TехtWidth │ Возвращает ширину строки в элементах│
│ │ изображения. │
└───────────────────┴───────────────────────────────────────────┘
Подробное описание каждой процедуры и функции дано в Главе 1
("Справочник по библиотеке") "Справочного руководства программис-
та".