Глава 1. Windows API и Delphi
13
1.1. Основы работы с Windows API в VCL-приложениях 13
1.1.1. Что такое Windows API 14
1.1.2. Как получить справку по функциям Windows API 15
1.1.3. Дескрипторы вместо классов 26
1.1.4. Формы VCL и окна Windows 27
1.1.5. Функции обратного вызова 32
1.1.6. Сообщения Windows 36
1.1.7. Создание окон средствами VCL 46
1.1.8. Обработка сообщений с помощью VCL 51
1.1.9. Сообщения, определяемые пользователем 70
1.1.10. Особые сообщения 72
1.1.11. Графика в Windows API 74
1.1.12. ANSI и Unicode 82
1.1.13. Строки в Windows API 84
1.2. Примеры использования Windows API 89
1.2.1. Пример EnumWnd 89
1.2.2. Пример Line 97
1.2.3. Пример CoordLabel 106
1.2.4. Пример PanelMsg 108
1.2.5. Пример NumBroadcast 113
1.2.6. Пример ButtonDel 117
1.2.7. Пример GDIDraw 120
1.2.8. Пример BitmapSpeed 131
1.3. Обобщающие примеры 137
1.3.1. Обобщающий пример 1 — Информация о процессах 137
1.3.1.1. Получение списка процессов 137
1.3.1.2. Получение списка и свойств окон 140
1.3.2. Обобщающий пример 2 — Ассоциированные файлы и предотвращение запуска второй копии приложения 145
1.3.2.1. Ассоциирование расширения с приложением 146
1.3.2.2. Командная строка 148
1.3.2.3. Поиск уже запущенной копии приложения 150
1.3.2.4. Перевод приложения на передний план 154
1.3.3. Обобщающий пример 3 — "Дырявое" окно 156
1.3.3.1. Сообщение WM_NCHCHITTEST 156
1.3.3.2. Регионы 158
1.3.3.3. Сообщения WM_SIZE и WM_SIZING 158
1.3.3.4. А теперь — все вместе 159
1.3.4. Обобщающий пример 4 — Линии нестандартного стиля 168
1.3.4.1. Получение координат точек прямой 168
1.3.4.2. "Резиновая" линия и растровые операции 171
1.3.4.3. Кривые Безье 173
1.3.4.4. Траектории 174
1.3.4.5. Интерактивная кривая 179
Глава 2. Использование сокетов Delphi
187
2.1. Стандартные сокеты 188
2.1.1. Соглашения об именах 189
2.1.2. Общие сведения о сокетах 190
2.1.3. Сетевые протоколы. Семиуровневая модель OSI 192
2.1.4. Стек TCP/IP 193
2.1.5. Протокол UDP 197
2.1.6. Протокол TCP 199
2.1.7. Сетевые экраны 203
2.1.8. Создание сокета 204
2.1.9. Передача данных при использовании UDP 215
2.1.10. Пример программы: простейший чат на UDP 220
2.1.11. Передача данных при использовании TCP 230
2.1.12. Примеры передачи данных с помощью TCP 237
2.1.13. Определение готовности сокета 252
2.1.14. Примеры использования функции select 260
2.1.15. Неблокирующий режим 268
2.1.16. Сервер на неблокирующих сокетах 272
2.1.17. Параметры сокета 282
2.1.18. Итоги первого раздела 285
2.2. Сокеты Windows 286
2.2.1. Версии Windows Sockets 286
2.2.2. Устаревшие функции WinSock 1 288
2.2.3. Информация о протоколе 290
2.2.4. Новые функции 294
2.2.5. Асинхронный режим, основанный на сообщениях 304
2.2.6. Пример сервера, основанного на сообщениях 312
2.2.7. Асинхронный режим, основанный на событиях 325
2.2.8. Пример использования сокетов с событиями 334
2.2.9. Перекрытый ввод-вывод 358
2.2.10. Сервер, использующий перекрытый ввод-вывод 371
2.2.11. Многоадресная рассылка 382
2.2.12. Дополнительные функции 388
2.3. Итоги главы 395
Глава 3. "Подводные камни"
397
3.1. Неочевидные особенности целых чисел 398
3.1.1. Аппаратное представление целых чисел 398
3.1.2. Выход за пределы диапазона при присваивании 401
3.1.3. Переполнение при арифметических операциях 403
3.1.4. Сравнение знакового и беззнакового числа 404
3.1.5. Неявное преобразование в цикле for 406
3.2. Неочевидные особенности вещественных чисел 407
3.2.1. Двоичные дроби 408
3.2.2. Вещественные типы Delphi 408
3.2.3. Внутренний формат вещественных чисел 411
3.2.4. "Неполноценный" Extended 412
3.2.5. Бесконечные дроби 414
3.2.6. "Неправильное" значение 415
3.2.7. Cравнение 416
3.2.8. Сравнение разных типов 417
3.2.9. Вычитание в цикле 418
3.2.10. Неожиданная потеря точности 418
3.2.11. Борьба с потерей точности в VCL 420
3.2.12. Машинное эпсилон 423
3.2.13. Методы решения проблем 424
3.3. Тонкости работы со строками 425
3.3.1. Виды строк в Delphi 425
3.3.2. Хранение строковых литералов 428
3.3.3. Приведение литералов к типу PChar 431
3.3.4. Сравнение строк 433
3.3.5. Побочное изменение 440
3.3.6. Нулевой символ в середине строки 442
3.3.7. Функция, возвращающая AnsiString 444
3.3.8. Строки в записях 445
3.3.9. Использование ShareMem 455
3.4. Прочие "подводные камни" 461
3.4.1. Порядок вычисления операндов 461
3.4.2. Зацикливание обработчика TUpDown.OnClick при открытии диалогового окна в обработчике 464
3.4.3. Access violation при закрытии формы с перекрытым методом WndProc 466
3.4.4. Подмена имени оконного класса, возвращаемого функцией GetClassInfo 471
3.4.5. Ошибка EReadError при использовании вещественных свойств 473
3.4.6. Ошибка List index out of bounds при корректном значении индекса 474
3.4.7. Неправильное поведение свойства Anchors 476
3.4.8. Ошибка при сравнении указателей на метод 478
3.4.9. Возможность получения адреса свойства 480
3.4.10. Невозможность использования некоторых свойств оконного компонента в деструкторе 481
Глава 4. Разбор и вычисление выражений
489
4.1. Синтаксис и семантика 489
4.2. Формальное описание синтаксиса 492
4.3. Синтаксис вещественного числа 495
4.4. Простой калькулятор 498
4.5. Учет приоритета операторов 504
4.6. Выражения со скобками 506
4.7. Полноценный калькулятор 511
4.8. Калькулятор с лексическим анализатором 517
4.9. Однопроходный калькулятор и функции с несколькими переменными 529
4.10. Еще немного теории 534
Приложения
539
Приложение 1. Сайт "Королевство Delphi" 541
Приложение 2. Содержимое компакт-диска 549
Примеры к главе 1 549
Примеры к главе 2 550
Примеры к главе 3 552
Примеры к главе 4 555
Список литературы 557
Предметный указатель 559