Формирование движущихся изображений

Модуль Graph предоставляет некоторые ресурсы для создания движущихся изображений.

1. Процедура GetImage(xl,yl,x2,y2:word;var p:pointer) - сохраняет в памяти прямоугольный фрагмент изображения. Параметры xl,yl,x2,y2 определяют прямоугольник. Параметр р должен содержать адрес буфера в памяти, куда копируется изображение. Размер этого буфера определяется с помощью специальной функции ImageSize.

2. Функция ImageSize(xl,yl,x2,y2:word): word - возвращает размер буфера, необходимого для сохранения прямоугольного фрагмента изображения.

3. Процедура PutImage(x,y:word; var p:pointer; bitblt:word ) - выводит сохраненное изображение на экран в прямоугольную область с координатами верхнего левого угла (х, у). Параметр р должен содержать адрес буфера. Способ наложения bitblt определяется специальными константами:

NormalPuf=0; {наложение со стиранием}

XorPut=l;{побитное «исключающее или»}

OrPut=2;{побитное «или»}

AndPut=3;{побитное «и»}

NotPut=4;{побитное «не»}

Так, если цвет точки был розовым (12 = 11002) и на нее накладывается точка того же цвета (12 = 11002), то при разных способах наложения и стандартной палитре мы получим:

NormalPut - 1100 - точка розового цвета;

XorPut - 0000 - точка черного цвета (цвета фона);

OrPut - 1100 - точка розового цвета;

AndPut - 1100 - точка розового цвета;

NotPut - 0011 - точка голубого цвета.

Буфер под образ обычно размещается в динамической памяти.

Например:

Size:= ImageSize(0,0,99,99);

GetMem(p,Size); {выделяем память под буфер для сохранения изображения}

х:=0;

у:=0;

Pieslice(50,50,0,360,47); {рисуем закрашенный круг}

Getlmage(0,0,99,99,p^); {сохраняем изображение в памяти}

repeat

Putlmage(x,y,p^,0); {выводим изображение на экран,

стирание выполняется чистым краем образа}

delay(100); {задержка}

х:=х+3;

y:=y+1;

until x>getmaxx-50; {выход по достижении конца экрана}

FreeMem(p, Size); {освобождаем динамический буфер}


Лекция 20.Создание модулей (2 часа)

Создание модулей

Все ресурсы модуля делятся на две группы: внешние - предназначенные для использования другими программными единицами, и внутренние — рабочие ресурсы данного модуля.

Структура модуля выглядит следующим образом:

Unit <имя модуля>;

Interface

<Интерфейсная секция>

Implementation

<секция реализации>

Begin

<секция инициализации>

End.

Структура модулей

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

Unit Global;

то исходный текст соответствующего модуля должен размещаться в дисковом файле GLOBAL.PAS. Имя модуля служит для его связи с другими модулями и основной программой. Эта связь устанавливается специальным предложением

USES <сп.модулей>

Здесь USES - зарезервированное слово {используетъ};

<сп.модулей> - список модулей, с которыми устанавливается связь; элементами списка являются имена модулей, отделяемые друг от друга запятыми, например:

Uses CRT, Graph, Global;

Если объявление USES... используется, оно должно открывать раздел описаний основной программы. Модули могут использовать другие модули. Предложение USES в модулях может следовать либо сразу за зарезервированным словом INTERFACE, либо сразу за словом IMPLEMENTATION, либо, наконец, и там, и там (т.е. допускаются два предложения USES).

Интерфейсная часть

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

Интерфейсная часть открывается зарезервированным словом INTERFACE. В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и/или другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, например:

Unit Cmplx;

Interface

tуре

complex = record

re, im : real

end;

Procedure AddC (x, у : complex; var z : complex);

Procedure MulC (x, у : complex; var z : complex);

Если теперь в основной программе написать предложение

Uses Cmplx;

то в программе станут доступными тип COMPLEX и две процедуры - AddC и MulC из модуля Cmplx.

Отметим, что объявление подпрограмм в интерфейсной части автоматически сопровождается их компиляцией с использованием дальней модели памяти. Таким образом обеспечивается доступ к подпрограммам из основной программы и других модулей. Следует учесть, что все константы и переменные, объявленные в интерфейсной части модуля, равно как и глобальные константы и переменные основной программы, помещаются компилятором Турбо Паскаля в общий сегмент данных (максимальная длина сегмента 65536 байт). Порядок появления различных разделов объявлений и их количество может быть произвольным. Если в интерфейсной части объявляются внешние подпрограммы или подпрограммы в машинных кодах, их тела (т.е. зарезервированное слово EXTERNAL, в первом случае, и машинные коды вместе со словом INLINE - во втором) должны следовать сразу за их заголовками в исполняемой части модуля (не в интерфейсной!). В интерфейсной части модулей нельзя использовать опережающее описание.

Исполняемая часть

Секция реализации содержит описание подпрограмм, объявленных в интерфейсной секции, и описание внутренних ресурсов модуля (локальных переменных, типов, подпрограмм). Обращение к этим ресурсам возможно только из подпрограмм, описанных в том же модуле.

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

Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, в котором можно опускать список формальных переменных (и тип результата для функции), так как они уже описаны в интерфейсной части. Но если заголовок подпрограммы приводится в полном виде, т.е. со списком формальных параметров и объявлением результата, он должен совпадать с заголовком, объявленным в интерфейсной части, например:

Unit Cmplx;

Interface

type

complex = record

re, im : real

end;

Procedure AddC (x, у : complex; var z : complex);

Implementation

Procedure AddC;

begin

z.re := x.re +Y.re;

z.im := x.im +y.im

end;

end.

Локальные переменные и константы, а также все программные коды, порожденные при компиляции модуля, помещаются в общий сегмент памяти.

Инициирующая часть

Секция инициализации содержит операторы, которые выполняют некоторые действия, необходимые для нормальной работы процедур модуля (например, открывают файлы, инициализируют некоторые переменные и т.п.). Операторы секции инициализации выполняются один раз (при подключении модуля) до начала выполнения основной программы. Эта секция в модуле может отсутствовать.

Инициирующая часть завершает модуль. Она может отсутствовать вместе с начинающим ее словом BEGIN или быть пустой - тогда за BEGIN сразу следует признак конца модуля (слово END и следующая за ним точка).

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

 

Unit FileText;

Interface

Procedure Print(s : string);

Implementation

var

f: text; const

name = 'output.txt';

Procedure Print;

begin

WriteLn(f, s)

end;

{ Начало инициирующей части: }

begin

assign(f, name);

rewrite(f);

{ Конец инициирующей части }

end.

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








Дата добавления: 2015-12-01; просмотров: 728;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.015 сек.