Введение
Часть I. Эффективность работы и ее составляющие

Глава 1. Программирование для Windows в Delphi 5
Семейство продуктов Delphi 5
Что такое Delphi
Визуальная среда разработки
Скорость работы компилятора и быстродействие откомпилированных программ
Мощность языка программирования и его сложность
Гибкость и масштабируемость используемой архитектуры баз данных
Поддержка средой разработки шаблонов проектирования и использования
Немного истории
Delphi 1
Delphi 2
Delphi 3
Delphi 4
Delphi 5
Что дальше?
Интегрированная среда разработки Delphi 5
Главное окно
Главное меню
Панели инструментов Delphi
Палитра компонентов
Конструктор форм Form Designer
Инспектор объектов Object Inspector
Редактор кода Code Editor
Окно Code Explorer
Генератор исходного кода
Создание простейшего приложения
События и сообщения
Необязательность программирования
Упрощение разработки прототипов
Расширяемость Delphi
Десять важнейших функций графической среды разработки Delphi
1. Функция дополнения класса (Class Completion)
2. Функция навигации AppBrowser
3. Перемещение между разделами объявления и реализации
4. Состыковка окон
5. Броузер объектов
6. Создание нового GUID
7. Подсветка синтаксиса C++
8. Список То Do
9. Использование менеджера проектов
10. Использование функции Code Insight для завершения
объявлений и параметров
Резюме

Глава 2. Язык программирования Object Pascal
Комментарии
Новые возможности процедур и функций
Скобки
Возможность перегрузки
Значения параметров по умолчанию
Переменные
Константы
Операторы
Оператор присвоения
Операторы сравнения
Логические операторы
Арифметические операторы
Побитовые операторы
Процедуры увеличения и уменьшения
Типы данных Object Pascal
Сравнение типов данных
Символьные типы
Различные строковые типы
Тип AnsiString
Тип ShortString
Тип WideString
Строки с завершающим нулевым символом
Тип Variant
Динамическое изменение типа
Структура определения данных типа Variant
Варианты являются объектами с управляемым временем жизни
Преобразование типов для вариантов
Использование вариантов в выражениях
Пустое значение и значение Null
Варианты-массивы
Функции и процедуры для работы с вариантами-массивами
Инициализация большого массива с помощью функции VarArrayLock()
и процедуры
VarArrayUnlock()
Функции для работы с вариантами
Тип данных OleVariant
Тип данных Currency
Пользовательские типы данных
Массивы
Динамические массивы
Записи
Множества
Использование множеств
Операторы работы с множествами
Объекты
Указатели
Псевдонимы типов
Приведение и преобразование типов
Строковые ресурсы
Условные операторы
Оператор условного перехода if
Оператор case
Циклы
Цикл for
Цикл while
Цикл repeat... until
Процедура Break()
Процедура Continue()
Процедуры и функции
Передача параметров
Передача параметров по значению
Передача параметров по ссылке
Параметры-константы
Использование открытых массивов
Область видимости
Модули
Описание uses
Взаимные ссылки
Пакеты
Использование пакетов Delphi
Синтаксис описания пакетов
Объектно-ориентированное программирование
Объектно-основанное или объектно-ориентированное программирование
Использование объектов Delphi
Объявление и создание
Уничтожение
Методы
Типы методов
Статические методы
Виртуальные методы
Динамические методы
Методы-сообщения
Переопределение методов
Перегрузка метода
Дублирование имен методов
Переменная Self
Свойства
Определение области видимости
Дружественные классы
Внутреннее представление объектов
Класс TObject: родительский объект всех объектов
Интерфейсы
Определение интерфейса
Реализация интерфейсов
Директива implements
Использование интерфейсов
Структурированная обработка исключений
Классы исключительных ситуаций
Обработка исключительных ситуаций
Регенерация исключений
Информация о типе времени выполнения
Резюме

Глава 3. Win32 API
Объекты и еще раз объекты
Объекты ядра
Процессы и потоки
Типы объектов ядра
Объекты GDI и User
Многозадачность и многопоточность
Управление памятью в Win32
Плоская модель памяти
Работа системы управления памятью Win32
Виртуальная память
Отображаемые в памяти файлы
Кучи
Обработка ошибок в Win32
Резюме

Глава 4. Строение приложения и концепции конструирования
Среда Delphi и архитектура проекта
Файлы, входящие в состав проекта Delphi 5
Файл проекта
Файлы модулей проекта
Файлы форм
Файлы ресурсов
Файлы опций проекта и установок рабочего стола
Файлы резервных копий
Файлы пакетов
Советы по управлению проектом
Один проект - один каталог
Модули с разделяемым кодом
Модули для глобальных идентификаторов
Обеспечение взаимной доступности форм
Множественное управление проектами (группы проектов)
Базовые классы проектов Delphi 5
Класс TForm
Отображение модальной формы
Вывод немодальной формы
Управление пиктограммами и рамками форм
Повторное использование и наследование визуальных форм
Класс TApplication
Свойства класса TApplication
Методы класса TApplication
Другие методы
События класса TApplication
Класс TScreen
Архитектура приложений и использование хранилища объектов
Выбор архитектуры приложения
Архитектура приложений Delphi
Пример архитектуры приложения
Класс TChildForm
Класс TDBModeForm
Класс TDBNavStatForm
Использование кадров при разработке проектов
Дополнительные возможности управления проектом
Добавление ресурсов в проект
Изменение курсора
Предупреждение создания нескольких экземпляров формы
Добавление кода в .dpr-файл
Переопределение методов обработки исключений в приложении
Вывод заставки
Ограничение изменений размера окна формы
Проекты, не имеющие форм
Выход из Windows
Защита от выхода из Windows
Резюме

Глава 5. Сообщения Windows
Что такое сообщение
Типы сообщений
Принципы работы системы сообщений Windows
Система обработки сообщений в Delphi
Специализированные записи
Обработка сообщений
Обработка сообщений - условие обязательное
Возврат результата обработки сообщения
Событие OnMessage класса Tapplication
Использование собственных типов сообщений
Метод Perform()
Функции API SendMessage() и PostMessage()
Нестандартные сообщения
Извещающие сообщения
Внутренние сообщения компонентов VCL
Пользовательские сообщения
Использование сообщений внутри приложения
Обмен сообщениями между приложениями
Широковещательные сообщения
Анатомия системы сообщений библиотеки VCL
Связь между сообщениями и событиями
Резюме

Глава 6. Стандарты программирования, принятые в этой книге
Общие правила форматирования исходного кода
Отступы
Ширина поля
Блок begin..end
Язык Object Pascal
Круглые скобки
Зарезервированные и ключевые слова
Процедуры и функции (подпрограммы)
Присвоение имен и форматирование
Формальные параметры
Переменные
Присвоение имен и форматирование
Локальные переменные
Использование глобальных переменных
Типы
Соглашение о выделении прописными буквами
Структурированные типы
Инструкции
Инструкции if
Инструкции case
Инструкции while
Инструкции for
Инструкции repeat
Инструкции with
Структурированная обработка исключительных ситуаций
Общие замечания
Использование конструкции try..finally
Использование конструкции try..except
Использование конструкции try..except..else
Классы
Присвоение имен и форматирование
Поля
Методы
Свойства
Файлы
Файлы проекта
Присвоение имен
Файлы форм
Присвоение имен
Файлы модулей данных
Присвоение имен
Файлы модулей удаленных данных
Присвоение имен
Файлы модулей
Общая структура модулей
Модули форм
Модули данных
Модули общего назначения
Модули компонентов
Заголовки файлов
Формы и модули данных
Формы
Стандарт присвоения имен типам форм
Стандарт присвоения имен экземплярам форм
Формы, создаваемые автоматически
Функции реализации модальных форм
Модули данных
Стандарт присвоения имен модулям данных
Стандарт присвоения имен экземплярам модулей данных
Пакеты
Пакеты времени выполнения и пакеты времени разработки
Стандарты присвоения имен файлам
Компоненты
Компоненты, определяемые пользователем
Стандарты присвоения имен типам компонентов
Модули компонентов
Использование модулей регистрации
Соглашения о присвоении имен экземплярам компонентов
Префиксы типов компонентов
Квалифицированное имя компонента
Сведения об изменении стандартов программирования

Глава 7. Использование элементов управления ActiveX в Delphi
Что представляет собой элемент управления ActiveX
Когда следует использовать элемент управления ActiveX
Внесение элемента управления ActiveX в палитру компонентов
Оболочка компонентов Delphi
Откуда берутся файлы оболочек
Перечисления
Интерфейсы элементов управления
Потомок класса TOleControl
Методы
Свойства
Использование элементов управления ActiveX в приложениях
Распространение приложений, оснащенных элементами управления ActiveX
Регистрация элементов управления ActiveX
BlackJack: пример приложения с компонентом ActiveX
Колода карт
Создание игры
Активизация метода элемента управления ActiveX
Резюме


Часть II. Профессиональное программирование

Глава 8. GDI, шрифты и графика
Представление рисунков в Delphi: класс TImage
Сохранение изображений
Использование свойств класса TCanvas
Использование перьев
Использование свойства Pixels объекта TCanvas
Использование кисти
Использование свойств объекта TBrush
Пример использования объекта TBrush
Использование шрифтов
Использование свойства CopyMode
Другие свойства
Использование методов класса TCanvas
Рисование линий с помощью методов класса TCanvas
Рисование фигур с помощью методов класса TCanvas
Пример программы рисования фигур
Вывод текста с помощью методов класса TCanvas
Использование функций вывода текста, принадлежащих классу TCanvas
Использование GDI-функций вывода текста, не принадлежащих
классу TCanvas
Координатные системы и режимы отображения
Координаты устройства
Логические координаты
Координаты экрана
Координаты формы
Отображение координат
Установка режима отображения
Установка величин Window/Viewport
Пример использования режимов отображения
Создание программы рисования
Как работает программа рисования
Работа с панелью инструментов
Вставка растровых данных из буфера обмена
Присоединение к цепочке просмотра буфера обмена системы Win32
Копирование растра
Комментарии программы рисования
Программирование анимации
Шрифты повышенной сложности
Типы шрифтов в системе Win32
Основные элементы шрифтов
Гарнитура семейства и единицы измерения шрифтов
Категории шрифтов GDI
Растровые шрифты
Векторные шрифты
Шрифты TrueType
Отображение различных типов шрифтов
Пример создания шрифта
Как работает этот проект
Структура TLOGFONT
Отображение информации о шрифтах
Резюме

Глава 9. Динамически компонуемые библиотеки
Что такое библиотека DLL
Сравнение статической и динамической компоновки
Зачем нужны библиотеки DLL
Совместное использование программного кода, ресурсов и данных
несколькю приложениями
Сокрытие реализации
Пользовательские элементы управления
Создание и использование библиотек DLL
Подсчет монет (пример простой библиотеки DLL)
Базовая библиотека DLL
Определение модуля интерфейса
Отображение модальных форм из библиотек DLL
Отображение немодальных форм из библиотек DLL
Использование библиотек DLL в приложениях Delphi
Явная загрузка библиотек DLL
Функция входа/выхода для библиотек DLL
Функции инициализации и завершения процессов и потоков
Пример использования подпрограмм входа/выхода в библиотеке DLL
Исключительные ситуации и библиотеки DLL
Перехват исключительных ситуаций в 16-разрядной Delphi
Исключительные ситуации и директива Safecall
Функции обратного вызова
Использование функции обратного вызова
Отображение нестандартного списка
Обращение к функциям обратного вызова из библиотеки DLL
Разделение данных библиотеки DLL между различными процессами
Создание библиотек DLL с общим полем памяти
Использование библиотек DLL с общей памятью
Экспорт объектов из библиотек DLL
Резюме

Глава 10. Печать в Delphi 5
Объект TPrinter
Свойство TPrinter. Canvas
Простая печать
Печать содержимого компонента TMemo
Печать растрового изображения
Печать данных в формате RTF (Rich Text Format)
Печать формы
Печать сложных документов
Печать отчета с несколькими столбцами
Прерывание процесса печати
Печать конвертов
Теоретическое изучение задачи
Пошаговый процесс печати
Переходим к делу
Простейшее окно предварительного просмотра печати
Прочие задачи печати
Структура TDeviceMode
Задание количества печатных копий
Задание ориентации листа печати принтера
Задание размера бумаги
Задание длины бумаги
Задание ширины бумаги
Задание масштаба печати
Задание цвета печати
Задание качества печати
Задание двухсторонней печати
Изменение принтера, назначаемого по умолчанию
Получение информации о принтере
Функции GetDeviceCaps() и DeviceCapabilities()
Пример программы получения информации о принтере
Объявление функции DeviceCapabilitiesA
Описание работы программы
Резюме

Глава 11. Создание многопоточных приложений
Понятие о потоках
Новый тип многозадачности
Использование многопоточности в приложениях Delphi
Невизуальные компоненты библиотеки VCL
Визуальные компоненты библиотеки VCL
Неправильное использование потоков
Объект TThread
Принципы работы объекта TThread
Экземпляры объекта потока
Завершение работы потока
Синхронизация с подпрограммами библиотеки VCL
Преимущества однопоточного интерфейса пользователя
Метод Synchronize()
Использование сообщений для синхронизации
Демонстрационное приложение
Приоритеты и составление расписания
Класс приоритета процесса
Относительный приоритет
Приостановка и восстановление работы потоков
Хронометраж потока
Управление несколькими потоками
Хранение локальных данных потоков
Использование объекта TThread для хранения данных
Объявление threadvar: хранение локальных данных потоков
с помощью интерфейса API
Синхронизация потоков
Критические секции
Мьютексы
Семафоры
Пример многопоточного приложения
Пользовательский интерфейс
Поток поиска
Настройка приоритета
Многопоточный доступ к базе данных
Многопоточная графика
Резюме

Глава 12. Работа с файлами
Файловые операции ввода-вывода
Работа с текстовыми файлами
Работа с типизированными файлами (файлами записей)
Определение потомка класса TFileStream для выполнения операций
ввода-вывода с типизированными файлами
Использование потомка класса TFileStream для файловых
операций ввода-вывода
Ра бота с нетипизированными файлами
Структуры записей формата TTextRec и TFileRec
Работа с файлами, отображенными в память
Использование средств отображения файлов в память
Доступ к содержимому отображенных в память файлов
Создание или открытие файла
Создание объекта отображения в память
Отображение данных файла в адресное пространство процесса
Освобождение окна просмотра файла
Закрытие объекта отображения
Пример использования файла, отображенного в память
Согласованность файлов, отображенных в память
Утилита поиска в текстовых файлах
Класс TMemMapFile
Использование класса TMemMapFile
Каталоги и устройства
Получение списка доступных устройств и их типов
Получение информации об устройстве
Получение информации о размещении каталога Windows
Получение информации о размещении системного каталога
Получение имени текущего каталога
Поиск файла
Копирование и удаление дерева каталогов
Запись TSearchRec
Запись TWin32FindData
Получение информации о версии файла
Определение класса TVerInfoRes
Метод FillFileVersionInfo()
Метод FillFixedFileInfoBuf()
Метод FillFileMaskInfo()
Методы GetPreDefKeyString() и GetUserDefKeyString()
Получение номеров версий
Получение информации об операционной системе
Использование класса TVerInfoRes
Использование функции SHFileOperation()
Копирование каталога
Перемещение файлов и каталогов в корзину Windows
Резюме

Глава 13. Дополнительный инструментарий разработчика
Дополнительная обработка сообщений, поступающих в приложение
Подмена окна
Процедура окна Win32 API
Метод окна в варианте Delphi
Метод HookMainWindow()
Предотвращение запуска нескольких экземпляров приложения
Использование BASM с Delphi
Как работает BASM
Доступ к параметрам
Передача параметров по ссылке
Регистровое соглашение о вызове
Процедуры, целиком написанные на языке ассемблера
Записи
Использование ловушек Windows
Установка ловушки
Использование функции ловушки
Использование функции отмены ловушки
Создание функции SendKeys: ловушка JoumalPlayback
Определение, можно ли использовать ловушку JoumalPlayback
Как работает функция SendKeys
Создание сообщений о нажатии клавиш
Использование функции SendKeysQ
Использование OBJ-файлов C/C++
Вызов функции
Изменение имен
Разделение данных
Использование библиотеки RTL Delphi
Использование классов C++
Санкинг
Общий санкинг
Сообщение WM_COPYDATA
Получение информации о пакете
Резюме

Глава 14. Получение системной информации
Получение общей информации о системе
Форматирование строк
Получение информации о состоянии памяти
Получение информации о версии операционной системы
Получение информации о каталогах
Получение системной информации
Получение информации о среде
Обеспечение независимости от платформы
Windows 95/98: использование Тоо1Не1р32
Моментальные снимки
Обработка информации о процессах
Обработка информации о потоках
Обработка информации о модулях
Обработка информации о динамической памяти (кучах)
Просмотр данных о куче
Исходный код
Windows NT: PSAPI
Резюме

Глава 15. Переход на Delphi 5
Новое в Delphi 5
Определение версии
Модули, компоненты и пакеты
Переход с Delphi 4
Интегрированная среда разработки (IDE)
Библиотека времени выполнения (RTL)
Библиотека VCL
Разработка приложений для Internet
Работа с базами данных
Переход с Delphi 3
32-разрядные беззнаковые целые
64-разрядный целый тип
Действительный тип
Переход с Delphi 2
Изменения в булевых типах
Строковые ресурсы
Изменения в RTL
Класс TCustomForm
Метод GetChildren()
Серверы автоматизации
Переход с Delphi 1
Строки и символы
Новые символьные типы
Новые строковые типы
Установка длины строки
Динамически размещаемые строки
Индексирование строк как массивов
Строки с завершающим нулевым символом
Использование строки с завершающим нулевым символом как буфера
Использование типа PChar как String
Размер и диапазон переменных
Выравнивание записей
32-разрядная математика
Тип TDateTime
Раздел Finalization модуля
Использование языка ассемблера
Соглашения о вызовах
Библиотеки DLL
Изменения в операционной системе Windows
32-разрядное адресное пространство
32-разрядные ресурсы
Элементы управления VBX
Изменения в функциях Windows API
Параллельные 16- и 32-разрядные проекты
Резюме

Глава 16. MDI-приложения
Создание MDI-приложений
Основы MDI-технологии
Дочерняя форма
Базовый класс TMDIChildForm
Форма текстового редактора
Форма RTF-редактора
Программа просмотра растровых изображений - третья
дочерняя MDI-форма
Гл авная форма
Работа с меню
Слияние меню в MDI-приложениях
Добавление в меню списка открытых документов
Разнообразные MDI-технологии
Отображение растрового изображения в клиентском окне MDI-формы
Создание скрытых дочерних MDI-форм
Минимизация, максимизация и восстановление всех дочерних MDI-OKOH
Резюме

Глава 17. Перенос информации с помощью буфера обмена
Вначале был буфер обмена...
Использование буфера обмена для работы с текстом
Использование буфера обмена для работы с изображениями
Создание собственного формата для буфера обмена
Создание объектов, способных работать с буфером обмена
Использование пользовательского формата данных для буфера обмена
Резюме

Глава 18. Мультимедиа-программирование в Delphi
Создание простого медиаплейера
Использование WAV-файлов в приложениях
Воспроизведение видео
Показ первого кадра
Использование свойства Display
Использование свойства DisplayRect
События класса TMediaPIayer
Исходный код проекта DDGMPlay
Поддержка устройств
Создание проигрывателя музыкальных компакт-дисков
Отображение заставки
Создание проигрывателя компакт-дисков
Обновление информации проигрывателя компакт-дисков
Свойство TimeFormat
Подпрограмма преобразования значений времени
Методы обновления состояния формы проигрывателя компакт-дисков
Метод GetCDTotals()
Метод ShowCurrentTimeO
Метод ShowTrackTimeO
Исходный текст программы проигрывателя компакт-дисков
Резюме

Глава 19. Отладка и тестирование
Наиболее распространенные программные ошибки
Использование переменной класса без ее создания
Убедитесь, что экземпляры класса освобождены
Приручение "диких" указателей
Использование неинициализированных переменных типа PChar
Разыменовывание указателя со значение nil
Использование встроенного отладчика
Использование параметров командной строки
Точки останова
Условная точка останова
Точка останова по обращению к данным
Точка останова по адресу
Точка останова по загрузке модуля
Группы точек останова
Пошаговое выполнение программы
Использование окна Watch
Инспекторы отладки
Использование команд Evaluate и Modify
Доступ к стеку вызовов
Просмотр потоков
Журнал событий (Event Log)
Просмотр модулей
Отладка DLL
Окно CPU
Резюме
Предметный указатель