TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Пользовательские программы управления динамически распределяемой памятью 

             Для модуля  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
        ("Справочник по библиотеке") "Справочного руководства программис-
        та".

Содержание

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz