«Программирование в среде Turbo Pascal»
Экзаменационный проект по информатике на тему: «Программирование в среде Turbo Pascal»
Основные понятия История Pascal
Структура программы Блок-схемы
Заголовок Константы Переменные Модули Crt Graph System Printer
Процедуры Delay NoSound Sound TextBackground TextColor Window KeyPressed ReadKey Процедуры Arc Bar Circle ClearDevice CloseGraph Ellipse FloodFill GetImage InitGraph Line LineTo MoveTo OutText OutTextXY PutImage PutPixel SetBkColor SetColor SetFillPattern SetFillStyle SetLineStyle SetTextStyle Функции GetBkColor GetColor GetPixel |
ReadKeyfunction ReadKey: Char;Считывает символ с клавиатуры и освобождает буфер клавиатуры от считываемого символа.
Designed by Alexander Krasilnikov, Copyright © 2003 |
Процедуры Append Assign BlockRead BlockWrite Break Close Delete Erase Exit Flush Halt Insert MkDir Randomize Read (текстовые файлы) Read (типизированные файлы) ReadLn Rename Reset Rewrite RmDir Seek Str Truncate Val Write (текстовые файлы) Write (типизированные файлы) WriteLn Функции Abs ArcTan Concat Copy Cos Frac Ln Ord Pos Random Round Sin Sqr Sqrt Trunc UpCase
Типы данных Таблица цветов Специальные символы Выполнение арифметических действий
| Хостинг от uCoz |
Использование клавиатуры в игровых программах | Мир ПК
Простейшие процедуры работы с клавиатурой в языке Borland Pascal находятся в модуле crt, однако они не очень подходят для игровых программ. Эти процедуры ориентированы на консольный ввод, или, другими словами, на функционирование клавиатуры в режиме пишущей машинки, когда представляет интерес только нажатие на клавишу, а не ее отпускание. Впрочем, в автоматической пишущей машинке реализован автоповтор: при длительном удерживании клавиши генерируется последовательность одинаковых символов, а при отпускании это прекращается. Однако знаки печатаются неравномерно по времени: после первого следует примерно полусекундный интервал, а затем частота повторения возрастает более чем на порядок. Значит, если подобным образом управлять движением персонажа, то он сначала сделает один маленький шажок, на миг замрет и лишь затем продолжит движение. Понятно, что для динамических игр такая неравномерность движения неприемлема. Поэтому давайте разберемся, как работает клавиатура ПК. Прикладные программы обращаются к ней не напрямую, а через драйвер, аналогично взаимодействию с мышью. Но поскольку последние бывают различных типов, то и протоколы обмена с ними также многообразны, что не позволяет действовать в обход драйвера. Аппаратный же интерфейс клавиатуры всегда одинаков, и когда стандартный драйвер не устраивает, то всегда можно написать собственный и не задумываться о совместимости. Драйвер состоит из двух взаимно независимых частей, т. е. они никогда не вызывают друг друга и работают асинхронно. Между собой эти части взаимодействуют только через буфер, где хранятся числа, соответствующие нескольким последним нажатым клавишам.
Первая часть — вызываемый нажатием клавиши обработчик аппаратного прерывания клавиатуры, который выясняет ее номер, находит соответствующий номер ASCII-символа и помещает их оба (номера) в буфер. Именно этот обработчик прерывания отслеживает кодовую страницу при переключении раскладок клавиатуры и реагирует на клавиши-модификаторы , и . Вторая часть помогает проверить содержание буфера и из него извлечь (если, конечно, там что-либо находится) номера символа и клавиши. Именно с этой частью и работают процедуры KeyPressed и ReadKey.
Обработчик прерывания отслеживает, как правило, лишь нажатия на клавиши и игнорирует их отпускания. Однако есть и исключения, — если бы не контролировались отпускания клавиш-модификаторов, то они просто не выполняли бы свои функции. Информация о состоянии клавиш , и имеется как раз в нужном нам виде: в области данных BIOS существуют поля, отдельные биты которых описывают клавиши-модификаторы: нажатой соответствует «1», отпущенной — «0». Значит, в любой момент можно узнать, нажата клавиша или отпущена. Эта область занимает два байта по адресам 0040:0017h и 0040:0018h, но, к сожалению, так можно определить лишь состояние клавиш-модификаторов, а информация о наиболее интересных в нашем случае курсорных «стрелках» и «пробеле» отсутствует. Поэтому пойдем другим путем — напишем собственный драйвер клавиатуры, удовлетворяющий всем нашим требованиям.
Вы уже, наверное, догадались, что клавиатура сообщает своему обработчику и о нажатии, и об отпускании клавиш, иначе не работали бы клавиши-модификаторы. При нажатии на клавишу контроллер клавиатуры сообщает ее номер, а при отпускании — этот же номер, но с установленным старшим битом, т. е. увеличенный на 128. Давайте поступим так: заведем массив логических (boolean) переменных, где каждая ячейка будет соответствовать определенной клавише и хранить информацию о том, нажата она или отпущена. Обработчик прерывания просто запишет в нужную ячейку значение TRUE, когда клавиша нажата, и FALSE — когда отпущена. Вторая часть драйвера, обеспечивающая взаимодействие с прикладной программой, при этом не понадобится — достаточно будет непосредственно проверять содержимое нужных ячеек массива.
Написать обработчик клавиатурного прерывания — задача более сложная, чем может показаться на первый взгляд. Дело в том, что первая клавиатура IBM PC содержала лишь 83 клавиши, у IBM PC AT имелось на одну больше, а сейчас стандартом стала 101-клавишная расширенная клавиатура. Правда, зачастую к ней добавляют еще несколько клавиш, играющих определенную роль в Windows. Кроме того, и разнообразные эргономичные клавиатуры, предназначенные для ноутбуков, нередко довольно сильно отличаются от стандарта, а ведь с точки зрения и прикладных программ, и драйверов клавиатуры они должны быть идентичны. Поэтому при нумерации клавиш получилась довольно запутанная система. Так, прямые аналоги клавиш IBM PC шифруются единственным кодом, а остальные — последовательностью кодов. Одни клавиши, например , выдают такую последовательность кодов, какую должен был набрать пользователь IBM PC XT, нажимая несколько клавиш, другие предваряются управляющим кодом $E0. Зачастую оба эти подхода сочетаются.
В нашу задачу не входит написание драйвера, «различающего» все клавиши расширенной клавиатуры (хотя это вполне реально), для нас главное — чтобы он обеспечивал необходимый минимум функций. Так, мы не будем стремиться к тому, чтобы различались клавиши управления курсором в «курсорном» блоке и на цифровой клавиатуре, а позаботимся лишь о возможности различать правые и левые и , так как их расположение (и размер) делает их удобными для использования в играх. Чтобы облегчить работу с таблицей клавиш (булевым массивом), припишем правым и особые (нестандартные) коды и поместим последние в свободной области.
«Сердце» модуля (см. листинг) — обработчик аппаратного прерывания клавиатуры NewInt. Он вызывается нажатием на клавишу, читает из порта ее номер, сообщает контроллеру, что байт принят, анализирует этот байт и вносит изменения в таблицу Key, содержащую признаки нажатия для всех клавиш (даже с определенным запасом) и вынесенную в интерфейсную часть модуля. По завершении всех действий обработчик сообщает контроллеру прерываний, что работа закончена. Если контроллер должен передать обработчику последовательность байтов, то для каждого из них происходит аппаратное прерывание, и потому обработчик должен запоминать переданные ему управляющие коды с помощью переменной E0pressed. Таким образом отслеживаются нажатия на правые и . Если потребуется различать нажатия клавиш «курсорного» и цифрового блоков, то это делается так же, поскольку коды клавиш «курсорного» блока предваряются управляющим кодом $E0. Размер массива Key выбирается таким, чтобы не требовалось дополнительных проверок драйвера и чтобы никакие нестандартные или вновь введенные коды клавиш не могли испортить ячеек памяти за его пределами.
Описанный обработчик прерывания не вызывает старый, и потому нет опасности переполнения клавиатурного буфера, а также не работают никакие стандартные функции, будь то текстовый ввод, обращение к функциям ReadKey и KeyPressed или прерывание отлаживаемой программы. Более того, если вы работаете в среде DOS, а не в DOS-сессии Windows (система Windows обработает «сообщения» клавиатуры еще до того, как передаст их в DOS-сессию), то даже можете безбоязненно нажимать + + — перезагрузки не произойдет.
Если же вам нужно ввести строку или символ стандартными средствами, то вместо собственного обработчика подключите стандартный с помощью процедуры SetStandardInt. После ввода с применением процедуры SetMyInt снова замените обработчик на собственный. Ни в коем случае не следует пользоваться стандартными процедурами и функциями консольного ввода при переопределенном обработчике прерываний — это верный способ «подвесить» ПК. Ведь стандартные функции пытаются прочесть символ из буфера, а там ничего появиться не может, так как стандартный обработчик отключен.
Новый обработчик подключается в блоке инициализации модуля, а отключается — в процедуре MyExit, вызываемой при любом завершении программы, в том числе и аварийном. Программа должна восстанавливать все перехваченные вектора прерываний даже в том случае, когда закрывается по ошибке, поэтому обычным вызовом SetStandardInt из основной программы здесь не обойтись — иначе система может зависнуть.
При восстановлении стандартного обработчика предусмотрено обнуление всех флагов в области переменных BIOS, соответствующих клавишам-модификаторам. Если этого не сделать, то могут появиться трудно обнаруживаемые ошибки, например, если запустить программу из среды Borland Pascal нажатием +, то по завершении работы клавиатура может начать «странно» функционировать — так, как будто вы нажали и удерживаете клавишу . Это происходит потому, что переопределение обработчика произошло раньше, чем вы отпустили , и старый обработчик «запомнил» именно такое состояние.
Окончание в следующем номере.
Язык программирования — Turbo Pascal — Доступ к процедурам и функциям
Лекция d’une touche | |
---|---|
Турбо Паскаль 3+ | Крт |
Синтаксис
Функция ReadKey :Char; |
Описание
Эта функция позволяет проводить лекцию по прикосновению к клавиру.
Ремарки
Примеры
Номер типового примера использования этой функции:
Сотрудник эссе !- Программа ReadKeySamples;
-
- Использует Crt;
-
- НАЧАЛО
- WriteLn («Нажмите еще раз для продолжения...»);
- ReadKey ;
- КОНЕЦ .
на obtiendra le rsultat suivant :
Presse une touche pour continuer…Я посещаю ensuite qu’on presse n’importe quel touche.
L’example suivant une est une petite application navigation dans un fichier ASCII en utilisant les touches spciales PgUp et PgDn :
- Программа VIEWASC;
-
Использует Crt;-
- Вар
- Finish:Boolean;
- FileView: Файл ;
- ByteReaded:Word;
- I,CurrLinePos:Integer;
- ИмяФайла: Строка ;
- Буфер: Массив [0. .2048] из байт;
- LastPos,CurrPos,LenBuf:LongInt;
-
- Функция PadRight(S: String ;Пробел:Byte): String ;
- Вар
- I:байт;
- Начало
- Если Длина (S)<Пробел Тогда Для I:= Длина (S)+1 до Пробел do S:=S+' ';
- PadRight:=S;
- Конец ;
-
- Функция GetLastPagePos( Var F: Файл ):LongInt;
- Вар
- CurrLinePos:Integer;
- LastPos,CurrPos,LenBuf:LongInt;
- ByteReaded:Word;
- Начало
- CurrPos:= Размер файла (Просмотр файлов);
- FillChar (Буфер, SizeOf (Буфер), 0);
- ЛенБуф:=2048;
- CurrLinePos:=0;
- LastPos:=CurrPos-LenBuf;
- Если LastPos<0 Тогда Начало
- LenBuf:=2048+LastPos;
- LastPos:=0;
- Конец ;
- Поиск (fileView,LastPos);
- BlockRead (FileView, Buffer, LenBuf, ByteReaded);
- Для I:=ByteReaded-1 до 0 до Начало
- Case Buffer[I] из
- 13: Начало
- Inc (CurrLinePos);
- Если CurrLinePos>=22 Тогда Начало
- Перерыв ;
- Конец ;
- Конец ;
- 10:;
- Конец ;
- Конец ;
- GetLastPagePos:=LastPos+I+1;
- Конец ;
-
- Процедура ViewFrameASCII;
- Константа
- FunctionKeyValue: Массив [0. .9] из Строка [7]=(
- '','','','','','','','','','Сортир'
- );
- Вар
- I:байт;
- Pour:Byte;
- Начало
- Если FileSize (FileView)=0 Тогда Pour:=0
- Else Pour:= Trunc ((CurrPos / FileSize (FileView))*100);
- GotoXY (1,1);
- TextBackground (голубой);
- TextColor (черный);
- Запись (ИмяФайла);
- ClrEol ;
- GotoXY ( Lo (WindMax)-3,1);
- Запись (Заливка:3,'%');
- Для I:=0 до 8 до Начало
- GotoXY (I*7+1+2,25);
- Запись (PadRight(FunctionKeyValue[I],6));
- Конец ;
- GotoXY (67,25);
- Запись (FunctionKeyValue[9]);
- ClrEol ;
- TextBackground (черный);
- TextColor (светло-серый);
- Для I:=0 до 9 до Начало
- GotoXY (I*7+1,25);
- Запись ('F',I+1);
- Конец ;
- Конец ;
-
- Функция ViewASCII:Integer;
- Вар
- Pour,X,I,J:Byte;
- PosInBuffer:Word;
- Начало
- Если FileSize (FileView)=0 Тогда Pour:=0
- Else Pour:= Trunc ((CurrPos / FileSize (FileView))*100);
- Если Залить>=99 Тогда Залить:=100;
- GotoXY ( Lo (WindMax)-3,1);
- TextBackground (голубой);
- TextColor (черный);
- Запись (Заливка:3,'%');
- TextBackground (черный);
- TextColor (светло-серый);
- GotoXY (1,2);
- Х:=1;
- Дж:=0;
- PosInBuffer:=0;
- Пока (J<23) и (PosInBuffer<2048) до Начало
- Случай (Буфер[PosInBuffer]) из
- 13: Начало
- ClrEol ;
- WriteLn ;
- X:=1;
- Inc (J);
- Если Buffer[PosInBuffer+1]=10 Тогда Inc (PosInBuffer);
- Если J=23 Тогда Перерыв ;
- Конец ;
- 0. .12,14..31: Начало
- Запись (' ');
- Inc (X);
- Конец ;
- Еще Начало
- Inc (X);
- Запись ( Chr (Buffer[PosInBuffer]));
- Конец ;
- Конец ;
- Если X=80 Тогда Начало
- Х:=1;
- Inc (J);
- Если J=23 Тогда Перерыв ;
-
Конец ; - Inc (PosInBuffer);
- Конец ;
- Если J<23 Тогда Начало
- Окно (1,1+J,80,22);
- ClrScr ;
- Окно (1,1,80,25);
- Конец ;
- ViewASCII:=PosInBuffer;
- Конец ;
-
- НАЧАЛО
- Если ParamStr(1)='/?' Затем Начало
- WriteLn ('VIEWASC - Эта команда разрешает визуализацию в формате ASCII');
- WriteLn ;
- WriteLn ('Синтаксис: имя VIEWASC');
- Конец
- Еще
- Начало
- FileName:=ParamStr(1);
- Назначить (FileView,FileName);
- Сброс (FileView,1);
- CurrPos:=0;
- ClrScr ;
- ViewFrameASCII;
- Finish:=False;
- Повторить
- FillChar (Буфер, SizeOf (Буфер), 0);
- Поиск (fileView,CurrPos);
- BlockRead (FileView,Buffer,2048,ByteReaded);
- ByteReaded:=ViewASCII;
- Дело ReadKey Из
- #0: Дело ReadKey из
- #1:Finish:=True;
- #68:Готово:=Истина; { F10 }
- #71:CurrPos:=0; { Прикоснись к дому }
- #73: Начало {PageUp}
- FillChar (Буфер, SizeOf (Буфер), 0);
- LenBuf:=2048;
- CurrLinePos:=0;
- LastPos:=CurrPos-LenBuf;
- If LastPos<0 Then Начало
- LenBuf:=2048+LastPos;
- LastPos:=0;
- Конец ;
- Поиск (fileView,LastPos);
- BlockRead (FileView,Buffer,LenBuf,ByteReaded);
- Для I:=ByteReaded-1 до 0 до Начало
- Case Buffer[I] из
- 13: Начало
- Inc (CurrLinePos);
- Если CurrLinePos>=24 Тогда Начало
- Перерыв ;
- Конец ;
- Конец ;
- 10:;
- Конец ;
- Конец ;
- CurrPos:=LastPos+I;
- Если I>1 Тогда Inc (CurrPos);
- Конец ;
- #79:CurrPos:=GetLastPagePos(FileView); { Прикоснуться к концу }
- #81: Начало {PageDown}
- If CurrPos+ByteReaded<= FileSize (FileView) Then Inc (CurrPos, ByteReaded);
- Конец ;
- Конец ;
- #27:Готово:=Истина;
- Конец ;
- До Готово;
- Закрыть (FileView);
- ClrScr ;
- Конец ;
- КОНЕЦ .
на получение результатов проверки формы:
Источник кода
Залог | Язык программирования | Проект |
---|---|---|
https://github.com/gladir/corail/blob/master/VIEWASC.PAS | Свободный Паскаль | Коралл |
Франция
Aide-mmoire de Turbo Pascal, версии 3 6, Edition Marabout, De Groote, Virga, 1992, ISBN: 2-501-01833-8, стр. 342.
Последняя минута дня: Dimanche, le 25 января 2015 г.
Pascal представляет состав ключевых сотрудников по случаю выпуска своей 7-й Газели Борсена Рой Андерсен (старший инженер по исследованиям и разработкам), Йеспер Линд Хансен (технический директор/соучредитель), Даниэль Грёнбек Йоргенсен (специалист по качеству), Кеннет Тамбьерг Альбертсен (руководитель проекта), Ларс Фенгер (генеральный директор/соучредитель), Николай Пихл (основной специалист Человек), Расмус Пфорр-Вайс (инженер по исследованиям и разработкам), Владан Живанович (специалист по закупкам)
По случаю присуждения ведущей ежедневной деловой газетой Дании награды Børsen Gazelle в седьмой раз подряд компания Pascal пригласила избранную группу из девяти ключевых сотрудников принять эту награду в знак признания центральной роли своих сотрудников. за 10 лет непрерывного и исключительного роста компания получила седьмую награду.
Награда «Газель» присуждается компании, которая последовательно удваивала свой оборот или валовую прибыль в течение четырех лет. Таким образом, седьмая награда присуждается за достижение Паскалем одного или обоих этих показателей последовательно в течение четырех лет подряд в течение последних 10 лет. В прошлом году Бёрсен открыл дополнительный элитный статус «Марафон-Газель» для компаний, номинированных на четыре «Газели» подряд; категория, до которой сразу был возведен Паскаль.
Генеральный директор и соучредитель Ларс Розенквист Фенгер заявляет: «По случаю выпуска седьмой Газели Børsen мы отмечаем десятилетие непрерывной блестящей работы нашей компании, став ведущим мировым поставщиком электроники усилителей для профессионального аудио. промышленность.
«Мы пригласили группу из девяти ключевых сотрудников принять награду от имени всех нас в знак признания их дополнительного личного вклада в наш непрерывный рост в эти годы.