- •Часть I. Работа в среде
- •Глава 1. Интегрированная среда
- •1.1. Окно просмотра результатов Output
- •1.2. Окно просмотра переменных Watch
- •1.3. Структура меню
- •1.3.1. Пункт File (работа с файлами)
- •1.3.2. Пункт Edit (работа с редактором)
- •1.3.3. Пункт Run (запуск на выполнение)
- •1.3.4. Пункт Compile (компиляция)
- •1.3.5. Пункт Options (установка параметров системы)
- •1.3.6. Пункт Debug (установки отладчика)
- •1.3.7. Пункт Break/Watch (точки останова/обзор)
- •1.4. Интерактивная справка
- •Глава 2. Настройка системы
- •2.1. Система настройки среды программирования
- •2.2. Принятые в системе расширения имен файлов
- •Часть II. Язык турбо паскаль
- •Глава 3. Построение программ
- •3.1. Алфавит языка и зарезервированные слова
- •3.2. Общая структура программ
- •3.3. Комментарии и ключи компиляции
- •3.4. Условная компиляция программ
- •Глава 4. Введение в систему типов языка
- •4.1. Простые типы языка
- •4.1.1. Целочисленные типы
- •4.1.2. Вещественные числа
- •4.1.3. Логический тип
- •4.1.4. Символьный тип
- •4.1.5. Строковый тип
- •4.1.6. Адресный тип
- •4.1.7. Перечислимые типы
- •4.1.8. Ограниченные типы (диапазоны)
- •4.2. Сложные типы языка
- •Глава 5. Константы и переменные
- •5.1. Простые константы
- •5.2. Переменные
- •5.2.1. Совмещение адресов директивой absolute
- •5.2.2. Переменные со стартовым значением или типизированные константы
- •5.3. Операция присваивания и совместимость типов и значений
- •5.4.Изменение (приведение) типов и значений
- •Глава 6. Управляющие структуры языка
- •6.1. Простой и составной операторы
- •6.2. Условный оператор (if...Then...Else)
- •If Условие then Оператор1 else Оператор2;
- •6.3. Оператор варианта (case)
- •6.4. Оператор цикла с предусловием (while)
- •6.6. Оператор цикла с параметром (for...Do)
- •6.7. Оператор безусловного перехода Goto
- •6.8. Операторы Exit и Halt
- •6.9. Процедуры и функции
- •6.9.1. Параметры. Глобальные и локальные описания
- •6.9.2. Опережающее описание процедур и функций
- •6.9.3. Объявление внешних процедур
- •6.9.4. Процедуры и функции как параметры
- •6.9.5. Переменные-процедуры и функции
- •6.9.6. Специальные приемы программирования
- •6.10. Модули. Структура модулей
- •6.11. Особенности работы с модулями
- •6.12. Система библиотечных модулей языка
- •Часть III. Средства языка турбо паскаль
- •Глава 7. Массивы, записи и множества в деталях
- •7.1. Массивы (Array) и работа с ними
- •7.2. Тип «запись» (Record) и оператор присоединения With
- •7.3. Тип «множество» (Set). Операции с множествами
- •Глава 8. Обработка символов и строк
- •8.1. Символьный и строковый типы (Char и String)
- •8.2. Операции над символами
- •8.3. Операции над строками
- •8.3.1. Редактирование строк
- •8.3.2. Преобразование строк
- •8.3.2.1. Процедура Str( X [: Width [: dec ] ]; var s : String)
- •Глава 9. Математические возможности Турбо Паскаля
- •9.1. Базовые операции
- •9.2. Битовая арифметика
- •9.3. Логические вычисления и операции отношения
- •9.4. Математические процедуры и функции
- •9.4.1. Обсуждение математических функций языка
- •9.4.2. Генераторы случайных чисел
- •9.4.3. Оптимизация сложения и вычитания
- •9.5. Использование математического сопроцессора 80x87
- •Глава 10. Код программы, данные, адреса
- •10.2. Распределение памяти при выполнении программ
- •10.3. Анализ расположения кода и областей данных программы
- •10.5. Средства для работы с адресами
- •10.5.1. Определение адреса переменных
- •10.5.2. Создание адреса функцией Ptr
- •10.5.3. Определение размеров типов и переменных
- •Глава 11. Ссылки, динамические переменные и структуры
- •11.1. Ссылочные переменные
- •11.2. Операция разыменования
- •11.3. Организация памяти области кучи
- •11.4. Управление размерами области кучи и стека
- •11.5. Процедуры управления кучей
- •11.5.1. Размещение динамических переменных.
- •11.5.2. Освобождение динамических переменных.
- •11.5.3. Управление состоянием кучи.
- •11.5.4. Анализ состояния кучи.
- •11.5.5. Более детальный анализ состояния кучи
- •11.6. Ссылки, работающие не с кучей
- •11.5.6. Обработка ошибок распределения памяти
- •11.7. Как организовать структуры, большие чем 64к?
- •11.8. Практический пример построения стека
- •Глава 12. Ввод-вывод данных и файловая система
- •12.1. Понятие логического файла
- •12.2. Физические файлы в ms-dos
- •12.3. Понятие буфера ввода-вывода
- •12.4. Файловые типы Турбо Паскаля
- •12.5. Общие процедуры для работы с файлами
- •12.5.1. Связывание файлов
- •12.5.2. Открытие файлов
- •12.5.3. Закрытие файлов
- •12.5.4. Переименование файлов
- •12.5.5. Удаление файлов
- •12.5.6. Анализ состояния файлов
- •12.6. Текстовые файлы
- •12.6.1. Текст-ориентированные процедуры и функции
- •12.6.2. Операции ввода-вывода в текстовые файлы
- •123 1.23 [Клавиша ввода]
- •123 [Клавиша ввода] 1.23 [Клавиша ввода]
- •12.7. Типизированные файлы и операции ввода-вывода
- •12.8. Бестиповые файлы и операции ввода-вывода
- •12.9. Последовательный и прямой доступ к файлам
- •12.9.1. Опрос размеров файлов и позиции в них
- •12.9.2. Позиционирование в файлах
- •12.9.3. Усечение файлов
- •12.10. Процедуры для работы с каталогами
- •12.11. Обработка ошибок ввода-вывода
- •12.11.1. Функция ioResult
- •12.11.2. Примеры обработки ошибок ввода-вывода
- •12.11.3. Сводка номеров ошибок ввода-вывода
- •Глава 13. Объектно-ориентированное программирование
- •13.1. Определения объектов
- •13.2. Область действия полей объекта и параметр Self
- •13.3. Наследование
- •13.4. Присваивание объектов
- •13.5. Полиморфизм
- •13.5.1. Статические методы
- •13.5.2. Виртуальные методы
- •13.5.3. Выбор вида метода
- •13.6. Динамические объекты
- •13.6.1. Создание динамических объектов
- •13.6.2. Освобождение объектов. Деструкторы
- •13.6.3. Обработка ошибок при работе с динамическими объектами
- •13.7. Функции TypeOf и SizeOf
- •13.8. Задание стартовых значений объектам
- •13.9. Модули, экспортирующие объекты
- •Глава 14. Специальные средства языка
- •14.1. Работа с командной строкой. Функции ParamCount и ParamStr
- •14.2. Доступ к памяти пэвм. Массивы Mem, MemW, MemL
- •14.3. Доступ к портам ввода-вывода. Массивы Port и PortW
- •14.4. Процедура заполнения FillChar
- •14.5. Процедура перемещения данных Move
- •14.6. Функции обработки машинных слов Lo, Hi и Swap
- •14.7. Вставки машинного кода в программе
- •14.7.1. Оператор inline
- •14.7.2. Процедуры с директивой inline
- •14.8. Процедура завершения и обработка ошибок программ
- •14.8.1. Оператор RunError
- •14.8.2. Сводка номеров фатальных ошибок
- •Часть IV. Специальные библиотеки языка
- •Глава 15. Модуль crt
- •15.1. Вывод специальных символов
- •15.2. Модификация операторов Read, ReadLn
- •15.3. Системные переменные модуля crt
- •15.3.1. Переменные управления выводом на дисплей
- •15.3.2. Переменные управления работой клавиатуры
- •15.3.3. Переменная TextAttr
- •15.4. Процедуры и функции модуля crt
- •15.4.1. Работа с экраном в целом
- •15.4.2. Позиционирование курсора
- •15.4.3. Работа со строками
- •15.4.4. Настройка цвета
- •15.4.5. Подача звуковых сигналов
- •15.4.6. Использование встроенного таймера
- •15.4.7. Опрос клавиатуры
- •If KeyPressed then Действие ;
- •15.4.8. Переназначение стандартных файлов
- •Глава 16. Модуль dos
- •16.1. Опрос и установка параметров ms-dos
- •16.1.1. Управление параметрами break и verify 16.1.1.1.
- •16.1.2. Опрос системных переменных ms-dos
- •16.2. Работа с часами и календарем
- •16.2.1. Опрос и назначение даты
- •16.2.3. Работа с датой создания файлов
- •16.3. Анализ ресурсов дисков
- •16.4. Работа с каталогами и файлами
- •16.4.1. Типы и константы модуля dos для работы с файлами
- •16.4.2. Переменная DosError
- •16.4.3. Процедуры поиска файлов на диске
- •16.4.4. Работа с атрибутами файлов
- •16.4.5. Анализ имен файлов
- •16.5. Работа с прерываниями ms-dos
- •16.5.1. Чтение и перестановка адресов подпрограмм прерываний
- •16.5.2. Вызов прерывания процедурой Intr
- •16.5.3. Процедура MsDos
- •6.6. Организация субпроцессов и резидентных программ
- •16.6.1. Программирование субпроцессов
- •Глава 17. Модуль Printer
- •7.1. Содержимое модуля Printer
- •17.2. Низкоуровневые средства работы с принтером
- •17.3. Работа с двумя принтерами одновременно
- •Глава 18. Модуль Overlay
- •18.1. Оверлейное построение программ
- •18.2. Правила оформления оверлейных программ
- •18.3. Инициализация работы оверлеев
- •18.3.1. Включение администратора оверлеев
- •18.3.2. Анализ результата инициализации
- •18.3.3. Размещение оверлейного файла в ems-памяти
- •18.4. Управление оверлейным буфером
- •18.4.1. Опрос размера буфера
- •18.4.2. Установка размера буфера
- •18.4.3. Принудительная очистка буфера
- •18.5. Оптимизация работы оверлеев
- •18.5.1. Установка размера области испытаний
- •18.5.2. Подсчет вызовов оверлеев
- •18.6. Предопределенные переменные для работы с оверлеями
- •18.7. Включение оверлеев в ехе-файлы
- •Глава 19. Модуль Graph
- •19.1. Файлы bgi и содержимое модуля Graph
- •19.2. Управление графическими режимами
- •19.2.1. Инициализация и закрытие графического режима
- •19.2.2. Обработка ошибок инициализации
- •19.2.3. Классификация и анализ графических режимов
- •19.2.4. Очистка экрана и переключение режимов
- •19.2.5. Управление режимом вывода отрезков на экран
- •19.3. Системы координат и «текущий указатель»
- •19.3.1. Координаты устройства и мировые координаты
- •19.3.2. Управление «текущим указателем»
- •19.4. Рисование графических примитивов и фигур
- •19.4.1. Линии и их стили
- •1100110011001100 — Всего 16 разрядов.
- •19.4.2. Коэффициент сжатия изображения
- •19.4.3. Окружности, эллипсы и дуги
- •19.4.4. Построение прямоугольников и ломаных
- •19.5. Управление цветами и шаблонами заливки (заполнения)
- •19.5.1. Немного о цветах
- •19.5.2. Задание типа заливки
- •19.5.3. Заливка областей изображения
- •19.5.4. Опрос и установка цветов пера и фона
- •19.5.5. Управление палитрой
- •19.6. Битовые графические операции
- •19.6.1. Битовые операции
- •19.6.2. Работа с фрагментами изображений
- •19.7. Управление видеостраницами
- •19.8. Графические окна
- •19.9. Вывод текста
- •19.9.1. Выбор шрифта и стиля
- •19.9.2. Предварительная загрузка и регистрация шрифтов
- •19.9.3. Непосредственный вывод строк
- •19.9.4. Размер букв и его масштабирование
- •19.9.5. Опрос стиля и ориентации шрифтов
- •19.10. Включение шрифтов и драйверов в ехе-файл
- •19.11. Подключение новых драйверов
- •19.12. Один полезный совет
- •Часть V. Практические
- •Глава 20. Профессиональная работа с
- •20.1. Программный опрос режимов текстового дисплея
- •20.2. Организация доступа к видеопамяти
- •20.3. Запоминание окон экрана и их восстановление
- •20.3.1. Общие принципы работы с окном
- •20.3.2. Модуль Win
- •20.4. Работа с образом экрана на диске
- •20.5. Крупные надписи на экране
- •20.6. Управление формой курсора
- •Глава 21. Как осуществить полный доступ к клавиатуре
- •21.1. Как организовать опрос алфавитно-цифровой клавиатуры
- •21.2. Опрос клавиши в регистре Ctrl
- •21.3. Опрос расширенных кодов и функциональных клавиш
- •21.4. Опрос служебных клавиш
- •21.5. Анализ клавиш регистров и их состояния
- •21.6. Скэн-коды клавиатуры и работа с ними
- •21.7. Эффект обратной записи в буфер ввода
- •Глава 22. Работа с оперативной
- •22.1. Многобитовое и многоплоскостное озув
- •22.2. Карта дисплейной памяти
- •22.3. Вывод текста на графический экран
- •22.4. Работа с графическими образами на диске
- •Приложение 2 Ключи и директивы компилятора
- •Ключи режимов компиляции
- •Директивы с параметрами
- •Приложение 3
- •Файл tpc.Cfg
- •Приложение 4 Список утилит пакета Турбо Паскаль (версия 5.5)
- •Программа администрирования библиотек
- •Утилита поиска текстов grep
- •Утилита преобразования двоичных файлов binobj
- •Приложение 5
- •Основные команды перемещения курсора
- •Расширенный набор команд перемещения курсора
- •Команды вставки и удаления
- •Команды работы с блоками
- •Поиск и замена
- •Прочие команды
- •Приложение 6
- •If False then Оператор;
- •Приложение 7
- •Глава 6. Управляющие структуры языка
- •Глава 8. Обработка символов и строк
- •Глава 9. Математические возможности Турбо Паскаля
- •Глава 16. Модуль dos
- •Глава 17. Модуль Printer
- •Глава 18. Модуль Overlay
- •Глава 19. Модуль Graph
- •Глава 20. Профессиональная работа с текстовыми изображениями
- •Глава 21. Как осуществить полный доступ к клавиатуре
- •Глава 22. Работа с оперативной памятью видеоадаптеров
- •Литература
- •Оглавление
- •Часть I. Работа в среде программирования
- •Часть II. Язык турбо паскаль
- •Часть III. Средства языка турбо паскаль
- •Часть IV. Специальные библиотеки языка
- •Часть V. Практические приемы работы с пэвм
20.3. Запоминание окон экрана и их восстановление
20.3.1. Общие принципы работы с окном
Введенные выше типы структур для обращения к видеопамяти можно с успехом использовать для работы с произвольными областями экрана — окнами. Единственное, что потребуется — это, чтобы окно имело прямоугольную форму. В таком случае надо обрабатывать (считывать, запоминать, заполнять) не всю последовательность ячеек видеопамяти, а набор фрагментов, каждый из которых представляет собой одну строку окна. Число таких фрагментов равно числу строк в окне. Длина каждого фрагмента равна ширине окна. Начало первого фрагмента в структуре видеопамяти (Start) для окна, заданного координатами X1, Y1, X2, Y2, можно вычислить по формуле:
Start * M*( Y1 - 1 ) +X1,
где M — число столбцов для текущего текстового режима. Начало каждого последующего фрагмента получается добавлением числа M к началу предыдущего. Ширина окна (Width), она же длина одного фрагмента, определяется очевидным образом:
Width = ( Х2 - Х1 ) + 1
а число фрагментов (Height) находится как
Height = ( Y2 - Y1 ) + 1.
Для того чтобы запомнить (сохранить) все окно, потребуется область памяти размером
Size = Width * Height * 2,
где 2 появляется из-за того, что один символ на экране представляется двумя байтами в памяти. Обычно при сохранении окна фрагменты записываются в память последовательно, и при их {478} восстановлении на экране необходимо вновь вычислять положение каждого из них.
20.3.2. Модуль Win
В архиве DEMOS.ARC пакета Турбо Паскаль имеются исходные тексты модуля Win, базирующегося на модуле CRT и реализующего простейшие действия с текстовыми окнами. Большинство его процедур написано на ассемблере, что обеспечивает высокую скорость выполнения. В модуле вводятся три новых типа и две константы для рисования рамок вокруг окна (рис. 20.6):
TYPE TitleStr=string[63]; { заголовок окна } FrameChars=Array[1..8] of Char; { символы рамки } WinState = RECORD { параметры окна: } WindMin,WindMax : Word; { координаты окна } WhareX, WhereY : Byte; { положение курсора} TextAttr : Byte; { цветовой атрибут } END; CONST SingilFrame : FrameChars='┌┐ ││└└’; { одинарная paмкa } DoubleFrame : FrameChars='╔╗║║╚╝'; { двойная рамка } |
Рис. 20.6
20.3.2.1. Задание окна. Поскольку модуль Win базируется на модуле CRT, задание окна по-прежнему производится процедурой Window (или, точнее, CRT.Window). По умолчанию считается, что окно соответствует всему экрану. По-прежнему активным может быть только одно окно — текущее.
20.3.2.2. Вывод строк в окна. В модуле Win реализована пара процедур для вывода символов и строк в окно. Процедура
WriteStr( X,Y : Byte; S : String; Attr : Byte )
выводит строку S, а процедура
WriteChar( X,Y, Count : Byte; Ch : Char; Attr : Byte )
выводит Count символов, заданных параметром Ch. В обоих процедурах параметры X и Y обозначают начало выводимой информации в оконных координатах, a Attr задает значение для TextAttr при выводе. Отличие этих процедур от Write и WriteLn в том, что при выходе за границы окна не происходит прокрутки изображения или переноса строк. Лишние символы просто «обрезаются» по рамке окна. {479}
20.3.2.3. Оформление окон. В модуле Win имеется процедура для заполнения текущего окна символом Ch при цветовом атрибуте Attr:
FillWin(Ch :Char; Attr : Byte);
Ее можно вызывать вместо процедуры очистки окна ClrScr.
После задания окна процедурой Window его можно взять в рамку с помощью процедуры
FrameWin(Title : TitleStr; VAR Frame : FrameChars;
TAttr, FAttr : Byte),
где Title — строка-заголовок окна, Frame — набор символов, составляющих рамку (сюда можно подставлять константы SingleFrame и DoubleFrame), а TAttr и FAttr — цветовые атрибуты заголовка и рамки соответственно. Рамка выводится по периметру окна, не выходя за его пределы. Поэтому после обрамления размеры самого окна уменьшаются на единицу со всех сторон. Очистка окна при выводе рамки не осуществляется.
Отмена рамки для текущего окна производится процедурой UnFrameWin. Она просто восстанавливает размеры окна, которые были до взятия его в рамку (увеличивает их на единицу со всех сторон). Рамка при этом не стирается и может быть удалена только командой очистки всего окна (ClrScr или FillWin). Применение процедуры UnFrameWin к окну, не имеющему рамки, равносильно увеличению его размеров.
20.3.2.4. Сохранение параметров окна. При открытии (задании) нового окна на экране можно сохранять все параметры предыдущего окна. Это делается процедурой модуля Win
SaveWin(VAR W : WinState),
присваивающая текущим параметрам окна значения, сохраненные в переменной W типа WinState параметрами текущего окна. При восстановлении изображения окна на экране (об этом ниже) можно также «вспомнить», где стоял курсор и каким цветом выводился текст. Для этого предусмотрена процедура
RestoreWin(Var W : WinState),
присваивающая текущим параметрам окна значения, сохраненные в переменной W. Само изображение окна в переменной W не сохраняется. Для этого имеются другие процедуры.
20.3.2.5. Сохранение содержимого окна. При построении накладывающихся окон необходимо запоминать содержимое «нижних» окон и восстанавливать его после снятия с экрана «верхних». Эти действия реализованы одной функцией и двумя процедурами модуля Win: {480}
WinSize : Word;
ReadWin( VAR Buf );
WriteWin( VAR Buf ).
Функция WinSize возвращает количество байтов, необходимое для запоминания содержимого текущего окна. Процедура ReadWin записывает в бестиповую переменную Buf изображение из текущего окна. Другая процедура, WriteWin, выводит в текущее окно изображение, сохраненное ранее в переменной Buf. Размер переменной Buf, передаваемой в процедуры, должен быть не менее, чем значение WinSize.
Важно, что само изображение не содержит указаний на размеры «своего» окна и его расположение. Поэтому для вывода сохраненного окна на экран надо сначала восстановить его параметры процедурой RestoreWin и лишь затем вызывать процедуру WriteWin.
На рис. 20.7 приводятся процедуры для задания на экране системы накладывающихся окон. Вся информация об окне содержится в переменных типа WindowType. Для введения окна в обращение надо однократно вызвать процедуру OpenWin. Далее окно можно «заморозить» процедурой FreezeWin (что сделает активным предыдущее окно) и вновь сделать активным с помощью процедуры ActivateWin. Изъятие окна из обращения производится процедурой CloseWin.
USES { ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ОКНАМИ НА ЭКРАНЕ } CRT, Win; { подключены модули CRT и Win } TYPE WindowType = RECORD { тип для ведения системы окон: } Size : Word; { объем памяти для окна в байтах } Frame : 0..2; { шифр типа рамки (0, если нет) } BufSave : Pointer; { адрес изображения под окном } BufWin : Pointer; { адрес изображения "в окне" } StateSave : WinState; { состояние до открытия окна } StateWin : WinState; { состояние при закрытии окна } END; {Процедура открывает окно и делает его текущим. } PROCEDURE OpenWin(X1,Y1,X2,Y2: Byte;T: TitleStr; TAttr, FAttr, FrameSort: Byte; VAR W : WindowType ); BEGIN with W do begin SaveWin( StateSave ); { сохранение исходного состояния } |
Рис. 20.7 {481}
Window(X1,Y1, X2,Y2); { объявление нового текущего окна } Frame := FrameSort; { запоминание типа рамки } Size := WinSize; { запоминание объема окна } GetMem(BufSave,Size); { память для "картинки" фона } ReadWin( BufSave^); { сохранение "картинки" фона } case FrameSort of { взятие текущего окна в рамку } 1 : FrameWin(T,SingleFrame,TAttr,FAttr); { простая } 2 : FrameWin(T,DoubleFrame,TAttr,FAttr ); { двойная } end; {case} ClrScr; { очистка нового текущего окна } SaveWin( StateWin ); { сохранение этого состояния окна } if Frame<>0 then UnFrameWin; {если есть рамка, то снять } GetMem(BufWin,Size); { память для "картинки" окна } ReadWin( BufWin^ ); { сохранение "картинки" окна } RestoreWin(StateWin) { восстановление рамки окна } end (with} END; { Процедура делает окно W активным (текущим). } PROCEDURE ActivateWin( VAR W : WindowType ); BEGIN with W do begin RestoreWin( StateWin ); { восстановление параметров } if Frame <> 0 then UnFrameWin; {если есть рамка,то снять } WriteWin( BufWin^ ); { восстановление "картинки" окна } RestoreWin(StateWin) { восстановление снятой рамки } end END; { Процедура делает окно W неактивным и стирает его, } { если параметр Erase равен True. } PROCEDURE FreezeWin(VAR W: WindowType; Erase: Boolean); BEGIN with W do begin SaveWin( StateWin ); { сохранение состояния окна } if Frame<>0 then UnFrameWin; {если есть рамка, то снять } ReadWin( BufWin^); { сохранение "картинки" окна } GotoXY(1,1); if Erase then { Если надо стереть окно, то } WriteWin(BufSave^); { восстановить картинку фона } RestoreWin(StateSave) { в предыдущее состояние } end {with} END; |
Рис. 20.7 (продолжение) {482}
{ Процедура закрывает (уничтожает) окно W. } PROCEDURE CloseWin( VAR W : WindowType ); BEGIN with W do begin RestoreWin(StateWin); { окно W становится текущим } if Frame <> 0 then UnFrameWin; {если есть рамка, то снять } GotoXY( 1,1 ); WriteWin(BufSave^); {восстановление "картинки" фона } RestoreWin(StateSave); {восстановление состояния фона } FreeMem(BufSave,Size); {удаление "картинки" фона } FreeMem(BufWin,Size) {удаление "картинки" окна } end {with} END; { -- ПРИМЕР ВЫЗОВОВ ПРОЦЕДУР —- } VAR WW : Array [1..4] of WindowType; { массив окон } i,k : Byte; { счетчики циклов } BEGIN FillWin{ #176, Cyan ); { закраска экрана } GotoXY( 1,1 ); Write( 'Нажимайте клавишу ввода..,' ); for k:=1 to 4 do begin OpenWin(10*k,2*k, 20*k, 4*k,'окно', { Открытие окон и } Black+k, Blue+k, k mod 3, WW[k]); { вывод в них: } TextAttr := 16*k + ( White-k ); for i:=32 to 127 do begin Write( Chr(i) ); Delay(20) end; FreezeWin( WW[k], False ); { отмена активности } Delay( 200 ) { просто пауза 0.2с } end; ReadLn; for k:=4 downto 1 do begin ActivateWin( WW[k] ); { "включение" окна } for i:=128 to 255 do begin Write( Chr(i) ); Delay(20) end; FreezeWin( WW[k], False ); { отмена активности } Delay( 200 ) { просто пауза 0.2с } end; ReadLn; { стирание окон: } for k:=4 downto 1 do begin CloseWin(WW[k]); Delay(200) end; ReadLn END. |
Рис. 20.7 (окончание) {483}
Используя приведенные процедуры как базовые, можно построить более высокоуровневые процедуры работы с окнами. Мы же здесь хотели лишний раз показать, что грозно звучащие операции типа «сохранение окон» на деле вовсе не так сложны.
Можно пойти дальше и так организовать работу с окнами, чтобы менять формат окна при его восстановлении. В самом деле, изображение окна выводится процедурой WriteWin в текущее окно. Если формат текущего окна на экране будет иным при той же площади окна, то изображение при выводе будет переформатировано.
Непосредственная работа с видеопамятью требует, конечно, навыков и знания механизмов ее работы. Но эффекты, которые можно достичь, стоят того, чтобы посидеть несколько вечеров с ПЭВМ, изучая видеопамять.
