| GetCBreak(b); { запоминание статуса BREAK }
| SetCBreak( False ); { отключение проверки ^Break }
| OldAttr := TextAttr; { запоминание последнего цвета }
| WX := WhereX; { запоминание позиции курсора }
| WY := WhereY;
| TextAttr := 7; { неяркий цвет }
| if (Mem[0:$410] and $30) = $30 { начало экрана: }
| then ScrAddr := $B000 { моно – режим }
| else ScrAddr := $B800; { цветной режим }
| Move(Mem[ScrAddr:0],buffer,8000); { экран -> в буфер }
| FillChar(Mem[ScrAddr:0], 8000, 0); { затемнение экрана }
| repeat {цикл опроса пароля }
| ClrScr; { гашение экрана }
| repeat until KeyPressed; { ждать до нажатия }
| while KeyPressed do с := ReadKey;{ сброс нажатия }
| Write( #10'Пароль возврата? ' ); { Ввод пароля, но }
| TextAttr := 0; ReadLn(PS); TextAttr := 7; { вслепую! }
| until PS=Password; { Пароль введен ? }
| Move(buffer, Mem[ScrAddr:0],8000); { буфер-> на экран }
| GotoXY( WX, WY ); { курсор на место }
| TextAttr := OldAttr; { снова старый цвет }
| SetCBreak(b); { восстановление статуса BREAK }
| END;
| {$F-}
Рис. 16.18
- 386 -
| { Запускающая часть программы }
| BEGIN
| CheckBreak := False;
| Write(#10#13'Программа закрытия экрана'#10#13
| Запуск');
| Write(#10' HIDESCR [пароль возврата]'#10#10#13);
| WriteLn( 'Для включения нажмите PrintScreen'#10#13 );
| Password := ParamStr(1); {пароль из командной строки }
| SetIntVec($00,SaveInt00); {Необходимые операции подго- }
| SetIntVec($1B,SaveInt1B); {товки резидентной работы }
| SetIntVec($05,@MyInt05H); {подстановка прерывания 05 }
| Кеер(0); { <-- То, ради чего построен пример! }
| END.
Рис. 16.18 (окончание)
- 387 -
Глава 17. Модуль Printer
Среди прочих модулей в библиотеке языка содержится модуль Printer. Назначение этого модуля – устанавливать связь программ с печатающим устройством (как правило, принтером). В этой главе рассматривается содержимое этого модуля и приводятся некоторые, надеемся, полезные приемы работы с принтерами.
17.1. Содержимое модуля Printer
Этот модуль содержит всего одну переменную и две строки исполняемого текста. Он устанавливает соответствие между переменной Lst и системным устройством LPT1 (первым параллельным портом). Полный текст модуля приведен на рис. 17.1.
| UNIT Printer;
| INTERFACE
| VAR
| Lst : Text;
| IMPLEMENTATION
| BEGIN
| Assign (Lsr, ‘LPT1’);
| ReWrite (Lst)
| END.
Рис. 17.1
После подключения модуля Print операторы Write(Lst,…) и WriteLn(Lst,…) будут выводить данные непосредственно на принтер.
Поначалу этот модуль может показаться лишним, так как его вполне можно «растворить» в основной программе. Однако, если программа строится из модулей, многие из которых выводят данные на печать, наличие общей для всех них переменной Lst, связанной с принтером, весьма удобно.
Если принтер подключен через какое-нибудь другое устройство, например через второй порт LPT2 или через последовательный порт COM1, то можно создать свой собственный модуль Printer2 по аналогии с рис. 17.1, заменив LPT1 на другое имя и оттранслировав его.
17.2. Низкоуровневые средства работы с принтером
Вывод данных или специальных командных кодов на принтер через связанный с ним файл Lst или ему подобный — не единственный способ управлять печатью. Существует и другой путь посылки символа или их последовательности в принтер — через прерывание БСВВ 17H. Кроме того, используя это прерывание, можно опрашивать состояние устройства печати.
Прерывание 17H обеспечивает доступ к трем функциям обслуживания принтера:
— печати символа на принтере (функция номер 0);
— инициализации порта принтера (функция номер 1);