Модули. Разработка пользовательских модулей.

Модуль Crt .

Процедуры и функции этого модуля предназначены для:

· управления клавиатурой;

· управления текстовым экраном: формирование окон, управление положением курсора на экране, определение цвета фона и символов;

· управление звуком.

В текстовом режиме наименьшей единицей изображения является не отдельная точка (пиксель), а знакоместо. Под каждое знакоместо выделяется 2 байта. Первый байт хранит код символа, а второй - цветовой атрибут (цвет символа и цвет фона). В текстовом режиме возможны 16 цветов. Они изображаются числовыми значениями от 0 до 15 или именованными константами, обозначающими цвет. 0 – черный (black), 1 – синий (blue), 4 – красный (red), 15 – белый (white).

Текстовый режим характеризуется 2 параметрами: количеством символов в строке и количеством строк на экране. Стандартные значения: 25 строк, 80 символов в строке. Используя процедуру Textmode ( n ), можно устанавливать различные режимы, определяющие количество строк и символов в строке.

Положение текстового курсора определяется 2 координатами: X – позиция в строке и Y – номер строки. По умолчанию открытое окно имеет: черный цвет фона, количество строк и столбцов 25х80, цвет выводимых символов – белый. Координата левого верхнего угла – 1,1.

Некоторые процедуры модуля CRT:

Процедура С lrscr –очищает экран и заливает его цветом фона.

Процедура GoToXY ( x , y : byte )- устанавливает курсор в положение с координатами X , Y.

Процедура Textbackground ( color : byte ); - определяет цвет фона;

Процедура Textcolor ( c : byte );- определяет цвет выводимых символов;

Процедура Delay ( ms : word ); - задерживает выполнение программы на ms миллисекунд.

Процедура Delline – удаляет текущую строку на экране.

Процедура Window ( x 1, y 1, x 2, y 2: byte ); - открывает окно с указанными координатами. После открытия окна все операции ввода/вывода производятся в этом окне, и координата его левого верхнего угла считается 1,1 .

Процедура Sound ( h : word ) – включает звук с заданной частотой h в герцах.

Процедура Nosound – выключает звук.

Пример

На экране, закрашенном синим цветом, в маленьком желтом окне вывести текст в виде бегущей строки.

uses crt;

var

s:string ;

i:integer ;

Begin

textbackground ( blue );// закраска экрана синим цветом

clrscr ;

window (30,10,60,15); );// открывается окно заданного размера

textbackground ( yellow ); );// закраска маленького окна желтым цветом

clrscr ;

s:='скоро начнется зимняя сессия';

gotoxy (1,3);

writeln (s);

delay( 2 00);

for i:=1 to length(s) do

Begin

delete(s,1,1);

gotoxy (1,3);

write(s);

sound (3000);// числовые параметры должны подбираться в зависимости от компьютера

delay( 2 00);

nosound ;

delline ;

end;

end .

Разработка пользовательского интерфейса невозможна без использования модуля Crt . В его состав входят 2 функции для работы с буфером клавиатуры.

Функция Readkey : char ; - считывает символ с клавиатуры

Если буфер пуст, то возникает пауза до нажатия клавиши. Чтение символа не сопровождается его отображением на экране.

Функция Keypressed : Boolean – проверяет наличие символов в буфере клавиатуры и возвращает значение True, если на клавиатуре была нажата клавиша (в буфере есть символ) и False в противном случае.

C := readkey ; - переменная получает значение кода нажатой клавиши. К этой функции можно обратиться просто Readkey ; (т.е. разрешен вызов функции, как процедуры). Используется для создания паузы до нажатия клавиши.

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

Read – извлекает из буфера столько символов, сколько определено списком ввода.

Readln – делает тоже самое, но еще и очищает буфер.

Readkey - извлекает из буфера один символ, а если буфер пуст, то приостанавливается работа программы до нажатия любой клавиши.

Для очистки буфера используют конструкцию:

While keypressed do c := readkey;

При нажатии символьных клавиш и клавиш управления Esc , Tab, пробел генерируются коды от 0 до 255. При нажатии клавиш управления курсором, функциональных клавиш генерируется и посылается в буфер сразу 2 символа – символ с кодом 0 (#0) и цифровой код клавиши. Функция Readkey в этой ситуации сначала возвращает #0, а при повторном вызове вторую часть кода кода.

Модули. Разработка пользовательских модулей.

Во FP Паскале есть понятие модуля – независимо разрабатываемой, компилируемой и тестируемой программной единицы с определенным интерфейсом.

Использование модулей реализует современную технологию создания программного продукта, легко подключаемых к любой программе.

Использование модулей удобно для коллективных разработок. Каждый создает и отлаживает свою часть разработки. Использование модулей позволяет обойти это ограничение на размер памяти.

Модуль – это совокупность программных ресурсов, предназначенных для использования другими модулями и программами.

Ресурсами могут быть: const , var , типы, подпрограммы.

Модуль – это  отдельная программная единица, но сам он выполняться не может, его объекты используются другими программными единицами.

Программные ресурсы модуля могут быть разбиты на 2 части:

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

2. объекты рабочего характера, невидимые извне;

Модуль состоит из 3 частей: интерфейсной, реализации и части инициализации.

Структура модуля:

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

Interface

<описание видимых объектов (type, const, var, заголовки подпрограмм>

Implementation

< описание невидимых объектов для поддержания видимых
(свои type, var, подпрограммы) и тела тех подпрограмм, которые объявлены в видимой части >

[begin

<операторы инициализации(начальные установки)>]

End .

Заголовок модуля (Unit <имя модуля) обязателен, имя модуля должно совпадать с именем файла на диске, в котором сохранен текст модуля. Заголовки первых двух разделов обязательны, даже если они пустые. Если части инициализации нет, то begin необязателен.

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

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

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

В результате компиляции модуля будет получено 2 файла :

1. <имя>.ppu – это файл с описанием откомпилированного модуля.

2. <имя>.o – это файл, содержащий код модуля. Этот файл и является конечным продуктом компиляции.

Оба файла необходимы, если планируется использовать модуль в нескольких программах. Их нельзя удалять. Один файл бесполезен без другого.

Для того, чтобы получить доступ к объектам модуля, в программе в предложении (директиве) Uses надо указать имя модуля. Файлы модулей ищутся в текущем каталоге или в каталоге, который указан в пункте меню Options , Directories.

Подключение модуля к программе происходит на этапе компоновки программы.

Пример

Напишем модуль (назовем его service), который содержит процедуру открытия окна с определенным фоном.

Unit service;

Interface

Uses crt;

Procedure okno (x1, y1,x2,y2,c:integer);

Implementation

procedure okno(x1, y1,x2,y2,c:integer);

Begin

textcolor(black);

textbackground(blue);

clrscr;

window(x1,y1,x2,y2);

textbackground(c);

clrscr;

end;

end.

       Program main;

Uses crt, service;

var i:integer;

begin

clrscr ;

okno (2,2,70,20,yellow);

writeln ;

End .

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

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

Пример

Модуль объявления, ввода/вывода, обслуживающий модуль (меню, обработка меню, окно)

program main;

Uses crt,global, service,inout;

begin

clrscr ;

upravlenie ;

writeln ;

readln ;

End .

//модуль описания

unit global;

Interface

 type

mas=array [1..10] of integer;

var

x:mas;

nx:integer;

Implementation

End.

//Модуль ввода/вывода

unit inout ;

Interface

 uses global;

procedure inmas(var a:mas; var n:integer);

procedure outmas(a:mas;n:integer);

Implementation

procedure inmas(var a:mas; var n:integer);

var i:integer;

begin

writeln('vv.n');

readln(n);

writeln('vv. el. mas.');

for i:=1 to n do readln(a[i]);

end;

procedure outmas(a:mas;n:integer);

var i:integer;

begin

writeln('isx. mas.');

for i:=1 to n do write(a[i]:2,' ');

writeln ;

readln;

end;

End.

//обслуживающиймодуль

Unit service;

Interface

Uses crt, global, inout ;

Procedure okno(x1, y1,x2,y2,c:integer);

procedure upravlenie ;

procedure menu;

Implementation

procedure okno(x1, y1,x2,y2,c:integer);

begin

   textcolor(red);

   textbackground(blue);

   clrscr;

   window(x1,y1,x2,y2);

   textbackground(c);

   clrscr;

end;

//Процедура, которая содержит текст меню

procedure menu ;

Begin

writeln ('       Menu');

writeln(' 1.vvod massiva');

writeln(' 2.vivod massiva');

writeln(' 3.vixod');

end;

//Процедура, которая выводит на экран текст меню и вызывает нужную //процедуру, в зависимости от выбранного пункта меню.

procedure upravlenie;

 var

 n:integer;

 begin

While true do

Begin

     okno(2,2,70,20,green);

   menu;

  write ('viberi punkt menu: ');

     readln(n);

 case n of

    1: begin

          okno(10,5,60,15,green);

         inmas(x,nx);

     end;

  2: begin

       okno(10,5,60,15,yellow);

       outmas(x,nx);

     end;

  3: halt;

end;   //end case

end;     //end while

end;       //end procedure

end .        //end модуля


Дата добавления: 2019-09-02; просмотров: 87; Мы поможем в написании вашей работы!

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




Мы поможем в написании ваших работ!