Прилагаемый к книге компакт-диск содержит примеры программ, разобранные в тексте книги. Примеры разбиты на четыре папки, каждая из которых соответствует одной главе. Все примеры могут быть откомпилированы в любой версии Delphi, начиная с 5-й.
Папка | Подпапка | Описание | Разделы главы |
Основы работы с Win API в VCL-приложениях | EnumWnd | Пример работы с функцией EnumWnd | 1.1.5. Функции обратного вызова. 1.1.13. Строки в Windows API. 1.2.1. Пример EnumWnd |
Line | Пример перехвата невизуальным компонентом сообщений формы-владельца | 1.1.8. Обработка сообщений с помощью VCL. 1.2.2. Пример Line |
CoordLabel | Пример перехвата визуальным компонентом сообщений родительского окна | 1.1.8. Обработка сообщений с помощью VCL. 1.2.3. Пример CoordLabel |
PanelMsg | Пример перехвата формой сообщений расположенного на нем компонента и обработки перехваченного сообщения WM_PAINT | 1.1.8. Обработка сообщений с помощью VCL. 1.1.10. Особые сообщения. 1.1.11 Графика в Windows API. 1.2.4. Пример PanelMsg |
NumBroadcast | Пример регистрации глобального сообщения, его широковещательной отправки и получения | 1.1.8. Обработка сообщений с помощью VCL. 1.1.9. Сообщения, определяемые пользователем. 1.2.5. Пример NumBroadcast |
ButtonDel | Пример удаления кнопки при ее нажатии | 1.1.8 Обработка сообщений с помощью VCL. 1.2.6 Пример ButtonDel |
GDIDraw | Пример использования графических средств GDI, не поддерживающихся классом TCanvas | 1.1.11. Графика в Windows API. 1.2.7 Пример GDIDraw |
BitmapSpeed | Программа для сравнения скорости различных операций на DDB- и DIB-растрах | 1.1.11 Графика в Windows API. 1.2.8. Пример BitmapSpeed |
Обобщающий пример 1 | ProcInfo | Программа, показывающая информацию о запущенных в системе процессах и открытых ими окнах | 1.3.1. Обобщающий пример 1 — Информация о процессах |
Обобщающий пример 2 | DKSView | Программа, регистрирующая в реестре расширение своих файлов и не допускающая запуска двух копий одновременно | 1.3.2. Обобщающий пример 2 — Ассоциированные файлы и предотвращение запуска второй копии приложения |
Обобщающий пример 3 | WndHole | Программа, демонстрирующая, как сделать окно с прямоугольным отверстием, размеры которого могут изменяться пользователем | 1.3.3. Обобщающий пример 3 — "Дырявое" окно |
Обобщающий пример 4 | Lines | Пример рисования прямых нестандартными стилями и создания "резиновой" линии | 1.3.4. Обобщающий пример 4 — Линии нестандартного стиля |
Bezier | Пример рисования кривых Безье нестандартными стилями и создания "резиновой" кривой | 1.3.4. Обобщающий пример 4 — Линии нестандартного стиля |
Папка | Описание | Разделы главы |
UDPChat | Простейший чат с использованием UDP. Прием и отправка сообщений в разных нитях через различные сокеты | 2.1.5. Протокол UDP. 2.1.8. Создание сокета. 2.1.9. Передача данных при использовании UDP. 2.1.10. Пример программы — простейший чат на UDP |
SimplestServer | Простейший TCP-сервер, реализованный в виде консольного приложения и работающий на блокирующих сокетах в одной нити. Способен взаимодействовать только с одним клиентом одновременно | 2.1.6. Протокол TCP. 2.1.8. Создание сокета. 2.1.11. Передача данных при использовании TCP. 2.1.12. Примеры передачи данных с помощью TCP |
SimpleClient | Простой TCP-клиент использующий блокирующие сокеты и работающий с одним сервером | 2.1.6. Протокол TCP. 2.1.8. Создание сокета. 2.1.11. Передача данных при использовании TCP. 2.1.12. Примеры передачи данных с помощью TCP |
MultithreadedServer | Многонитевой TCP-сервер на блокирующих сокетах, работающий с неограниченным чистом клиентов. Для каждого клиента создается отдельная нить | 2.1.5. Протокол TCP. 2.1.8. Создание сокета. 2.1.11. Передача данных при использовании TCP. 2.1.12. Примеры передачи данных с помощью TCP |
SelectChat | UDP-чат с одним сокетом и одной нитью и для приема и для отправки сообщений. Для определения момента получения данных используется функция select | 2.1.13. Определение готовности сокета. 2.1.14. Примеры использования функции select |
SelectServer | Однонитевой TCP-сервер, работающий на блокирующих сокетах и способный к взаимодействию одновременно с неограниченным числом клиентов. Для определения момента получения данных используется функция select | 2.1.13. Определение готовности сокета. 2.1.14. Примеры использования функции select |
NonBlockingServer | Однонитевой TCP-сервер, работающий на неблокирующих сокетах и способный к взаимодействию одновременно с неограниченным числом клиентов | 2.1.15. Неблокирующий режим. 2.1.16. Сервер на неблокирующих сокетах |
AsyncSelectServer | TСР-сервер, использующий оконные сообщения для взаимодействия с неограниченным числом клиентов | 2.2.5. Асинхронный режим, основанный на сообщениях. 2.2.6. Пример сервера, основанного на сообщениях |
EventSelectServer | Многонитевой TCP-сервер. Нить, устанавливающая подключения, и нити, взаимодействующие с клиентами, управляются событиями, связанными с сокетами | 2.2.7. Асинхронный режим, основанный на событиях. 2.2.8 Пример использования сокетов с событиями |
EventSelectClient | TCP-клиент, поддерживающий расширенную версию протокола обмена, реализованную в примере EventSelectServer. Использует сокеты, основанные на оконных сообщениях | 2.2.5. Асинхронный режим, основанный на сообщениях. 2.2.7. Асинхронный режим, основанный на событиях. 2.2.8. Пример использования сокетов с событиями |
OverlappedServer | TCP-сервер на основе перекрытого ввода-вывода с использованием процедур завершения | 2.2.9. Перекрытый ввод-вывод. 2.2.10. Сервер, использующий перекрытый ввод-вывод |
Папка | Подпапка | Описание | Разделы главы |
Неочевидные особенности целых чисел | Assignment1 | Пример потери значения при присваивании беззнаковой переменной отрицательного значения | 3.1.2. Выход за пределы диапазона при присваивании |
Assignment2 | Пример потери значения при присваивании переменной значения, большего, чем допускается типом | 3.1.2. Выход за пределы диапазона при присваивании |
Overflow1 | Пример перехода беззнакового значения через ноль при вычитании | 3.1.3. Переполнение при арифметических операциях |
Overflow2 | Пример невозможности контроля переполнения с помощью опции {$R+} при использовании функции Dec | 3.1.3. Переполнение при арифметических операциях |
Compare1 | Пример корректного сравнения знакового и беззнакового числа | 3.1.4. Сравнение знакового и беззнакового числа |
Compare2 | Пример некорректного сравнения знакового и беззнакового числа при использовании приведения типов | 3.1.4. Сравнение знакового и беззнакового числа |
ForRange | Пример неправильного вычисления границы диапазона цикла for при использовании беззнаковой управляющей переменной | 3.1.5. Неявное преобразование в цикле for |
Неочевидные особенности вещественных чисел | WrongValue | Пример присваивания вещественной переменной значения, отличного от заданного в программе | 3.2.6. "Неправильное" значение |
Compare1 | Пример ошибки при сравнении вещественной переменной и вещественного литерала | 3.2.7. Сравнение |
Compare2 | Пример ошибки при сравнении вещественных переменных разных типов | 3.2.8. Сравнение разных типов |
Subtraction | Пример накопления ошибки при многократном вычитании | 3.2.9. Вычитание в цикле |
Epsilon | Примет поиска машинного эпсилон (минимального числа, которое при добавлении к единице дает значение, отличное от единицы) | 3.2.12. Машинное эпсилон |
Тонкости работы со строками | Constants | Пример, позволяющий исследовать, где в различных ситуациях хранятся строковые литералы и как они присваиваются переменным | 3.3.2. Хранение строковых литералов |
PCharLit | Пример, демонстрирующий, что явное приведение строковых литералов к типу PChar в большинстве случаев бесполезно, а иногда приводит к ошибке | 3.3.3. Приведение литералов к типу PChar |
Comparisons | Пример, демонстрирующий то, как в различных ситуациях компилятор сравнивает строки | 3.3.4. Сравнение строк |
SideChange | Пример нежелательного изменения значения строковой переменной при низкоуровневом изменении значения другой строковой переменной | 3.3.5. Побочное изменение |
Zero | Пример, демонстрирующий невозможность правильного преобразования строки, содержащей символ #0 , из AnsiString в PChar | 3.3.6. Нулевой символ в середине строки |
ZeroFind | Пример неправильной работы функции AnsiPos со строками, содержащими символ #0 | 3.3.6. Нулевой символ в середине строки |
StringResult | Пример, демонстрирующий особый способ хранения результата функции, возвращающей строковое значение | 3.3.7. Функция, возвращающая AnsiString |
RecordReadWrite | Примеры, демонстрирующие правильные и неправильные способы записи типов, содержащих строки, в поток | 3.3.8. Строки в записях |
RecordCopy | Пример, демонстрирующий возникновение нежелательных эффектов при низкоуровневом копировании записей, содержащих строки | 3.3.8. Строки в записях |
Прочие подводные камни | OpOrder | Пример того, что компилятор может вычислять операнды бинарной операции в порядке, отличном от интуитивно ожидаемого | 3.4.1. Порядок вычисления операндов |
UpDownDlg | Пример зацикливания обработчика нажатия кнопки мыши компонента TUpDown из-за неоправданного захвата мыши в монопольное использование | 3.4.2. Зацикливание обработчика TUpDown.OnClick при открытии диалогового окна в обработчике |
CloseAV | Пример возникновения ошибки в перекрытом методе WndProc из-за неправильной реализации метода TCustomForm.Release | 3.4.3. Access violation при закрытии формы перекрытым методом WndProc |
ClassName | Пример, демонстрирующий где хранится имя оконного класса, возвращаемое функцией GetClassInfo , и как эта память может быть использована для других нужд раньше, чем указатель на нее покинет область видимости | 3.4.4. Подмена имени оконного класса, возвращаемого функций GetClassInfo |
ListIndex | Пример, демонстрирующий ошибку обращения к свойству TComboBox.Items.Objects при значении свойства, равном -1 | 3.4.6. Ошибка List index out of bounds при корректном значении индекса |
WrongAnchors | Пример того, что компоненты на форме располагаются не так, как предписывает свойство Anchors , если начальный размер формы во время выполнения программы не совпадает с размером, заданным при проектировании и методы борьбы с этой проблемой | 3.4.7. Неправильное поведение свойства Anchors |
MethodPtrCmp | Пример генерирования компилятором неправильного кода при сравнении указателей на методы и способ решения этой проблемы | 3.4.8. Ошибка при сравнении указателей на метод |
ParentWnd | Пример возникновения ошибки при использовании в деструкторе оконного компонента свойств, требующих существования окна | 3.4.10. Невозможность использования некоторых свойств оконного компонента |
FrameDel | Пример скрытой ошибки при использовании свойств, требующих существования окна, в деструкторе фрейма: исключение не возникает, но происходит утечка ресурсов | 3.4.10. Невозможность использования некоторых свойств оконного компонента |