- •Введение
- •Как использовать руководства по Borland Pascal
- •Глава 1. Установка и запуск Borland Pascal
- •Использование программы Install
- •Программа Install и Windows
- •Запуск Borland Pascal
- •Защищенный режим и память
- •Запуск Borland Pascal for Windows
- •Запуск bp.Exe в расширенном режиме Windows 386
- •Запуск bp.Exe в стандартном режиме Windows
- •Запуск bp.Exe в окне Windows dos
- •Жидкокристаллические и плазменные экраны
- •Файл readme
- •Файлы filelist.Doc и helpme!.Doc
- •Примеры программ
- •Глава 2. Что нового в Borland Pascal
- •Три интегрированных интерактивных среды разработки программ
- •Новые средства ide
- •Компилятор командной строки, работающий в защищенном режиме
- •Среда разработки программ защищенного режима dos
- •Динамически компонуемые библиотеки dos
- •Добавления к языку Паскаль
- •Улучшения в библиотеке исполняющей системы
- •Новые подпрограммы модуля System
- •Новые модули
- •Новые директивы компилятора
- •Усовершенствования компилятора
- •Улучшения в Turbo Vision
- •Улучшения ObjectWindows
- •Новые средства и утилиты
- •Глава 3. Основы интегрированной среды для dos
- •Запуск ide
- •Компоненты интегрированной среды
- •Окна ide
- •Управление окном
- •Строка состояния
- •Диалоговые окна
- •Глава 4. Программирование в интегрированной интерактивной среде для dos
- •Запуск ide и выход из нее
- •Параметры запуска
- •Установка параметров запуска в интегрированной среде
- •Выход из ide
- •Использование справочной системы Help
- •Перемещение в справочной системе
- •Запрос помощи
- •Копирование примеров исходного кода
- •Загрузка других справочных файлов
- •Выход из справочника Help
- •Запись и редактирование исходного кода
- •Настройка конфигурации редактора
- •Изменение решения: команда Undo
- •Групповая отмена
- •Отмена отмены
- •Работа с блоками текста
- •Выделение блока
- •Вырезание, копирование и вставка блоков
- •Изменение поведения выделенных блоков
- •Поиск и замена
- •Соответствие пар ограничителей
- •Переход к строке с заданным номером
- •Использование локального меню окна редактирования
- •Выделение синтаксиса
- •Выбор файлов для выделения
- •Запрещение выделения синтаксиса
- •Глава 4. Программирование в интегрированной интерактивной среде для dos (часть2) Печать исходного кода
- •Работа с файлами
- •Открытие файлов
- •Открытие файла в позиции курсора
- •Компиляция и выполнение
- •Выбор целевой платформы
- •Компиляция
- •Формирование (Make)
- •Построение (Build)
- •Выполнение
- •Передача программе параметров
- •Параметры компилятора и компоновщика
- •Оптимизация кода
- •Условная компиляция
- •Директивы define и undef
- •Предопределенные идентификаторы
- •Идентификаторы iFxxx, else и endif
- •Директивы ifdef и ifndef
- •Директива ifopt
- •Просмотр исходного кода
- •Просмотр объектов
- •Просмотр модулей
- •Просмотр глобальных идентификаторов
- •Просмотр идентификаторов в исходном коде
- •Просмотр функций ObjectBrowser
- •Выполнение в ide других программ
- •Настройка меню Tools
- •Работа с окном Messages
- •Настройка конфигурации ide
- •Сохранение рабочей операционной среды
- •Использование файла конфигурации
- •Использование файла оперативной области
- •Управление проектом
- •Глава 5. Программирование в интегрированной интерактивной среде для Windows
- •Запуск ide для Windows
- •Использование оперативной полосы
- •Настройка конфигурации оперативной полосы
- •Использование справочной системы Help
- •Перемещение по справочной системе
- •Запрос помощи
- •Копирование примеров кода
- •Выход из справочной системы
- •Запись и редактирование исходного кода
- •Настройка конфигурации редактора
- •Набор команд
- •Использование редактора
- •Выделение синтаксиса
- •Цветовое выделение текста
- •Использование системных цветов Windows
- •Изменение атрибутов текста
- •Печать исходного кода
- •Работа с файлами
- •Открытие файлов
- •Где находятся файлы?
- •Работа с файлами в другом каталоге
- •Компиляция и выполнение
- •Просмотр исходного кода
- •Просмотр объектов
- •Буквенные символы в ObjectBrowser
- •Фильтры
- •Просмотр глобальных идентификаторов
- •Просмотр идентификаторов в исходном коде
- •Выполнение в ide других программ
- •Настройка конфигурации ide
- •Глава 6. Отладка в интегрированной среде
- •Что такое отладка?
- •Какие существуют виды ошибок?
- •Методы отладки
- •Генерация отладочной информации
- •Управление выполнением
- •Что такое шаг?
- •Выполнение программы по шагам
- •Трассировка программы
- •Трассировка или выполнение по шагам?
- •Выполнение больших фрагментов
- •Поиск нужного места
- •Повторное выполнение
- •Отслеживание вывода программы
- •Переключение экранов
- •Окно Output
- •Использование двух мониторов
- •Просмотр значений
- •Что такое выражение?
- •Просмотр выражений
- •Спецификаторы формата в выражениях отладчика
- •Вычисление и модификация
- •Использование точек останова
- •Задание точек останова
- •Отмена точке останова
- •Модификация точек останова
- •Создание условный точек останова
- •Прерывание программы без точек останова
- •Глава 7. Модули Borland Pascal
- •Что такое модуль?
- •Структура модуля
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Как используются модули?
- •Ссылки на описания модуля
- •Оператор uses секции реализации
- •Стандартные модули
- •Создание ваших собственных модулей
- •Компиляция модуля
- •Доступность модуля для программы
- •Модули и большие программы
- •Утилита tpumover
- •Глава 7. Модули Borland Pascal
- •Что такое модуль?
- •Структура модуля
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Как используются модули?
- •Ссылки на описания модуля
- •Оператор uses секции реализации
- •Стандартные модули
- •Создание ваших собственных модулей
- •Компиляция модуля
- •Доступность модуля для программы
- •Модули и большие программы
- •Утилита tpumover
- •Глава 9. Объектно-ориентированное программирование
- •Объекты
- •Наследование
- •Объекты: наследующие записи
- •Экземпляры объектных типов
- •Поля объектов
- •Хорошая и плохая техника программирования
- •Совмещенные код и данные
- •Определение методов
- •Область действия метода и параметр Self
- •Поля данных объекта и формальные параметры метода
- •Объекты, экспортируемые модулями
- •Секция private
- •Программирование в "действительном залоге"
- •Глава 9. Объектно-ориентированное программирование(часть2) Инкапсуляция
- •Методы: никакого ухудшения
- •Расширяющиеся объекты
- •Наследование статических методов
- •Виртуальные методы и полиморфизм
- •Раннее связывание против позднего связывания
- •Совместимость типов объектов
- •Полиморфические объекты
- •Виртуальные методы
- •Проверка диапазонов при вызове виртуальных методов
- •Расширяемость объекта
- •Статические методы или виртуальные методы?
- •Динамические объекты
- •Размещение и инициализация с помощью процедуры New
- •Удаление динамических объектов
- •Деструкторы
- •Пример размещения динамического объекта
- •Что же дальше?
- •Заключение
- •Глава 10. Взгляд на Windows
- •Что такое приложение Windows?
- •Преимущества Windows
- •Требования
- •Программные средства
- •Архитектура с управлением по событиям
- •Графика, независимая от устройств
- •Многозадачность
- •Управление памятью
- •Ресурсы
- •Динамическая компоновка
- •Буфер вырезанного изображения
- •Динамический обмен данными
- •Множественный документальный интерфейс
- •Типы данных Windows
- •Объектно-ориентированная работа с окнами
- •Лучший интерфейс с Windows
- •Интерфейсные объекты
- •Абстрагирование функций Windows
- •Автоматизация ответа на сообщения
- •Структура программы Windows
- •Структура Windows
- •Взаимодействие с Windows и dos
- •Элементарная программа
- •Действия программы при запуске
- •Назначение основного окна
- •Цикл разработки прикладной программы
- •Изучение ObjectWindows
Деструкторы
Borland Pascal предоставляет специальный тип метода, называ-
емый "сборщиком мусора" или деструктором, для очистки и удаления
динамически размещенного объекта. Деструктор объединяет шаг уда-
ления объекта с какими-либо другими действиями или задачами, не-
обходимыми для данного типа объекта. Для единственного типа объ-
екта можно определить несколько деструкторов.
Деструктор определяется совместно со всеми другими методами
объекта в определении типа объекта:
tyрe
TEmployee = object
Name: string[25];
Title: string[25];
Rate: Real;
constructor Init(AName, ATitle: String; ARate: Real);
destructor Done; virtual;
function GetName: String;
function GetTitle: String;
function GetRate: Rate; virtual;
function GetPayAmount: Real; virtual;
end;
Деструкторы можно наследовать, и они могут быть либо стати-
ческими, либо виртуальными. Поскольку различные программы завер-
шения обычно требуют различные типы объектов, мы рекомендуем,
чтобы деструкторы всегда были виртуальными, благодаря чему для
каждого типа объекта будет выполнен правильный деструктор.
Запомните, что зарезервированное слово destructor не требу-
ется указывать для каждого метода очистки, даже если определение
типа объекта содержит виртуальные методы. Деструкторы в действи-
тельности работают только с динамически размещенными объектами.
При очистке динамически размещенного объекта, деструктор осущест-
вляет специальные функции: он гарантирует, что в динамически
распределяемой области памяти всегда будет освобождаться правиль-
ное число байтов. Не может быть никаких опасений по поводу ис-
пользования деструктора применительно к статически размещенным
объектам; фактически, не передавая типа объекта деструктору, вы
лишаете объект данного типа полных преимуществ управления динами-
ческой памятью в Borland Pascal.
Деструкторы в действительности становятся самими собою тог-
да, когда должны очищаться полиморфические объекты и когда должна
освобождаться занимаемая ими память. Полиморфические объекты -
это те объекты, которые были присвоены родительскому типу благо-
даря правилам совместимости расширенных типов Borland Pascal. Эк-
земпляр объекта типа THourly, присвоенный переменной типа
TEmployee, является примером полиморфического объекта. Эти прави-
ла также могут быть применены к объектам; указатель на THourly
может свободно быть присвоен указателю на TEmployee, а указуемый
этим указателем объект опять же будет полиморфическим объектом.
Термин "полиморфический" является подходящим, так как код,
обрабатывающий объект, не знает точно во время компиляции, какой
тип объекта ему придется в конце концов обработать. Единственное,
что он знает, это то, что этот объект принадлежит иерархии объек-
тов, являющихся потомками указанного типа объекта.
Очевидно, что размеры типов объектов отличаются. Поэтому,
когда наступает время очистки размещенного в динамической памяти
полиморфического объекта, то как же Disрose узнает, сколько байт
динамического пространства нужно освобождать? Во время компиляции
из полиморфического объекта нельзя извлечь никакой информации от-
носительно размера объекта.
Деструктор разрешает эту головоломку путем обращения к тому
месту, где эта информация записана: в ТВМ переменных реализаций.
В каждой ТВМ типа объекта содержится размер в байтах данного типа
объекта. Таблица виртуальных методов любого объекта доступна пос-
редством скрытого параметра Self, посылаемого методу при вызове
метода. Деструктор является всего лишь разновидностью метода и
поэтому, когда объект вызывает его, деструктор получает копию
Self через стек. Таким образом, если объект является полиморфи-
ческим во время компиляции, он никогда не будет полиморфическим
во время выполнения благодаря позднему связыванию.
Для выполнения этого освобождения памяти при позднем связы-
вании деструктор нужно вызывать, как часть расширенного синтакси-
са процедуры Disрose:
Disрose(P, Done);
(Вызов деструктора вне процедуры Disрose вообще не выполняет
никакого освобождения памяти.) Здесь происходит на самом деле то,
что сборщик мусора объекта, на который указывает P, выполняется
как обычный метод. Однако, как только последнее действие выполне-
но, деструктор ищет размер реализации своего типа в ТВМ и пересы-
лает размер процедуре Disрose. Процедура Disрose завершает про-
цесс путем удаления правильного числа байт пространства динами-
ческой памяти, которое (пространство) до этого относилось к P^.
Число освобождаемых байт будет правильным независимо от того,
указывал ли P на экземпляр типа TSalaried, или он указывал на
один из дочерних типов типа TSalaried, например, на
TCommissioned.
Заметьте, что сам по себе метод деструктора может быть пуст
и выполнять только эту функцию:
destructor AnObject.Done;
begin
end;
То, что делается полезного в этом деструкторе, не является
достоянием его тела, однако при этом компилятором генерируется
код эпилога в ответ на зарезервированное слово destructor. Это
напоминает модуль, который ничего не экспортирует, но который
осуществляет некоторые невидимые действия за счет выполнения сво-
ей секции инициализации перед стартом программы. Все действия
происходят "за кулисами".