Приостановка выполнения программы Turbo Pascal

При обработке информации часто возникает необходимость приостановить выполнение программы:

1) на время, определяемое самим пользователем (последующий запуск программы осуществляется либо нажатием какой-либо клавиши, либо с помощью кнопки манипулятора мышь (пример использования ма-нипулятора мышь для указанных целей дан в разделе 5.9.5 — программа DemoMouseText);

2) на фиксированное время, заданное в самой программе.

В следующих разделах приводится несколько стандартных процедур, решающих данные задачи.

1. Приостановка выполнения программы на время, определяемое пользователем

Простейшим решением данной задачи является запись в соответствующем месте процедуры Readln (оператор Read использовать нельзя) или функции ReadKey.

Пример использования процедуры Readln.

PROGRAM DemoReadln;
USES Crt;
BEGIN
ClrScr;
Writeln ('Выполнение программы приостановлено.');
Writeln;
Write ('Для продолжения нажмите клавишу Enter ....');
Readln;
Writeln;
Write ('Выполнение программы продолжается. Ждите 5 секунд. ');
Delay (5000);
END.

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

Пример использования функции ReadKey.

PROGRAM DemoReadKey;
USES Crt;
VAR
ch : char;
BEGIN
ClrScr;
Writeln ('Выполнение программы приостановлено.');
Writeln;
Write ('Для продолжения нажмите любую клавишу ....');
ch := ReadKey;
Writeln;
Write ('Выполнение программы продолжается. Ждите 5 секунд. ');
Delay (5000);
END.

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

В связи с этим предпочтительнее использовать приведенные ниже процедуры Wait, GoingOut или GoingOutColor и Wait_l. Здесь и далее в первой строке комментария дано имя процедуры (например, Wait), а во второй - имя файла этой процедуры на диске (например, wait.inc).

{ Wait
Процедура ожидания нажатия любой клавиши
wait.inc }
PROCEDURE Wait;
BEGIN
repeat until KeyPressed
END ;

Пример использования процедуры Wait.

PROGRAM DemoWait;
USES Crt;
{$I wait.inc }
BEGIN
ClrScr;
GotoXY (15, 10);
Write ('Для завершения программы нажмите клавишу "Пробел"'); Wait;
END.

При использовании процедуры Wait подсказка о требуемых дальнейших действиях пользователя записывается в программе перед вызовом процедуры.

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

{
Процедура выхода после нажатия любой клавиши.
Внимание! Не забывайте очищать буфер клавиатуры после выполнения этой процедуры,
иначе при нажатии клавиши Enter при окончании работы откомпилированной программы
она снова запустится на выполнение
Text - текст сообщения
ColorText - цвет текста
X, Y - координаты вывода сообщения
}
PROCEDURE GoingOut (Text : string;
ColorText, X, Y : integer);
BEGIN
TextColor (ColorText);
GotoXY (X, Y);
Write (Text);
repeat until KeyPressed; { ожидаем нажатия клавиши }
END;

Пример использования процедуры GoingOut.

PROGRAM Demo_GoingOut;
USES Crt;
{$I goingout.inc }
BEGIN
ClrScr;
GotoXY (15, 10);
GoingOut('Нажмите клавишу "Пробел"',14,15,10);
END.

Недостатком процедур Wait и GoingOut является то, что при нажатии на клавишу Enter откомпилированная программа вновь запустится на выполнение. Чтобы проверить это, откомпилируйте программу DemoWait или DemoGoingOut в режиме Options/Destination Disk и запустите откомпилированную программу, для завершения работы программы вместо клавиши Пробел нажмите клавишу Enter). В связи с этой особенностью при использовании данных процедур желательно указывать, что необходимо нажать клавишу Пробел.

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

{ ClrKeyBuf
Очистка буфера клавиатуры
clrkeybu.inc }
PROCEDURE ClrKeyBuf;
VAR
ch : Char;
BEGIN
while KeyPressed do ch := ReadKey;
END;

Процедура Wait_l останавливает выполнение программ и очищает буфер при входе и при выходе из процедуры (данная процедура объединяет процедуры Wait и ClrKeyBuf.

{ Wait_1
Процедура ожидает нажатия любой клавиши,
буфер клавиатуры очищается при входе
в процедуру и при выходе из процедуры
wait_l .inc }
PROCEDURE Wait_l (Text : string; { текст сообщения >
X, { координаты вывода }
Y : byte); { сообщения }
VAR
ch : Char;
BEGIN
while KeyPressed do ch := ReadKey; { очистка буфера клавиатуры }
GotoXY (X,Y);
Write (Text) ; { вывод сообщения }
repeat until KeyPressed; { ожидание нажатия любой клавиши }
while KeyPressed do ch := ReadKey; { очистка буфера клавиатуры }
END;

Пример использования процедуры Wait_1.

PROGRAM Demo_Wait_l ;
USES Crt;
{$I wait_l.inc }
BEGIN
ClrScr;
GotoXY (15, 10) ;
Wait_l ('Нажмите любую клавишу' , 15, 10) ;
END.

Процедуре GoingOutColor аналогична процедуре Wait_l, но позволяет изменять цвет символов и цвет фона, на котором выводится сообщение.

{ GoingOutColor
Процедура выхода после нажатия любой клавиши.
Выводится подсказка о дальнейших действиях пользователя.
Устанавливаются цвета фона и символов.
Text - текст сообщения
ColorText - цвет символов
ColorBackGround - цвет фона
X, Y - координаты вывода сообщения
goingouc.inc }
PROCEDURE GoingOutColor (Text : string;
ColorText,
ColorBackGround : byte;
X,
Y : integer);
VAR ch : Char;
BEGIN
while KeyPressed do ch := ReadKey;
TextColor (ColorText);
TextBackGround (ColorBackGround);
GotoXY (X,Y); Write (Text);
repeat until KeyPressed;
while KeyPressed do ch := ReadKey;
END;

Пример использования процедуры GoingOutColor.

PROGRAM Demo__GoingOutColor ;
USES Crt;
{$I goingouc.inc }
BEGIN
ClrScr;
GotoXY (15, 10) ;
GoingOutColor (' Нажмите любую клавишу ', 0, 3, 27, 10);
END.

2. Приостановка выполнения программы на заданный отрезок времени

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

{ WaitDos
Процедура приостановки выполнения программы на заданный отрезок
времени в секундах (от 0 до 58)
WordTime - число секунд приостановки выполнения программы
waitdos.inc }
PROCEDURE WaitDos (WaitTime : word);
VAR
House, { час - 0..23 }
Minute, { минута - 0. . 59 }
Second, { секунда - 0..59 }
Seс100, { сотые доли секунды 0..99 }
Second_0 : word;
BEGIN
GetTime (House, Minute, Second, Seс100);
if WaitTime + Second >= 59
then Second_0 := WaitTime + Second - 59
else Second_0 := Second + WaitTime;
repeat
GetTime (House, Minute, Second, Sec100);
until
Second = Second_0;
END;

Примечание. При замене в данной процедуре Second на часы, минуты или сотые доли секунды (House, Minute, Second или Sec100) время остановки программы будет соответственно измеряться в этих временных интервалах.

Пример использования процедуры WaitDos. Для работы процедуры waitdos.inc необходимо с помощью директивы USES подключить модуль Dos.

PROGRAM DemoWaitDos;
USES Crt, Dos;
VAR
WaitTime : word;
($I waitdos.inc }
BEGIN
ClrScr;
Writeln ('Введите число секунд (1..58) для приостановки ');
Write ('выполнения программы ');
Readln (WaitTime);
Write ('Ждите ', WaitTime, ' секунд(у,ы) ....');
WaitDos (WaitTime);
END.

 

Вывод строки с центрированием и изменением яркости символов

http://www.tp7.info/Vyvod_stroki_s_centrirovaniem.php

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

{--------------------------	 Colorstr	----------------------------	
Процедура вывода строки сообщения с центрированием. Строка выводится
трижды на одно и то же место. При этом ее цвет измеяется и вывод
строки сопровождается звуковыми сигналами. В данной процедуре вывод
осуществляется на экран с черным фоном. Символы выводятся белым
цветом разной насыщенности. Для установки других цвето в фона и
символов необходимо внести изменения в исходный текст процедуры
------------------------- colorstr.inc ---------------------------}
PROCEDURE ColorStr (Stroka : string; Y: integer);
{ текст сообщения не должен превышать 80 символов }
( Y - строка вывода сообщения }
{$I waitdos.inc }
VAR
X : integer; { позиции начала вывода строки }
BEGIN
TextBackGround(O);
ClrScr;
TextColor (15) ; { центрируем строку }
if Length (Stroka) > 80 then begin
TextColor(15);
GotoXY (18,8);
Writeln ('Текст сообщения в строке, начинающейся с:');
GotoXY (21,10);
Write ('"',Copy (Stroka,1,30), '..."');
GotoXY (29,12) ;
Write ('превысил 80 символов !');
GotoXY (28,14);
Write ('Сократите текст.');
WaitDos (7) ;
Halt;
end;
X := (80 - Length (Stroka)) div 2;
TextColor (13);
GotoXY(X,Y);
Writeln (Stroka);
WaitDos (2) ;
TextColor (14);
GotoXY (X,Y);
Write (Stroka);
Sound (3560);
WaitDos (2);
NoSound;
TextColor(15);
GotoXY (X,Y);
Write (Stroka);
Sound (2356);
WaitDos (1);
NoSound;
END;

Пример использования процедуры ColorStr.

PROGRAM DemoColorStr; 
USES Crt, Dos;
($I colorstr.inc } { вывод строки с изменяемым цветом }
{$I waitdos.inc }
BEGIN
ClrScr;
ColorStr ('ФИРМА ИНФОРМАТИК', 10);
TextColor (11);
GotoXY (1, 23);
Write ('Выход - Enter');
Readln;
END.

Центрирование строки текста в программах Turbo Pascal

http://www.tp7.info/centrirovanie_stroki_teksta.php

Процедура Middle выводит на экран строку текста, центрируя ее. Длина выводимой строки не должна превышать 80 символов. Для удобства работы с процедурой в ней предусмотрен контроль длины выводимой строки. Если длина строки превышает 80 символов, то выдается рекоменia сколько необходимо уменьшить число символов в строке, и выполнение программы прерывается (аварийное завершение программы).

{------------------------	 Middle		------------------------	
Процедура выводит строку текста, центрируя её на строке
Stroka - вводимая строка
Y - координата Y
------------------------ middle.inc ------------------------}
PROCEDURE Middle (Stroka : string; Y : integer);
{$I waitdos.inc }
VAR
X : integer;
BEGIN
if Length (Stroka) > 80 then begin
GotoXY (18,8) ;
Writeln ('Текст сообщения в строке, начинающийся с: ');
GotoXY (21,10);
Write ('"',Copy (Stroka,1,30), '..."');
GotoXY (29,12);
Write (' превысил 80 символов ! ');
GotoXY (18,14);
Write ('Уменьшите длину текста на ');
Write (Length (Stroka) - 80, ' символов(ов)');
WaitDos (6);
Halt;{аварийное завершение программы }
end;
X := (80 - Length (Stroka)) div 2;
GotoXY(X,Y);
Writeln (Stroka);
END;

Пример использования процедуры Middle.

PROGRAM DemoMiddle; 
USES Crt, Dos;
CONST
Stroka_l = 'Пример вывода строки сообщения';
Stroka_2 = 'с использованием процедуры Middle.inc';
Stroka 3 = ' Ждите 7 секунд до завершения программы ...';
{$I middle.inc }
{$I waitdos.inc }
BEGIN
ClrScr;
TextColor (11) ;
Middle (Stroka_l, 10);
Middle (Stroka_2, 12);
TextColor (4);
TextBackGround (15);
Middle (Stroka_3, 18);
WaitDos (7);
END.



Яндекс.Метрика
Бесплатный конструктор сайтовuCoz