Разное

Что значит readkey в паскале: Функция ReadKey.

Прямое использование таблиц динамических методов TPW.

Непосредственное использование таблиц динамических методов TPW. OWL, объектно-ориентированная библиотека Windows, поставляемая с Turbo Pascal. для Windows использует новые динамические методы TPW в интересном способ: вы можете установить обработчик сообщений Windows, просто определив динамический метод. Чтобы установить обработчик сообщений wm_Paint , для например, вы просто даете своему объекту приложения виртуальный wm_Paint метод.

Когда оконная функция получает сообщение, она может сказать, есть ли у вас определил метод для его обработки. Если у вас есть обработчик для этого конкретное сообщение, функция Windows вызовет его. Если вы этого не сделаете, это передаст сообщение универсальному обработчику сообщений объекта.

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

case .

Но если вы предпочитаете писать свой собственный интерфейс Windows, а не использовать OWL, и вы хотели бы использовать динамические методы так же, как это делает OWL, вы сталкиваетесь с небольшая проблема: TPW не предоставляет никакого способа вызвать метод по его динамический индекс. Вместо этого вы должны вызывать метод по имени, точно так же, как обычный статический или виртуальный метод. Хотя это создает код, который выполняет вызов по индексу через подпрограмму библиотеки времени выполнения, похоже, что нет определенного доступа к этой процедуре.

Это позор, потому что такой вызов по индексу открывает все виды интересных возможностей, таких как изменение DMT во время выполнения и возможность «передавать сообщения» объектам, а не просто вызывать статический имя. Когда вы даете объекту команды, передавая числовое (или перечисленные) сообщения к нему, вы получаете возможность обрабатывать сообщение как переменная, а не константа, и, таким образом, один и тот же код может указать объекту делать разные вещи в разное время.

Например, где Традиционно объектно-ориентированная программа может указать объекту Отображение самого без оглядки на то, как он это сделает, его более интерпретирующий, «двойной полиморфный» двоюродный брат может сказать объекту «делать что-то», не зная и не заботясь о том, как объект будет выполнять команда или , является ли команда Показать , Печать , SaveToDisk или CopyToClipboard .

Примерно так же, если мы можем сравнить адрес динамического объекта метод на адрес метода его предкового типа, мы можем сделать то, что мы не можем сделать в TP5.5 или 6: выяснить, объект переопределил наследственный метод. Хотя большую часть времени мы не хочу этого знать, а просто хочу иметь возможность вызвать метод и верьте, что объект отреагирует соответствующим образом, бывают случаи, когда мы

сделать уход. Например, так же, как можно сделать `background обработка» под DOS с использованием KeyPressed и ReadKey вместо Read , поэтому фоновая обработка выполняется под Windows, используя PeekMessage вместо GetMessage . Но не имеет большого смысла использовать PeekMessage , если вы не необходимо выполнять фоновую обработку, так как это замедляет работу всей системы на заставляя Windows выделять вашей задаче долю ЦП при каждом проходе через список задач. Если бы родовой объект приложения мог сказать до того, как он войдет в свой цикл сообщений, независимо от того, конкретный тип потомка имеет «настоящий» Фоновый метод или просто наследуется метод «заглушки» предка, он может автоматически использовать соответствующий цикл сообщений.

К счастью, хотя мы не можем напрямую вызвать процедуру поиска DMT RTL, форматы DMT и VMT просты и тщательно задокументированы, а оператор TypeOf() вернет указатель на VMT. Функция Dynamic в листинге 1 принимает два аргумента: указатель на VMT и указатель динамического метода. Он возвращает либо указатель на метод или Nil , если нет метода с таким индексом.

Его работа довольно проста. Он загружает свои аргументы в регистры, затем считывает смещение DMT из VMT. Если нет DMT, возвращается ноль Если есть DMT, Dynamic считывает слово длины и вычисляет смещение последних индексов в таблице. Это тогда сканирует в обратном направлении, пока не найдет нужную запись указателя или пока не достигает начала таблицы. (Обратное сканирование означает, что успешный поиск оставляет позицию совпадения в CX.) Если поиск был успешно, он читает и возвращает соответствующий указатель метода; в противном случае он загружает указатель на DMT родителя объекта и возвращается назад к проверке существования DMT в верхней части функции.

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

Приведение указателей к «обычным» процедурам и функциям немного проще. чем приведение указателей к методам: мы просто используем процедурный тип с тот же синтаксис, что и код, который мы вызываем. Таким образом, если у нас есть

  тип FnType = функция (N: целое число): целое число;
  функция Foo(N: целое число): целое число; начало {...} конец;
  константа Fn: FnType = Foo; FnPtr: указатель = @Foo;
 
три оператора « Foo(N) «, « Fn(N) » и » FnType(FnPtr)(N) » все имеют одинаковый эффект: они отправляют копию из N , затем позвоните по номеру Foo . Более того, последние два операторы будут генерировать точно такой же код вызова через указатель (который немного меньше и немного медленнее, чем прямой call-32-битный адресный код).

Приведение указателей к вызовам методов осложняется «невидимым» Self. указатель. Это невидимо только для вызываемого кода: вызывающий код имеет чтобы обязательно поставить его! Например, « введите NiladicMethod = процедура (var Self) » является прототипом метода без нормального аргументы и нет результата, а »

type MsgHandler = procedure (var Msg: тип сообщения; var Self) » является прототипом метода с одной переменной параметр.

[См. мою статью «Три мифа о Turbo Pascal» для получения дополнительных примеров использования указателей на методы.]
Таким образом, если ваша функция экспорта может связать дескриптор окна с указателем объекта и тем самым может вызывать метод, объектно-ориентированный оконная функция для Windows 3.0 может выглядеть так, как показано в листинге 2. в то время как основной цикл сообщений приложения может выглядеть примерно так Листинг 3.

В заключение, динамические методы — это захватывающее новое дополнение к Turbo. Pascal, и я надеюсь, что они (и расширения PChar) часть следующей версии Turbo Pascal для DOS. Поиск DMT функция, которую я представил в этой статье, проста и разумна эффективным, а его использование в нескольких ключевых местах позволяет приложениям быть одновременно более гибкий и простой в кодировании.


Эта статья первоначально появилась в PC Techniques .

Copyright © 1991, Джон Шемитц, jon@midnightbeach. com. HTML-разметка, 16 октября 1994 г.

Вернуться к списку публикаций

игр и утилит для MS-DOS (с исходным кодом)

игр и утилит для MS-DOS (с исходным кодом)

В начале это был простой DOS… Это было где-то в 1991 году, когда у меня появился мой первый компьютер. При этом время, когда я начал программировать на BASIC и Turbo Pascal (с небольшим количеством ассемблера). Около 7 лет, Я писал программы для DOS. После этого я начал разрабатывать программное обеспечение для Windows, но вскоре влюбился в среду Unix и полностью отказался от мира dos/dos oops… dos/win я имею в виду 🙂

Игры

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

Master Mind

mmind. pas
Вы можете попробовать угадать номер компьютера или позволить компьютер угадает ваш номер с минимальными усилиями!

Nibbles

nibbles.zip (исходный код и двоичный файл)
Известная игра «Кусочки». Он поддерживает множество игроков одновременно!

Оценка 4

score4.zip (исходный код на Паскале и двоичный файл)
Классическая игра «Соедини четыре» (также известная как Score 4). ИИ в игре далек от совершенства (но может легко победить вас, если вы не будете осторожны). Я написал эту игру, когда понятия не имел об алгоритмах ИИ! 🙂 Если ты заинтересован в Connect Four, затем проверьте также следующее:
  • Велена — Идеальная игра — всегда побеждает первый игрок!
  • Кит Помакис, страница n-In-A-Row
  • См. здесь современный римейк C++/SFML

Ms Pacman

mspacgt.zip (исходный код и двоичный файл Pascal)
Игра мисс Пакман.

RA

ra.zip (исходный код и двоичный файл Pascal)
Аркадная/платформенная игра. Идея и графика были украдены из гробницы фараона! (извини).

RA 2

ra2.zip (исходный код и двоичный файл DJGPP C++)
Вторая версия РА. Теперь с прокруткой и большим количеством цветов! Использует Аллегро мультиплатформенная игровая библиотека. Думаю, портировать на Linux будет легко (спасибо Allegro). Если вы это сделаете, пришлите мне копию!

Единицы турбопаскаля

gtunits.zip
Вам понадобятся некоторые из этих модулей для компиляции игр на Паскале.
advanced.pas различные расширенные подпрограммы (indosflag,bload,bsave и т.д.)
ansi.pas преобразовать строку в ansi-экранирование и наоборот
basic.pas различные процедуры текстового режима (gettext/puttext/colors/frames/etc.)
bios. pas подпрограммы диска BIOS (чтение/запись/форматирование)
crt2.pas блок быстрого ввода/вывода текста
fade.pas постепенное появление/исчезновение (эффект палитры)
keyb2.pas флаги клавиатуры (shift/capslock/и т.д.)
keyboard.pas crt’s readkey/keypressed замена
math.pas некоторые математические операции
mouse.pas подставка для мыши
movsb.pas строковые операции сборки (с поддержкой 32-битной версии)
patch.pas исправление файла
protect.pas защита от копирования контрольной суммы
sbaudio.pas звуковой бластер аудио (низкий уровень)
strhan.pas процедуры обработки строк
textfont.pas текстовые шрифты биоса
timer. pas подпрограммы таймера
vga.pas vga 320×200 8-битный графический блок
xargs.pas обработка аргументов
xsound.pas звуковые процедуры высокого уровня (для игр)

Коммунальные услуги

Файловые и дисковые утилиты

fsplit.pas
С помощью этой утилиты можно разбивать большие файлы на более мелкие части.
го.пасс
Поиск в дереве каталогов в порядке BFS и переход в указанный каталог.
timex.pas
Эта программа позволяет засекать время выполнения другой программы и может предупредить вас в режиме реального времени, если лимит времени был превышен. Он также пытается чтобы определить, не испортилась ли целевая программа с таймером! 😉

Программы TSR

alarm.pas
Эта программа демонстрирует использование функции будильника из БИОС.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *