О чём не пишут в книгах по Delphi
Шрифт:
Дальние земли. Здесь представлены ссылки на сайты, с которыми у Королевства установились особо дружественные отношения вплоть до проведения совместных проектов. Когда Королевство только-только появилось. существовало очень много сайтов, посвященных Delphi (буквально каждый второй программист считал необходимым создать свой сайт), и казалось, что в этом множестве сайтов действительно следует выделять особо близкие. Но в дальнейшем количество сайтов резко уменьшилось (далеко не у всех хватило сил наполнять сайт оригинальным содержанием), и смысл в особом выделения кого-то пропал. Поэтому раздел практически пустой.
Школа ОБЕРОНА. Этот раздел посвящен языку Оберон и его потомкам. Оберон на данный момент последний из разработанных Никлаусом Виртом языков, в котором заложен ряд интересных решений. В разделе Школа ОБЕРОНА собраны ссылки на ресурсы, посвященные этому языку, а также ссылки на несколько обсуждений на Базарной площади, которые имеют к нему отношение.
В Королевстве регулярно проводятся конкурсы, позволяющие выявить тех, кто лучше других отвечает на вопросы, появляющиеся на Круглом столе. В период проведения конкурса каждый зарегистрированный посетитель Королевства может проголосовать за понравившийся ему ответ, указав, на какую из возможных номинаций он его выдвигает. Голоса проверяются жюри (состоящем из членов команды Королевства) на соответствие требованиям номинации, несоответствующие отбраковываются, и составляется рейтинг отвечающих. По рейтингу определяется победитель в каждой из номинаций. Победители получают значок щита к своему нику и венок в личную страницу в Рыцарском зале. Обычно в конкурсе три номинации: "Самый фундаментальный ответ". "Самый терпеливый рыцарь" и "Хороший совет". Первая подразумевает ответы, которые не только устраняют проблему, но и детально объясняют, почему она возникает и почему решать ее следует именно так. Вторая номинация предназначена для людей, которые терпеливо объясняют что-либо, раз за разом возвращаясь к одному и тому же вопросу и дают дополнительные пояснения до тех пор, пока автор вопроса не поймет все. Под третью номинацию попадают ответы, в которых автору вопроса действительно дан полезный совет, но с обязательной
Королевство Delphi — принципиально некоммерческий проект, на котором отсутствует реклама. Поддержка и развитие сайта осуществляется исключительно за счет энтузиазма команды Королевства и его жителей, которые время от времени помогают улучшать сайт. В настоящее время сайт настолько разросся, что найти для него бесплатный хостинг стало невозможно, поэтому для оплаты хостинга собираются добровольные пожертвования. В соответствии с принципиальной позицией команды Королевства все эти пожертвования анонимны, и пожертвовавший не получает никаких преимуществ по сравнению с теми, кто не заплатил.
Автор данной книги является постоянным посетителем Королевства Delphi. В эту книгу вошел ряд статей, опубликованных автором на страницах Королевства и переработанных с учетом замечаний и пожеланий, высказанных посетителями сайта. Связаться с автором можно через его личную страницу в Рыцарском зале http://www.delphikingdom.com/asp/users.asp?ID=73.
Заметка, посвященная данной книге, находится но адресуи если вы хотите, чтобы ваш отзыв или вопрос увидел не только автор, пишите комментарий к этой заметке.
Приложение 2
Содержимое компакт-диска
Прилагаемый к книге компакт-диск содержит примеры программ, разобранные в тексте книги. Примеры разбиты на четыре папки, каждая из которых соответствует одной главе. Все примеры могут быть откомпилированы в любой версии Delphi, начиная с 5-й.
Примеры к главе 1
Примеры к первой главе находятся в папке 1 Windows API и Delphi. Содержимое папки приведено в табл. П2.1.
Таблица П2.1. Примеры к главе 1
Папка | Подпапка | Описание | Разделы главы |
---|---|---|---|
Основы работы с 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 — Линии нестандартного стиля |
Примеры к главе 2
Примеры ко второй главе находятся в папке 2 Использование сокетов в Delphi, содержимое которой приведено в табл. П2.2.
Таблица П2.2. Примеры к главе 2
Папка | Описание | Разделы главы |
---|---|---|
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. Сервер, использующий перекрытый ввод-вывод |
Примеры к главе 3
Примеры к третьей главе находятся в папке 3 Подводные камни, содержимое которой приведено в табл. П2.3.
Таблица П2.3. Примеры к главе 3
Папка | Подпапка | Описание | Разделы главы |
---|---|---|---|
Неочевидные особенности целых чисел | 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. Невозможность использования некоторых свойств оконного компонента |
Примеры к главе 4
Примеры к четвертой главе находятся в папке 4 Разбор и вычисление выражений, содержимое которой приведено в главе П2.4.
Таблица П2.4. Примеры к главе 4
Папка | Описание | Разделы главы |
---|---|---|
IsNumberSample | Пример анализа выражения на предмет соответствия синтаксису вещественного числа. Анализирует введенную пользователем строку и возвращает результат "Число" или "Не число" | 4.3. Синтаксис вещественного числа |
SimpleCalcSample | Пример простейшего калькулятора с четырьмя действиями арифметики над числами без учета приоритета операций | 4.4. Простой калькулятор |
PrecedenceCalcSample | Пример калькулятора с четырьмя действиями арифметики над числами с учетом приоритета операций | 4.5. Учет приоритета операторов |
BracketsCalcSample | Пример простейшего калькулятора с четырьмя действиями арифметики над числами с возможностью изменять приоритет операций с помощью круглых скобок | 4.6.Выражения со скобками |
FullCalcSample | Пример калькулятора, в котором поддерживаются переменные, функции и возведение в степень | 4.7. Полноценный калькулятор |
LexicalSample | Пример двухпроходного калькулятора с лексическим анализатором. Лексический анализатор дает возможность вставлять в выражение пробелы, переводы строки и комментарии | 4.8. Калькулятор с лексическим анализатором |
SinglePassSample | Пример однопроходного калькулятора с лексическим анализатором. Добавлена также поддержка функций с несколькими аргументами | 4.9. Однопроходной калькулятор и функции с несколькими переменными |
Список литературы
1. Фень Юань. Программирование графики для Windows. — СПб.: Питер, 2002.
2. Рихтер Дж. Windows. Для профессионалов. — СПб.: Питер. 2000.
3. Джонс Э., Оланд Д. Программирование в сетях Microsoft Windows. — СПб.: Питер; М.: Издательско-торговый дом "Русская редакция", 2002.
4. Вишневский П. Длинные строки и динамические массивы в Delphi // RSDN Magazine, № 3, 2004.
5. Себеста Роберт У. Основные концепции языков программирования. 5-е изд.: Пер. с англ. — М.: Издательский дом "Вильямс", 2001