$ExtendedSyntax — Директива компилятора Delphi


Содержание

Директивы компилятора — Версии Delphi

У меня есть блок, который я написал в Delphi 7 некоторое время назад, и просто получил удовольствие (боль) от преобразования в Delphi XE (Unicode).

Устройства работают отлично после некоторых проблем, теперь я пытаюсь сделать этот модуль совместимым с разными версиями Delphi, если мне когда-либо понадобится переключить IDE обратно в Delphi 7, обновляя какой-то другой код.

У меня только Delphi 7 и Delphi XE, но из того, что я собираю, код, написанный в Delphi 1, Delphi 2007 будет компилироваться, но код из Delphi 2009 и выше будет Unicode.

. В любом случае, в модуле я разделяю un-unicode и unicode так:

Как изменить директиву компилятора, чтобы правила применялись к нескольким версиям? Например, что-то вроде:

Затем это будет охватывать все версии Delphi, если я буду распространять источник или блок .dcu.

Интересно, является ли самый простой подход в этом случае переключать поведение на UNICODE условном. Это условие определено тогда и только тогда, когда вы используете Unicode-версию Delphi, то есть в Delphi 2009 и более поздних версиях. Большим преимуществом этого является то, что это будущее доказательство — вам не нужно обновлять свой код каждый раз, когда выпускается новый Delphi. Более того, условный переключатель будет гораздо читабельнее, поскольку он четко выражает намерение.

В документации Delphi есть отличная тема, в которой перечислены все заранее определенные условные обозначения. Полный список условных обозначений версий также связан.

РАБОТА С КОМПИЛЯТОРОМ BPС(TPC) ЧЕРЕЗ ПРИЛОЖЕНИЕ DELPHI

РАБОТА С КОМПИЛЯТОРОМ BPС(TPC) ЧЕРЕЗ ПРИЛОЖЕНИЕ DELPHI

Автор : Andretti (e-mail:»Drunex@narod.ru», ICQ:569575751)

Бывает что существует необходимость какой-либо сгененрированные (набранный) код Pascal программы скомпилировать и проверить на работоспособность. Но сделать мы хотим это, в автоматизированном режиме и используя программы которые написали например на Delphi. Здесь я опишу ОБЩУЮ ИДЕЮ как например код набранный в окне приложения написанного на Delphi 7 передать компилятору Borland Pascal (можно Turbo Pascal или д.р.), получить информацию о его компиляции в нашем приложении и протестировать на работоспособность кода используя входные и выходные данные записанные в соответствующих файлах(либо через задание входных данных через параметры запуска программы), ПРИ ЖЕЛАНИИ ВЫ МОЖЕТЕ ЗНАЧИТЕЛЬНО УМЕНЬШИТЬ КОЛИЧЕСТВО ПЕРЕХОДОВ И ДЛИНУ КОДА ИСПОЛЬЗУЯ СТАНДАРТНЫЕ ПРОЦЕДУРЫ.

Для начала не забываем что нам потребуется рабочий bp7.0 и компилятор bpc который необходимо скачать отдельно и запихнуть в папку bin.

Создадим новое приложение в Delphi 7 (File>New>Application). На форму разместим следующие компоненты:
-Memo1 -для ввода кода Pascal-программы
-Memo2 -для отображения ответа компилятора
-Memo3 -для ввода входных данных (файл input.txt)
-Memo4 -для отображения выходных данных которые выдаст программа (файл output.txt)
-Button1 — для запуска компиляции Pascal-программы
-Button2 — для запуска программы и обработки ею входных данных из файла input.txt которые мы ввели в memo3

Далее представлен полный код рабочей программы по примеру работы с компилятором bpc:

При запуске процесса компилятора в качестве параметра указан параметр -b т.е. компиляция всех указанных файлов, так же существуют и другие параметры которые приведены ниже :

Компилятор командной строки позволяет вам вызывать все функции компилятора IDE из командной строки DOS (она же командная строка cmd.exe в Windows).
Компилятор командной строки использует следующий синтаксис

TPC [опции] [опции]
BPC [опции] [опции]

Где в качестве [опций] могут быть одна или большее
количество опций, разделенных пробелами.

¦ Поместите + (или пробел) после опции, чтобы включить ее.
¦ Поместите — после опции, чтобы выключить ее.
Опции директив компилятора

/$A Выравнивание данных (Align Data)
/$B Булева оценка (Boolean Evaluation)
/$D Отладочная информация (Debug Information)
/$F Дальний тип вызова (Force FAR Calls)
/$G Генерировать 286 команды (Generate 286 Instruction)
/$I Проверка ввода/вывода (Input/Output Checking)
/$L Информация о локальных символах (Local Symbol Information)
/$N 80×87 коды (FPU сопроцессор) (80×87 Code (Numeric coprocessor))
/$R Проверка диапазона (Range Checking)
/$S Проверка переполнения стека (Stack-Overflow Checking)
/$T Типизированный @ указатель (Typed @ Pointer)
/$V Проверка строковых переменных (String Var Checking)
/$W Запись активации Windows (Windows Stack Frame)
/$X Расширенный синтаксис (Extended Syntax)
Опции режима компилятора

/B Компилировать все (Build All)
/F Найти ошибку (Find Error)
/L Буфер компоновщика (Link Buffer)
/M Создать (Make)
/Q Тихий (нет эквивалента в IDE) (Quiet)
Опция условного выражения

/D Условные выражения (Conditional Defines)
Опции отладки

/G .Map файл
/V Включить отладочную информация в EXE файл
Опции Каталога

/E Каталог для EXE и TPU
/I Каталог включений (include)
/O Каталог объектных файлов
/R Каталог ресурсов
/T Каталог Turbo Pascal
/U Каталог модулей (unit)

Большинство опций командной строки имеет эквивалентные команды меню.

Структура папок для указанного примера должна быть следующая :

$ExtendedSyntax — Директива компилятора Delphi

Содержание раздела PASCAL

Введение. Общая характеристика языка. 1 Основы языка PASCAL 2 Структура программы 2.1 Раздел объявлений и соглашений, основнй блок 2.2 Типы переменных 3 Операторы языка PASCAL 4 Простые и структурные типы данных 5 Процедуры и функции 6 Динамическая память 7 Модули 8 Ключи и директивы компилятора 9 Файлы 10 Другие возможности Турбо-Паскаля 1 0 .1 Оверлей 10. 2 Прямое обращение к памяти и портам 11 Турбо-Паскаль 6.0 и структурное программирование 12 ТурбоПаскаль и ООП 13 Объектно-ориентированная библиотека Turbo Vision 14 Встроенная справочная система

Позволяют управлять процессами компиляции программы. Директива представляет собой комментарий со специальным синтаксисом: начинается с <$, далее пишется имя директивы (одна или несколько букв) и параметры.

Турбо-Паскаль 7.0 допускает применение директив в любом месте программы, где допускается применение комментариев.

В Турбо-Паскале 7.0 существует три основных вида директив:

Директивы — переключатели. С их помощью, указывая символ (+) или (-), можно разрешать или запрещать тот или иной режим.

Директивы с параметрами. Позволяют задавать компилятору параметры, такие как имена подключаемых файлов, размеры памяти, выделяемые под определённую задачу, и так далее.

Условные директивы. Позволяют организовывать так называемую «условную компиляцию» частей исходного текста, благодаря чему скомпоновать программу определённым образом.

Все директивы, кроме директив-переключателей, должны иметь по крайней мере один пробел между именем директивы и параметром.

Чтобы не прописывать директивы компилятора в тексте программы можно воспользоваться пунктом «Options» меню ИПО и далее подпунктом «Compiler». Но при этом все изменения будут иметь силу при всех последующих компиляциях других программ. Однако, если указать в исходном тексте какие-либо директивы, противоречащие установленным в ИПО, то последние будут проигнорированы. Это справедливо как для командно-строчного компилятора, так и для встроенного в ИПО.

Различаются по диапазону своего действия на глобальные и локальные:
• Глобальные — влияют на ход компиляции и выполнение всей программы,
• локальные — только на определённую часть программы.

Глобальные директивы могут быть объявлены в разделе объявлений и соглашений прежде, чем будет использовано хотя бы одно из следующих зарезервированных слов: Uses, Label, Const, Type, Procedure, Function, Begin, а Локальные директивы могут быть объявлены в любом месте программы или программного модуля.

При необходимости можно сгруппировать комментарии из нескольких директив, разделённых запятой: <$A+, B->.
Примечание: двойное нажатие комбинации Ctrl+O заставит редактор поместить в самое начало файла строки, содержащие текущую настройку среды в виде директив компилятора.

Директивы:
Выравнивание данных — (Word Align Data)
<$A+>
Тип глобальный. Делает возможным переключение между выравниванием на границу слова или байта. (Для 8086 выравнивание на границу слова игнорируется, однако для 80X86 выравнивание на границу слова означает более быстрое выполнение, поскольку адресация по всем элементам, имеющим размер в слово (чётная адресация) происходит за один цикл вместо двух. <$A+>не влияет:
1. на переменные размером в байт,
2. на поля структур или элементы массивов.

Булевы вычисления (Complete Boolean Evaluation)
<$B+>
Тип локальный Может быть осуществлено два различных вида генерации кода для And и Or .При <$B->генерируется код вычисления выражения, по короткой схеме (вычисления прекращаются сразу, как станет очевидным результат вычисления всего выражения).

Пример:
Function Fun(X: Integer): Boolean;
Begin
X:= X + 1;
Fun:= X > 10;
End;
. . . . . . . . . . .
Begin
X:= 0;
If False And Fun(X) Then
X:= 10;

Информация для отладки (Debug Information)
<$D+>
Тип глобальный. Составляется таблица для отладчика, состоящая из N-строк для каждой процедуры, устанавливающая соответствующие адреса объектных кодов номерам строк исходного текста.
Отладочная информация приводит к увеличению размера файла .TPU и требует дополнительного пространства при компиляции использующей модуль программы, но на размер и скорость не влияет.
$D не будет работать в Турбо-Паскале 7.0 до тех пор пока не установить в меню или не задать параметр /V при запуске TPC.EXE.

Эмуляция сопроцессора. (Emulation).
<$E+>
Тип глобальный. В процессе генерации кода нет библиотеки, реализующей функции сопроцессора программы.

Дальний тип вызова (Force Far Calls).
<$F->
Тип локальный, (Far) или (Near).

Генерация кода для 80286 (286 Instruction).
<$G->
Тип локальный. При <$G->генерируются инструкции 8086, такие программы могут работать на любой машине. Если <$G+>, то будут использоваться дополнительные инструкции 80286, которые позволяют генерировать более эффективный код, но не работают на 8086 и 8087. (Например команды Shr и Shl — расширенные).

Проверка ошибок ввода-вывода (I/O checking).
<$I+>
Тип локальный. Если <$I->, то результат ввода-вывода может быть проанализирован с помощью функции IOResult.

Информация о локальных идентификаторах. (Local Symbols)
<$L+>
Тип глобальный. Используется в основном для модулей, дает возможность проверить и модифицировать локальные переменные модуля. Увеличивает размер .TPU, на размер и скорость работы выполняемой программы не влияет. В Турбо-Паскале 7.0 директива не будет работать до тех пор, пока в меню не будет Debuginfo или для TPC.EXE ключ /V.

Использование математического сопроцессора (8087/80287).
<$N->
Тип глобальный. Позволяет осуществлять выбор генерируемых кодов для вычислений с плавающей запятой при “-“ реализуется программно, при ”+” — код для сопроцессора.
Примечание: если отсутствует сопроцессор и возникла необходимость в использовании специальных вещественных типов, нужно использовать <$E+>.

Использование оверлейных структур. (Overlays allowed).
<$O->
Тип глобальный. Разрешает или запрещает генерацию оверлейного кода, то есть Турбо-Паскаль 7.0 может использовать модуль в качестве оверлейного, если он был скомпилирован с <$O+>. Задание данного режима компиляции не обязывает использовать данный модуль в качестве оверлейного. Директиву <$O+>почти всегда используют с <$F+>.

Использование в качестве параметров массивов открытого типа (Open parameters).
<$P->
Тип глобальный.

Проверка переполнения при математических операциях (Overflow checking).
<$Q->
Тип глобальный.

Проверка границ. (Range-Checking).
<$R->
Тип локальный. Рекомендуется использовать R+ при отладке, а затем отключать так как “+” увеличивает размер и замедляет работу программ. R+ осуществляет так же проверку виртуальных методов на состояние инициализации для экземпляра объекта, выполняющего вызов.

Проверка переполнения стека (Stack Checking)
<$S+>
Тип локальный. При “+” компилятор генерирует вначале каждой процедуры или функции код, который проверяет, достаточно ли в стеке выделено места для локальных переменных.

Использование типизированного адресного оператора @ (Typed @ operator).
<$T->
Тип глобальный. Позволяет или запрещает использовать в тексте оператор @.

Проверка параметров переменных строкового типа (Strict Var String).
<$V+>
Тип локальный. Управляет проверкой типа при передачи строк в качестве параметров-переменных. В состоянии “+” выполняется строгая проверка типа. Требуется, чтобы формальный и фактический параметр имели идентичные строковые типы; при “-” длины могут не совпадать.

Расширенный синтаксис. (Extended Syntax).
<$X->
Тип глобальный. При X+ вызов функции можно использовать как оператор, то есть результат функции может быть отброшен (функция может быть интерпретирована как процедура).

Включение файла для компиляции (Include Directories).
<$I >
Тип локальный. Сообщает компилятору о необходимости включить в компиляцию названный файл. Текст файла вставляется сразу за директивой. Расширение по умолчанию .PAS. Турбо-Паскаль допускает одновременно не более 15 входных файлов. Значит допускается вложенность до 15-ти уровней. Так же включаемый файл не может указываться в середине раздела операторов. Это означает, что все операторы между Begin и End раздела операторов должны быть в одном файле.

Компоновка объектного файла. (Object Directories).
<$L >
Тип локальный. Предписывает компилятору использовать указанный файл (.Obj) при компоновке компилируемой программы или модуля.
Директива <$L>используется для компоновки кода Ассемблера для подпрограмм, описанных External.

Размеры выделяемой памяти (Memory Sizes).
<$M , >.
Тип глобальный. Размер-стека — целое число от 1024 до 65520. Для модуля размер- стека игнорируется (модуль использует стек основной программы). Размер динамической области — целое число от 0 до 65360. Директива <$M>при использовании в Unit не оказывает влияния на компиляцию.

Компоновка оверлейного модуля.
<$O >
Тип локальный. Можно преобразовать обычный модуль в оверлейный. Игнорируется при попытке объявить её в теле какого-либо модуля. Директива должна указываться в тексте программы после слова Uses. Любой модуль, который указывается в качестве параметра, должен быть откомпилирован с директивами <$O+>и <$F+>.

Установить условие (Conditional Defines).
<$ Define >
Определяет условия, которые можно использовать в операторах условной компиляции.
Установить условие — значит с помощью данной директивы ввести некоторое слово, которое затем будет управлять компиляцией какого- либо фрагмента программы. За условием не должно следовать ничего кроме >.

Можно ввести несколько условий одновременно, причём условия должны отделяться друг от друга точкой с запятой (в меню).
Допускается использование развёрнутой формы операторов условной компиляции.

Операторы условной компиляции могут быть вложенными, что позволяет контролировать несколько условий одновременно.

Управление проектом в Delphi

  1. Проект Delphi
  2. Пункт меню “File”
  3. Управление проектом
  4. Обзор других пунктов меню
  5. Edit
  6. Search
  7. View
  8. Compile
  9. Пункт меню Options | Project
  10. Forms
  11. Applications
  12. Compiler
  13. Linker
  14. Directories/Conditionals
  15. Конфигурация среды программирования

Обзор

В данной лекции рассказывается как:

  • Добавлять и удалять формы и модули в проект
  • Управлять окнами на рабочем пространстве
  • Создавать выполняемый файл для Windows
  • Тонко настроить среду программирования

Проект Delphi

Любой проект имеет, по-крайней мере, шесть файлов, связанных с ним. Три из них относятся к управлению проектом из среды и напрямую программистом не меняются. Вот эти файлы :

  • Главный файл проекта, изначально называется PROJECT1.DPR.
  • Первый модуль программы /unit/ , который автоматически появляется в начале работы. Файл называется UNIT1.PAS по умолчанию, но его можно назвать любым другим именем, вроде MAIN.PAS.
  • Файл главной формы, который по умолчанию называется UNIT1.DFM, используется для сохранения информации о внешнем виде главной формы.
  • Файл PROJECT1.RES содержит иконку для проекта, создается автоматически.
  • Файл, который называется PROJECT1.OPT по умолчанию, является текстовым файлом для сохранения установок, связанных с данным проектом. Например, установленные Вами директивы компилятора сохраняются здесь.
  • Файл PROJECT1.DSK содержит информацию о состоянии рабочего пространства.

Разумеется, если сохранить проект под другим именем, то изменят название и файлы с расширением RES, OPT и DSK.

После компиляции программы получаются файлы с расширениями:

DCU — скомпилированные модули

EXE — исполняемый файл

DSM — служебный файл для запуска программы в среде, очень большой, рекомендуется стирать его при окончании работы.

DP — backup файлы Редактора.

Пункт меню “File”

Если нужно сохранить проект, то Вы выбираете пункт главного меню “File” (с помощью мышки или по клавише Alt+F). Пункт меню “File” выглядит следующим образом:

Save Project As

Как Вы можете видеть, здесь есть шесть секций; вот их назначение:

  • Первая секция дает возможность управления проектом вцелом .
  • Вторая секция дает контроль над формами, модулями и компонентами проекта.
  • Третья позволяет добавлять и удалять файлы из проекта.
  • Четвертая управляет печатью.
  • Пятая секция — выход из Delphi
  • Шестая секция предоставляет список ранее редактировавшихся проектов ; Вы можете быстро открыть нужный.

Как Вы увидите позже, большинство операций из пункта меню “File” можно выполнить с помощью Менеджера Проекта ( Project Manager ), который можно вызвать из пункта меню View. Некоторые операции доступны и через SpeedBar. Данная стратегия типична для Delphi: она предоставляет несколько путей для решения одной и той же задачи, Вы сами можете решать, какой из них более эффективен в данной ситуации.

Каждая строка пункта меню “File” объяснена в Справочнике. Выберите меню “File” и нажмите F1 , появится экран справочника, как на рис.1.

Рис.1: Delphi включает подсказку, как использовать пункт меню “File”.

Большинство из пунктов первой секции очевидны. “New Project” начинает новый проект, “ Open Project” открывает существующий проект и т.д.

Первые два пункта второй секции позволяют Вам создать новую форму или новый модуль. Выбирая “New Form”, Вы создаете новую форму и модуль, связанный с ней; выбирая “New Unit”, Вы создаете один модуль.

“New Component” вызывает диалог для построения заготовки нового визуального компонента. В результате создается модуль, который можно скомпилировать и включить в Палитру Компонент.

“Open File” открывает при необходимости любой модуль или просто текстовый файл. Если модуль описывает форму, то эта форма тоже появится на экране.

При создании нового модуля Delphi дает ему имя по-умолчанию. Вы можете изменить это имя на что-нибудь более осмысленное (например, MAIN.PAS ) с помощью пункта “Save File As“.

“Save File” сохраняет только редактируемый файл, но не весь проект.

“Close File” удаляет файл из окна Редактора.

Нужно обратить внимание: Вы должны регулярно сохранять проект через File | Save Project либо через нажатие Ctrl+S.

Управление проектом

Теперь, когда Вы знаете о создании проекта с помощью пункта меню “File”, перейдем к Менеджеру Проектов, который помогает управлять проектом. Менеджер Проектов, рис.3, разделен на две части. Верхняя — панель с управляющими кнопками. Нижняя — список модулей, входящих в проект.

Рис.3: Кнопки сверху используются для удаления и добавления модулей в проект.

Вы можете использовать кнопки с плюсом и минусом для добавления и удаления файлов в проекте. Эти изменения влияют на файлы с исходным текстом, то есть, если добавить в проект модуль, то ссылка на него появится в файле с расширением DPR.

Краткое описание других кнопок :

  • Третья слева кнопка — просмотр текста модуля, на котором стоит курсор.
  • Четвертая — просмотр формы, если есть таковая для данного модуля
  • Пятая — вызов диалога настройки проекта, сам диалог будет рассмотрен позже.
  • Последняя — сохранение изменений на диске.

Обзор других пунктов меню

Пункт меню “File” обсуждался ранее. Далее рассматриваются другие важные пункты — “Edit”, “Search”, “View” и “Compile”, но менее подробно. Далее, снова подробно, рассказывается о “Options”.

    Пункт меню “Edit”

“Edit” содержит команды “Undo” и “Redo”, которые могут быть очень полезны при работе в редакторе для устранения последствий при неправильных действиях, например, если случайно удален нужный фрагмент текста.

Отметьте для себя, что Справочник ( on-line help) объясняет как нужно использовать пункт меню Options | Environment для настройки команды “ U ndo”. Возможность ограничить возможное количество команд “Undo” может пригодиться, если Вы работаете на машине с ограниченными ресурсами.

Команды “Cut”, “Copy”, “Paste” и “Delete” — как во всех остальных приложениях Windows, но их можно применять не только к тексту, но и к визуальным компонентам.

“Bring To Front”, “Send To Back”, “Align” и “Size” обсуждались в Уроке № 2. Оставшиеся четыре пункта помогают быстро “приукрасить” внешний вид формы.
Пункт меню “Menu”

В “Search” есть команда “Find Error” (поиск ошибки), которая поможет отследить ошибку периода выполнения программы. Когда в сообщении об ошибке указан ее адрес, Вы можете выбрать пункт меню Search | Find Error и ввести этот адрес. Если это представится возможным, то среда переместит Вас в то место программы, где произошла ошибка.

  • Пункт меню “View”
  • Составляющие пункта меню “View”:

    • Project Manager (Менеджер Проекта).
    • Project Source — загружает главный файл проекта (DPR) в Редактор
    • Установка, показывать или нет Object Inspector на экране.
    • Установка, показывать или нет Alignment Palette. То же самое доступно из пункт меню Edit | Align.
    • Browser — вызов средства для просмотра иерархии объектов программы, поиска идентификатора в исходных текстах и т.п.
    • Watch, Breakpoint и Call Stack — связаны с процедурой отладки программы и будут обсуждаться позднее.
    • Component List — список компонент, альтернатива Палитре Компонент. Используется для поиска компонента по имени или при отсутствии мыши.
    • Window List — список окон, открытых в среде Delphi.
    • Toggle Form/Unit, Units, Forms — переключение между формой и соответствующим модулем, выбор модуля или формы из списка.
    • New Edit Window — открывает дополнительное окно Редактора. Полезно, если нужно, например, просмотреть две разных версии одного файла.
    • SpeedBar и Component Palette — установки, нужно ли их отображать.
    1. Пункт меню “Compile”

      В пункте меню “Compile” проект можно скомпилировать ( compile ) или перестроить (build) . Если выбрать Compile или Run , то Delphi перекомпилирует только те модули, которые изменились со времени последней компиляции. Build all , с другой стороны, перекомпилирует все модули, исходные тексты которых доступны. Команда Syntax Check только проверяет правильность кода программы, но не обновляет DCU файлы.

      В самом низу — пункт Information, который выдает информацию о программе : размеры сегментов кода, данных и стека, размер локальной динамической памяти и количество скомпилированных строк.

    2. Пункт меню “Run”

    Можно использовать “Run” для компиляции и запуска программы и для указания параметров командной строки для передачи в программу. Здесь же имеются опции для режима отладки.

    Пункт меню Options | Project

    “Options” наиболее сложная часть системного меню. Это центр управления, из которого вы можете изменять установки для проекта и для всей рабочей среды Delphi . В “ Options ” есть семь пунктов :

    Первые четыре пункта вызывают диалоговые окна. Ниже приведено общее описание пункта меню “Options”:

    • Project — выбор установок, которые напрямую влияют на текущий проект, это могут быть, к примеру, директивы компилятора проверки стека (stack checking ) или диапазона (range checking).
    • Environment — конфигурация самой среды программирования (IDE). Например, здесь можно изменить цвета, используемые в Редакторе.
    • Tools — позволяет добавить или удалить вызов внешних программ в пункт главного меню “Tools”. Например, если Вы часто пользуетесь каким-нибудь редактором или отладчиком, то здесь его вызов можно добавить в меню.
    • Gallery — позволяет определить специфические установки для Эксперта Форм и Эксперта Проектов и их “заготовок”. Эксперты и “заготовки” предоставляют путь для ускорения конструирования интерфейса программы.
    • Последние три пункта позволяют сконфигурировать Палитру Компонент.

    Диалог из пункта Options | Project включает пять страниц :

    • На странице Forms перечислены все формы, включенные в проект; Вы можете указать, нужно ли автоматически создавать форму при старте программы или Вы ее создадите сами.
    • На странице Application Вы определяете элементы программы такие, как заголовок, файл помощи и иконка.
    • Страница Compiler включает установки для генерации кода, управления обработкой ошибок времени выполнения, синтаксиса, отладки и др.
    • На странице Linker можно определить условия для процесса линковки приложения
    • Страница Directories/Conditionals — здесь указываются директории, специфичные для данного проекта.

    После предыдущего абзаца с общим описанием, каждая страница описана детально в отдельной главе.

    Все установки для проекта сохраняются в текстовом файле с расширением OPT и Вы можете вручную их исправить.

    Страница Forms

    На странице Forms можно выбрать главную форму проекта. Изменения, которые Вы сделаете, отобразятся в соответствующем файле DPR. Например, в нижеследующем проекте, Form1 является главной, поскольку появляется первой в главном блоке программы:

    $ExtendedSyntax — Директива компилятора Delphi

    Добавление скобок при вызове процедур и функций без параметров уже давно не является новинкой в Delphi, тем не менее, эта возможность мало известна. Эту возможность оценят по достоинству те программисты, которым приходится работать на двух языках (C++ и Delphi), так как им не нужно будет постоянно помнить о разнице в синтаксисе при вызове процедур и функций в разных языках. В Delphi оба варианта, приведенные ниже, считаются корректными.

    Впервые концепция перегрузки процедур и функций была реализована в Delphi4. Она позволяет иметь несколько различных процедур и функций с одинаковыми именами, но с разными списками параметров. Такие процедуры и функции должны быть описаны с применением директивы overload .

    При вызове процедуры Test, Delphi сама решит, какую из трех процедур необходимо выполнить, в зависимости от передаваемого ей параметра. Но нужно отметить, что это не самая безопасная возможность языка. Применение перегружаемых процедур и функций может стать неиссякаемым источником трудноуловимых ошибок в программе. Поэтому пользуйтесь этой возможностью осторожно.

    Pascal позволяет передавать параметры в функции и процедуры либо по значению, либо по ссылке. Передаваемый параметр может иметь любой встроенный или пользовательский тип либо являться открытым массивом. Параметр также может быть константой, если его значение в процедуре или функции не меняется.

    Этот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. Посмотрите на следующий пример:

    При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.

    Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно).

    Pascal позволяет также передавать параметры в функции или процедуры по ссылке — такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var , помещаемое в список параметров вызываемой процедуры или функции.

    Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение.

    Если нет необходимости изменять передаваемые функции или процедуре данные, можно описать параметр как константу. Ключевое слово const не только защищает параметр от изменения, но и позволяет компилятору сгенерировать более оптимальный код передачи строк и записей. Вот пример объявления параметра-константы:

    Открытый массив параметров позволяет передавать в функцию или процедуру различное количество параметров. В качестве параметров можно передать либо открытый массив элементов одинакового типа, либо массивы констант различного типа. В приведенном ниже примере объявляется функция, которой в качестве параметра должен передаваться открытый массив целых чисел.

    В открытом массиве можно передавать переменные, константы или выражения из констант. Ниже приведен пример, который демонстрирует вызов функции AddEmUp с передачей ей нескольких различных элементов.

    Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf. Для иллюстрации их использования ниже приведен текст функции AddEmUp, которая возвращает сумму всех переданных ей элементов массива A.

    Object Pascal также поддерживает тип array of const , который позволяет передавать в одном массиве данные различных типов. Синтаксис объявления функций или процедур, использующих такой массив для получения параметров, следующий:

    Вызвать объявленную выше функцию можно, например, с помощью такого оператора:

    При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:

    Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно из ниже приведенных значений.

    Поскольку массив констант способен передавать данные разных типов, это может вызвать определенные затруднения при создании обрабатывающей полученные параметры функции или процедуры. В качестве примера работы с таким массивом рассмотрим реализацию процедуры WhatHaveIGot, которая просматривает элементы полученного массива параметров и выводит их тип.

    В Delphi есть одна очень полезная возможность — использование значений параметров по умолчанию. Она позволяет установить принимаемое по умолчанию значение параметра процедуры или функции. Это значение будет использоваться в тех случаях, когда вызов процедуры или функции производится без указания значения данного параметра. В объявлении процедуры или функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере:

    Подобное объявление означает, что процедура HasDefVal может быть вызвана двумя путями. В первом случае — как обычно, с указанием обоих параметров:

    Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию:

    При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах.

    • Параметры, имеющие значения по умолчанию, должны располагаться в конце списка параметров. Параметр без значения по умолчанию не должен встречаться в списке после параметра, имеющего значение по умолчанию.
    • Значения по умолчанию могут присваиваться только параметрам обычных типов, указателям или множествам.
    • Значение по умолчанию может передаваться только по значению либо с модификатором const . Оно не может быть ссылкой или нетипизированным параметром.

    Одним из важных преимуществ применения значений параметров по умолчанию является простота расширения функциональных возможностей уже имеющихся процедур и функции с соблюдением обратной совместимости. Предположим, на рынок программных продуктов была выпущена программа, ключевым звеном которой является функция сложения двух целых величин:

    Предположим также, что исследования показали целесообразность добавления в программу возможности сложения трех чисел. Однако замена имеющейся функции функцией сложения трех чисел приведет к тому, что вам придется переправлять немало текста, который перестанет компилироваться из-за внесения в функцию еще одного параметра. Однако при использовании значений параметров по умолчанию проблема решается легко и просто. Достаточно изменить объявление функции так, как показано ниже.

    Директива <$X->запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен ( <$X+>). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора <$X->.

    В каждой функции языка Objecl Pascal существует локальная переменная с именем Result, предназначенная для размещения возвращаемого значения. Кроме того, вернуть значение из функции можно также путем присвоения значения переменной, имеющей то же имя, что и данная функция. Это стандартный синтаксис языка Pascal, сохранившийся от его предыдущих версий. При использовании в теле функции переменной с ее именем не забывайте, что существуют большие отличия в обработке этого имени — все зависит от того, где она расположена — в левой части оператора присвоения или же в любом другом месте текста функции. Если имя функции указано в левой части оператора присвоения, то предполагается, что назначается возвращаемое функцией значение. Во всех других случаях предполагается, что осуществляется рекурсивный вызов этой функции.

    Вот и все, что я хотел рассказать вам сегодня. Процедура и функция — это ключевые понятия в любом языке программирования, без которых не обходится ни одна серьезная программа. И поэтому очень важно иметь полное понимание о механизме их работы, это является еще одним шагом на пути к профессионализму. Надеюсь, данная статья оказалась для вас хоть немного полезной. Удачи в программировании.

    Delphi. Условная компиляция. Краткий справочник

    Условная компиляция предназначена для управления компиляцией программного кода. В Delphi имеется несколько способов её реализации, но в основном используются только четыре.

    В этой реализации условная директива <$IFDEF …>проверяет, был ли определён указанный в ней символ условной компиляции. Если да, то код программы между директивами <$IFDEF …>и <$ENDIF>компилируется. В противном случае, код между этими двумя директивами компилироваться не будет.

    Эта реализация отличается от предыдущей наличием директивы <$ELSE>. В этом случае, если условный оператор определён, будет компилироваться код программы между директивами <$IFDEF>и <$ELSE>. В противном случае, будет компилироваться код программы между директивами <$ELSE>и <$ENDIF>.

    По сути, первая и вторая реализации ведут себя как краткая и полная форма обычного условного оператора if.

    Как определить символ условной компиляции? Для этого также существует два способа.

    Первый – использование директивы

    Второй способ. Определить его в свойствах проекта. Для этого в меню Project нужно выбрать пункт Options и в поле Conditional defines ввести символ условной компиляции.

    Третий и четвёртый способы являются аналогией первого и второго соответственно. Отличие в том, что используется условная директива <$IFNDEF>. Эта директива проверяет, что указанный символ не определён. То есть, является прямой противоположностью директивы <$IFDEF>.

    В случае <$IFNDEF>, код между этой директивой и <$ENDIF>либо <$ELSE>будет скомпилирован, только если указанный в ней символ условной компиляции не определён. В остальном, принцип реализации аналогичен приведённому для директивы <$IFDEF>:

    В Delphi уже имеется ряд символов условной компиляции. Вот их «классический» набор.

    Значение
    MSWINDOWS Код компилируется только в ОС Windows
    WIN32 То же самое, только код компилируется лишь для 32-разядной ОС.
    LINUX Был введён в Delphi 6 вместе с MSWINDOWS для определения платформы, для которой необходимо компилировать тот или иной код.Так как компиляция для Linux в Delphi до сих пор отсутствует, то использование этого символа в программах не имеет смысла.
    CONSOLE Консольное приложение
    CPU386 Компиляция для процессоров типа i386 или более современных. Так как речь идёт о процессорах типа i386, использование данного символа уже давно потеряло актуальность.
    CONDITIONAL EXPRESSIONS Проверяет использование директив $IF

    Также в число «классических» входит и символ VERxxx, который указывает конкретную версию компилятора. По сути, это целое семейство символов условной компиляции, в которое с выходом новой версии Delphi добавляется новый символ соответствующий этой версии. Ниже представлена таблица соответствия версий Delphi символам условной компиляции VERxxx (материал взят с Исходники.ру).

    Символ условной компиляции
    1 VER80
    2 VER90
    3 VER100
    4 VER120
    5 VER130
    6 VER140
    7 VER150
    8 VER160
    2005 VER170
    2006 VER180
    2007* VER180 или VER185
    2009 VER200
    2010 VER210
    XE VER220
    XE2 VER230
    XE3 VER240
    XE4 VER250
    XE5 VER260
    XE6 VER270
    XE7 VER280
    XE8 VER290
    10 Seatle VER300
    10.1 Berlin VER310
    10.2 Tokyo VER320

    *-версии 2006 и 2007 совместимы между собой на уровне двоичного кода. Поэтому, для поддержки обеих версий следует использовать символ VER180. Если необходима поддержка только версии 2007, необходимо использовать символ VER185.

    После выхода в 2011 году кроссплатформенной библиотеки FireMonkey, были введены новые символы условной компиляции для MacOS и iOS. А, в 2013 году с появлением поддержки Android был введён и специальный символ условной компиляции для этой ОС. Ниже представлен перечень этих символов.

    Символ условной компиляции
    MacOS MACOS
    iOS IOS
    Android ANDROID

    Условная компиляция на примере кроссплатформенного приложения:

    $ExtendedSyntax — Директива компилятора Delphi

    От Delphi 4 к Delphi 5 Палитра компонентов.

    Компонент ADO Connection ( ADO связь) обеспечивает связь остальных компонентов с объектом ADO.

    Компонент ADOCommand ( ADO команда) служит для передачи в ADO команды на языке DLL.

    Компонент ADODataSet ( ADO набор данных) используется для представления данных, полученных другими компонентами-наборами.

    Компонент ADOTable ( ADO таблица) представляет данные в табличном формате.

    Компонент ADOQuery служит для передачи объекту ADO запроса на языке SQL.

    Компонент ADOStoredProc ( ADO хранимая процедура) используется для выполнения процедуры, хранимой в объекте ADO.

    Компонент RDSConnection ( RDS связь) служит для публикации данных с помощью Internet Explorer.

    Компоненты этой страницы среды Delphi 5 (рисунок 1) позволяют отказаться от использования инструментального средства BDE для доступа к разнообразным базам данных.

    Синтаксический контроль в Delphi.

    Вполне естественно, что, когда вы пишите программу, то делаете ошибки. Но не беспокойтесь, несмотря на то, что среда Delphi не может совершенно уберечь вас от них, она, несомненно, поможет вам их исправлять.

    Как бы ни был хорош этот программный продукт, вам все равно еще нужно писать код, а в процессе его написания не исключены ошибки. Даже лучшие в мире программные продукты могут оказаться парализованными, если программисту не предоставлены средства для прослеживания и исправления их.

    Как и все в Delphi располагает к удобному применению, также приятно использовать и интегрированный отладчик. Среда предоставляет все возможности, которые программист ожидает получить от профессионального отладчика, причем для использования этих возможностей не обязательно быть асом программирования. Средства отладки Delphi помогут вам справиться с данной проблемой и сэкономить массу времени и нервов.

    Одним из важных качеств этого программного продукта, который делает программирование простым, заключается в том, что весь код для формы содержится в одном Pascal-файле . Это обстоятельство облегчает просмотр программного кода и обнаружение ошибок.

    Рассмотрим типичные ошибки, возникающие после написания кода. Их можно разделить на три вида: синтаксические ошибки, ошибки выполнения и логические ошибки.

    Когда вы пишете программы на Delphi, опасность составляют синтаксические ошибки, которые часто бывают опечатками.

    К ошибкам выполнения относятся любые ошибки, появляющиеся во время исполнения программы.

    Логические ошибки — это такие ошибки, которые случаются, когда программа не делает того, что вы хотели, или делает то, чего вы не хотели.

    Синтаксические ошибки часто появляются из-за опечаток, допущенных при наборе кода программы. Они возникают также, если вы не знаете точный синтаксис операторов языка Pascal. Программа не будет запущена на выполнение до тех пор, пока вы не устраните все синтаксические ошибки.

    Удобным является то, что когда имеется ошибка, Delphi выдает вам о ней сообщение и ставит курсор в то место программы, где она обнаружена. Посмотрим, как это происходит. В качестве примера использована программа Scroll, рассмотренная на занятии 18 (рисунок 2). В данном случае выдано сообщение об отсутствии символа точка с запятой (;), в модуле файла под именем Scroll, курсор установлен на строке 57, с информацией о невозможности компиляции файла Scroll_.pas.

    Object Pascal — один из наиболее требовательных языков в отношении синтаксиса. Среда Delphi будет требовать от вас безупречного кода. То есть вам необходимо кропотливо работать, набирать программный код точно. Но для облегчения труда программиста Delphi предоставляет множество синтаксических заготовок. Например, рассмотрите следующий текст начала файла модуля Scroll_.pas, ниже он приведен в сокращенном виде:

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, ExtCtrls, ComCtrls;

    procedure ScrollBarRedScroll(Sender: TObject; ScrollCode: TScrollCode;

    var ScrollPos: Integer);

    procedure TrackBar3Change(Sender: TObject);

    Вы видите, что определение модуля, типы и описание процедур занимает достаточно много места. Если бы вы набирали это сами, то для этого необходимо потратить определенное время, а потом еще возможно исправить ошибки. Для облегчения вашего труда данная часть программы создается Delphi автоматически, что обеспечивает ее синтаксическую правильность.

    Чтобы задать конфигурацию среды Delphi для поиска ошибок, необходимо использовать меню Project, далее произвести выбор команды Options. На экране появится диалоговое окно Project Options. Выберите вкладку Compiler (рисунок 3). Установленные опции в разделе Syntax options определят для Delphi, какие типы синтаксических проверок проводить.

    Опция Strict Var-strings сообщает компилятору о необходимости сравнивать тип строки, передаваемой процедуре или функции, с объявленным формальным параметром. Если эта опция включена, компилятор выдает сообщение о синтаксической ошибке, когда вы пытаетесь передать функции переменную, тип которой отличается от того, который объявлен в списке формальных параметров. Например, следующая программа вызовет синтаксическую ошибку (опция Strict Var-strings включена). На рисунке 4 показан результат синтаксического контроля:


    procedure Prog(var S:String);

    procedure TForm1.Button1Click(Sender: TObject);

    Вы должны всегда оставлять эту опцию включенной, чтобы быть уверенным в том, что не перепишете область памяти, не относящуюся к объявленному параметру.

    Опция Complete Boolean Eval приказывает компилятору генерировать код таким образом, чтобы во время выполнения логические выражения вычислялись полностью. Когда эта опция выключена, компилятор генерирует код, который может «закорачивать» логические выражения, если результат становится известным уже на ранних этапах оценки выражения. В большинстве случаев вы должны оставить ее выключенной, поскольку при этом генерируется более быстрый код. Эта опция не влияет на проверку компилятором синтаксических ошибок.

    Опция Extended Syntax разрешает компилятору применять набор расширенных синтаксических правил. Она позволяет вам использовать функцию как оператор, результат функции будет игнорироваться. Более важно то, что эта опция позволяет вам применять переменные типа PChar. Поскольку PChar интенсивно используются, когда вызываются Windows API, вы всегда должны оставлять эту опцию включенной.

    Опция Typed @ Operator заставляет компилятор возвращать указатель, тип которого аналогичен операнду операции @ . Например, байтовая переменная вернет указатель на байт. При выключенной опции компилятор всегда возвращает не типизированный указатель. Лучше оставлять эту опцию выключенной, чтобы избежать написания кода, который будет иметь дело с несовместимыми типами указателей.

    Опция Open Parameters позволяет компилятору рассматривать любую строку, переданную функции, как открытую строку, или PChar внутри этой функции, не обращая внимания на тип строки, объявленной в качестве формального параметра.

    Опция Huge Strings соответствует директиве компилятора $+H. Чтобы устранить ограничения традиционных строк Паскаля, в Delphi введена поддержка длинных строк. Тип AnsiString соответствует новым длинным строкам переменного размера. Они размещаются динамически, а их размер практически не ограничен. В основе этих строк лежит тип AnsiChar. Если опция будет выключена, то это будет соответствовать директиве компилятора $-H. В этом случае вы получите короткую строку, длина которой ограничена 255 символами.

    Опция Assignable Typed Constants соответствует директиве компилятора $+J. Используется для совместимости с Delphi 1, разрешая присваивание типизированным константам.

    Подпрограммы лежат в основе методики программирования, называемой сокрытием информации. Вы можете упаковать часть функциональных возможностей программы внутри подпрограммы, присвоив ей имя. Впоследствии можете вызывать ее, используя имя, а не переписывать все необходимые операторы. Таким образом, вы скрываете детали того, как эти функциональные возможности реализуются.

    Следовательно, вы получаете автономные исполнимые элементы программы. Необходимо знать, что почти все, что касается подпрограмм, применимо к объектным методам, о которых вы узнаете позже. Вы можете рассматривать методы как подпрограммы, которые являются частью объектов.


    Object Pascal
    обеспечивает ряд зарезервированных подпрограмм, известных как Run-Time Library (исполнительная библиотека — RTL ). Библиотека RTL состоит из заранее заготовленных подпрограмм, которые вы можете использовать в своих программах. Примером могут служить подпрограммы sin., cos. и другие. Когда вы используете такую подпрограмму, например sin, которая вычисляет синус угла, вам не нужно знать точно, как вычисляется значение синуса. Подпрограмма делает это за вас автоматически, и вас не должны интересовать детали более низкого уровня. Таким образом, вы в следующий раз не выполняете рутинные операции по составлению программы вычисления синуса угла.

    В дополнение к зарезервированным стандартным процедурам Object Pascal позволяет вам создавать свои собственные процедуры.

    Параметр или параметры подпрограммы позволяют обратиться в нее извне. Подпрограмма в произвольном случае может иметь много параметров, обычно не более семи. Внутри нее параметр ведет себя просто как переменная. Вы можете использовать подпрограмму в выражениях.

    Создание подпрограмм позволяет избежать дублирования кода и обеспечивает возможность его повторного использования. Если вы должны писать почти идентичный код в двух или более местах, всегда выделяйте общий код в отдельную подпрограмму, а затем просто используйте ее всякий раз, когда нужны имеющиеся в ней функциональные возможности.

    Если вы реализуете процедуру внутри модуля и хотите, чтобы она была видна вне его, вы должны поместить ее объявление в раздел interface данного модуля. Реализация процедуры должна всегда располагаться в разделе implementation того же модуля. Она не видна вне его, если вы явно не передаете объявление как часть интерфейса.

    Если процедура реализована в том же самом модуле, в котором она используется, вы все еще можете нуждаться в отдельном объявлении, чтобы сделать ее видимой другим процедурам в том же модуле.

    Каждая подпрограмма должна иметь блок исполнимых операторов, который содержит ноль или более исполнимых операторов, заключенный в операторы begin-end.

    Операторы представляют собой фактические инструкции, которые должен выполнить компьютер.

    Подпрограммы по праву могут рассматриваться как маленькие программы. Каждая подпрограмма может иметь свои собственные объявления. Они расположены внутри подпрограммы и называются локальными, потому что видимы и доступны только в пределах подпрограммы. На них нельзя ссылаться вне блока реализации подпрограммы.

    Подобно тому, как вы объявляете константы, переменные, константы с типом, определенные вами типы и подпрограммы внутри ваших программ и т.д., вы можете объявлять локальные константы, локальные переменные, локальные константы с типом, локальные типы и локальные подпрограммы внутри подпрограммы.

    Локальные объявления располагаются внутри блоков реализации подпрограммы, между заголовком и телом. Локальный блок объявлений подпрограммы может быть полностью исключен, что часто и делается.

    В Delphi вы можете использовать два вида подпрограмм и, следовательно, два вида заголовков — это процедуры и функции.

    Функции не только дают возможность объединить исполнимые операторы и связанные с ними объявления вместе, но также производят возвращение некоторого значения . Вы можете, таким образом, использовать их внутри выражений справа от операции присваивания, как будто это обычные переменные. Простейшим выражением, включающим функцию, является ссылка на одиночную функцию, приводящая к ее активации и оценке.

    После того как она выполнена, значение, вычисленное ей, возвращается и может быть использовано внутри выражения, в котором она находится.

    Общий синтаксис для простого заголовка функции без параметров следующий:

    function Имя: ТипРезультата ; например:


    function Name: String;

    Заголовок начинается с зарезервированного слова function, за которым следует ее имя.

    В тех функциях, в которых не объявляются никакие параметры, за именем следует двоеточие, тип значения, которое она возвращает, и точка с запятой. Таким образом, имеется небольшое отличие от основной структуры.

    Тип, возвращаемый функцией, — это идентификатор типа результата, и он может быть почти любым идентификатором типа Object Pascal.

    Общий синтаксис для заголовка функции с параметрами следующий:

    function Имя( ): ТипРезультата;

    Если подпрограмма типа процедуры или функции имеет параметры, то в объявлении заголовка появляется список формальных параметров внутри круглых скобок.

    Фактическим параметром подпрограммы или аргументом называется определенное значение, которое передается ей во время выполнения в том месте, которое соответствует формальному параметру. Значение должно иметь тип, соответствующий тому, который был определен, когда объявлялся формальный параметр в заголовке подпрограммы.

    Когда вызывается подпрограмма, вы вносите в список фактические параметры в том же самом порядке, в котором объявлены ее формальные параметры подпрограммы.

    Каждое индивидуальное объявление параметра состоит из имени (или списка отдельных имен, отделенных запятыми), за которым следует двоеточие и имя типа. Многократные объявления параметров в списке формальных параметров отделены друг от друга точкой с запятой.

    Объявление типа параметра подпрограммы играет ту же роль, что и объявление типа переменной: оно позволяет компилятору зарезервировать соответствующее место для хранения значений параметра и дает ему возможность проверять любые нарушения совместимости типа, например, попытки присвоить параметру несовместимое по типу значение, скажем, строку типа String целой переменной.

    Рассмотрим пример реализации функции.

    Суть примера будет заключаться в рисовании мишени на экране компьютера или внешнего вида экрана индикатора радиолокационной станции. В текстовые редакторы можно вводить координаты X, Y экрана компьютера и значение радиуса максимальной окружности мишени. Система уравнений, которая определяет положение точки, описывающей максимальную окружность, имеет вид:


    X = X1 + [R – R cos ά]

    где X, Y — текущие координаты положения точки экрана;

    X1, Y1 – координаты верхней точки окружности;

    R – значение радиуса окружности.

    На рисунке 5 показан результат работы программы Mishen и основные параметры для рисования мишени на экране компьютера.

      1. Запустите Delphi.
      2. Сохраните файл модуля под именем DartBoard_.pas, а файл проекта под именем DartBoard. dpr.
      3. Поместите на форму три компонента Edit со страницы Standard палитры компонентов, необходимых для ввода значений координат и радиуса окружности. В компонент Edit1 будете вводить координату Х1, в компонент Edit2 — координату Y1, в компонент Edit3 — радиус максимальной окружности, обрамляющей рисуемую мишень. Используя свойство Text инспектора объекта для данных компонентов, очистите содержимое текстовых редакторов и введите начальные значения координат и радиуса максимальной окружности. Например, X1 = 380, Y1 = 30, R = 250 . Все значения заданы в пикселях.
      4. Поместите на форму три компонента Label: Label1, Label2, Label3 со страницы Standard палитры компонентов . Используя свойство Caption, введите заголовки для этикеток «Ввод координатыX», «Ввод координаты Y», «Ввод значения радиуса» соответственно .
      5. Поместите на форму компонент Button со страницы Standard палитры компонентов, используя свойство Caption, введите для него заголовок «Результат» .
      6. Чтобы реализовать функцию, вы должны ввести последовательность исполняемых операторов, которые составляют тело функции. В данном примере реализованы две функции: CoordinateX и CoordinateY. Программный код раздела implementation представлен ниже. Строка 1 содержит заголовок функции CoordinateX со списком формальных параметров. Строка 12 содержит заголовок функции CoordinateY со списком формальных параметров. Каждая функция имеет блок локальных объявлений строки 2-4, 13-15. Исполнимые блоки функций представлены в строках 5-11, 16-22.

    Реализация функции следует тем же правилам, что и реализация процедуры. Обе они имеют список исполняемых операторов, заключенных между операторами begin и end. Единственное различие в том, что вы должны присвоить функции возвращаемое значение.

    Поскольку вам необходимо определить возвращаемое функцией значение, то, по крайней мере, один из операторов внутри исполнимого блока должен быть оператором присваивания этого значения либо имени функции, либо специальной переменной Result, имеющей тот же тип, что и результат функции.

    Она является псевдонимом имени функции. Присваивание значения переменной Result по действию аналогично присвоению значения функции. Вызов функции означает не только передачу контроля над выполнением программы к исполняемому блоку, но также получение значения, ради вычисления которого она разработана.

    Вызов CoordinaneX и CoordinateY производится по их именам строки 35-36, со списком фактических параметров, получаемых из текстовых редакторов. Вычисленные функциями значения возвращаются и используются для рисования на экране компьютера мишени.

    Всего в данном примере производится рисование 25 окружностей с шагом в 10 пикселей отстоящих друг от друга. Каждая пятая окружность имеет утолщенный вид.

    Если вы добавите кнопку Button2 и запишете для события OnClick следующий оператор:

    procedure TForm1.Button2Click(Sender: TObject);

    то вы сможете очищать экран компьютера от нарисованного изображения, вводить новые значения и наблюдать работу программы.

    Далее представлен программный код предложенного примера:

      1. function СoordinateX(X1:Real;Y1:Real;Radius1:Real;Z:Integer;M:Integer):Integer;
      2. var
      3. V:Variant;
      4. X:Integer;
      5. begin
      6. X1:=X1 + (Radius1+Z)*sin(M*pi/180);
      7. X1:=Int(X1);
      8. V:=X1;
      9. X:=V;
      10. Result:=X;
      11. end;
      12. function CoordinateY(X1:Real;Y1:Real;Radius1:Real;Z:Integer;M:Integer):Integer;
      13. var
      14. V1:Variant;
      15. Y:Integer;
      16. begin
      17. Y1:=Y1 + (Radius1 — (Radius1+Z)*cos(M*pi/180));
      18. Y1:=Int(Y1);
      19. V1:=Y1;
      20. Y:=V1;
      21. Result:=Y;
      22. end;
      23. procedure TForm1.Button1Click(Sender: TObject);
      24. var
      25. X1,Y1,Radius1:Real;
      26. M,H,Z,K, Y2,X2:Integer;
      27. begin
      28. X1:=StrToFloat(Edit1.Text);
      29. Y1:=StrToFloat(Edit2.Text);
      30. Radius1:=StrToFloat(Edit3.Text);
      31. for K:=0 to 359 do begin
      32. for H:=0 to 24 do begin
      33. M:=K+1;
      34. Z:=H*(-10);
      35. X2:=CoordinateX(X1,Y1,Radius1, Z,M);
      36. Y2:=CoordinateY(X1,Y1,Radius1,Z,M);
      37. Canvas.Pen.W >
        0,5,10,15,20:Canvas.Ellipse(X2+2,Y2+2,X2-2,Y2-2);.

      Перегрузка процедур и функций.

      Вы можете объявить более чем одну подпрограмму в той же области программы и с тем же именем. Такое положение называется перегрузкой. Перегруженные программы должны объявляться с директивой перегрузки и иметь различия в списке параметров.


      function Divide(X, Y: Real): Real; overload;

      function Divide(X, Y: Integer): Integer; overload;

      Result := X div Y;

      Эти декларации создают две функции, одинаково названные Divide, но использующие параметры двух типов. Когда вы вызываете функцию деления, компилятор определяет, какую функцию ввести, определяя фактические параметры. Например, деление (6.0, на 3.0) вызывает первую функцию деления, поскольку аргументы — реальные числа.

      Перегруженные программы должны различаться количеством параметров, с которыми они работают, или типами их параметров.

      Он находится на странице Standard палитры компонентов и позволяет производить группировку связанных управляющих элементов для придания им более организованного вида.

      Компонент GroupBox оказывает влияние на взаимодействие пользователя с клавиатурой. Переход в окно группы перемещает фокус на помеченный компонент в группе.

      Например, используем компонент RadioButton. Перемещение фокуса в пределах группы осуществляется нажатием клавиш со стрелками, вместо клавиши табуляции (рисунок 6). Выход из любого элемента группы на компонент вне ее осуществляется нажатием клавиши «Табуляция».

      Необходимо заметить, что вы должны поместить компонент GroupBox на форму до того, как вы расположите на нем компоненты, например CheckBox, RadioButton, которые должны быть внутри группового элемента. Иначе, компоненты CheckBox, RadioButton не будут перемещаться вместе с компонентом GroupBox, когда вы будете изменять его положение на форме.

      Таким образом, во избежание проблем компонент GroupBox, который должен быть «родителем» других компонентов ( Panel, GroupBox, Notebook, StringGrid, ScrollBox и т.д.), нужно помещать на форму до помещения на него его «детей». Если вы все же забыли об этом и поместили «родителя» (например, GroupBox ) на форму после размещения на нем его «потомков» (например, CheckBox и RadioButton ) — не отчаивайтесь! Отметьте все необходимые объекты и копируйте (после чего удалите их) их в буфер обмена с помощью команд меню Edit|Cut . После этого отметьте на форме нужный вам объект ( GroupBox1) и выполните команду меню Edit|Paste . Все выделенные вами ранее объекты будут помещены на форму и их «родителем» будет GroupBox1 . Описанный механизм является стандартным и может быть использован для всех видимых компонентов.

      Компонент GroupBox имеет свойство Caption, позволяющее вводить заголовок для группы вложенных элементов, чтобы определить их функциональное назначение.

      Марко Канту. Delphi 2 для Windows 95/NT. Москва. ООО «Малип». 1997 г.
      Джон Матчо. Дэвид Р. Фолкнер. Delphi. Москва. БИНОМ. 1995 г.
      Эндрю Возневич. Delphi. Освой самостоятельно. Москва. Восточная книжная компания. 1996г.
      В.В.Фаронов. Delphi 5. Учебный курс. Москва. Издательство Нолидж. 2000 г.
      А. Я. Архангельский. Программирование в Delphi 5. Москва. ЗАО «Издательство Бином». 2000 г. Владимир Скуратов

      $ExtendedSyntax — Директива компилятора Delphi

      Конфигурация среды программирования

      В данной статье рассказывается как :

      • Добавлять и удалять формы и модули в проект
      • Управлять окнами на рабочем пространстве
      • Создавать выполняемый файл для Windows
      • Тонко настроить среду программирования

      Любой проект имеет, по-крайней мере, шесть файлов, связанных с ним. Три из них относятся к управлению проектом из среды и напрямую программистом не меняются. Вот эти файлы :

      • Главный файл проекта, изначально называется PROJECT1.DPR.
      • Первый модуль программы /unit/, который автоматически появляется в начале работы. Файл называется UNIT1.PAS по умолчанию, но его можно назвать любым другим именем, вроде MAIN.PAS.
      • Файл главной формы, который по умолчанию называется UNIT1.DFM, используется для сохранения информации о внешнем виде главной формы.
      • Файл PROJECT1.RES содержит иконку для проекта, создается автоматически.
      • Файл, который называется PROJECT1.OPT по умолчанию, является текстовым файлом для сохранения установок, связанных с данным проектом. Например, установленные Вами директивы компилятора сохраняются здесь.
      • Файл PROJECT1.DSK содержит информацию о состоянии рабочего пространства.

      Разумеется, если сохранить проект под другим именем, то изменят название и файлы с расширением RES, OPT и DSK.

      После компиляции программы получаются файлы с расширениями:

      DCU — скомпилированные модули

      EXE — исполняемый файл

      DSM — служебный файл для запуска программы в среде, очень большой, рекомендуется стирать его при окончании работы.

      DP — backup файлы Редактора.

      Если нужно сохранить проект, то Вы выбираете пункт главного меню “File” (с помощью мышки или по клавише Alt+F). Пункт меню “File” выглядит следующим образом:

      Save Project As

      Как Вы можете видеть, здесь есть шесть секций; вот их назначение:

      • Первая секция дает возможность управления проектом вцелом.
      • Вторая секция дает контроль над формами, модулями и компонентами проекта.
      • Третья позволяет добавлять и удалять файлы из проекта.
      • Четвертая управляет печатью.
      • Пятая секция — выход из Delphi
      • Шестая секция предоставляет список ранее редактировавшихся проектов; Вы можете быстро открыть нужный.

      Как Вы увидите позже, большинство операций из пункта меню “File” можно выполнить с помощью Менеджера Проекта (Project Manager), который можно вызвать из пункта меню View. Некоторые операции доступны и через SpeedBar. Данная стратегия типична для Delphi: она предоставляет несколько путей для решения одной и той же задачи, Вы сами можете решать, какой из них более эффективен в данной ситуации.

      Каждая строка пункта меню “File” объяснена в Справочнике. Выберите меню “File” и нажмите F1, появится экран справочника, как на рис.1.

      Рис.1: Delphi включает подсказку, как использовать пункт меню “File”.

      Большинство из пунктов первой секции очевидны. “New Project” начинает новый проект, “Open Project” открывает существующий проект и т.д.

      Первые два пункта второй секции позволяют Вам создать новую форму или новый модуль. Выбирая “New Form”, Вы создаете новую форму и модуль, связанный с ней; выбирая “New Unit”, Вы создаете один модуль.

      “New Component” вызывает диалог для построения заготовки нового визуального компонента. В результате создается модуль, который можно скомпилировать и включить в Палитру Компонент.

      “Open File” открывает при необходимости любой модуль или просто текстовый файл. Если модуль описывает форму, то эта форма тоже появится на экране.

      При создании нового модуля Delphi дает ему имя по-умолчанию. Вы можете изменить это имя на что-нибудь более осмысленное (например, MAIN.PAS) с помощью пункта “Save File As“.

      “Save File” сохраняет только редактируемый файл, но не весь проект.

      “Close File” удаляет файл из окна Редактора.

      Нужно обратить внимание: Вы должны регулярно сохранять проект через File | Save Project либо через нажатие Ctrl+S.

      Теперь, когда Вы знаете о создании проекта с помощью пункта меню “File”, перейдем к Менеджеру Проектов, который помогает управлять проектом. Менеджер Проектов, рис.3, разделен на две части. Верхняя — панель с управляющими кнопками. Нижняя — список модулей, входящих в проект.

      Рис.3: Кнопки сверху используются для удаления и добавления модулей в проект.

      Вы можете использовать кнопки с плюсом и минусом для добавления и удаления файлов в проекте. Эти изменения влияют на файлы с исходным текстом, то есть, если добавить в проект модуль, то ссылка на него появится в файле с расширением DPR.

      Краткое описание других кнопок :

      • Третья слева кнопка — просмотр текста модуля, на котором стоит курсор.
      • Четвертая — просмотр формы, если есть таковая для данного модуля
      • Пятая — вызов диалога настройки проекта, сам диалог будет рассмотрен позже.
      • Последняя — сохранение изменений на диске.

      Обзор других пунктов меню

      Пункт меню “File” обсуждался ранее. Далее рассматриваются другие важные пункты — “Edit”, “Search”, “View” и “Compile”, но менее подробно. Далее, снова подробно, рассказывается о “Options”.

            1. Пункт меню “Edit”
            2. “Edit” содержит команды “Undo” и “Redo”, которые могут быть очень полезны при работе в редакторе для устранения последствий при неправильных действиях, например, если случайно удален нужный фрагмент текста.

            Отметьте для себя, что Справочник (on-line help) объясняет как нужно использовать пункт меню Options | Environment для настройки команды “Undo”. Возможность ограничить возможное количество команд “Undo” может пригодиться, если Вы работаете на машине с ограниченными ресурсами.

            Команды “Cut”, “Copy”, “Paste” и “Delete” — как во всех остальных приложениях Windows, но их можно применять не только к тексту, но и к визуальным компонентам.

            “Bring To Front”, “Send To Back”, “Align” и “Size” обсуждались в Уроке № 2. Оставшиеся четыре пункта помогают быстро “приукрасить” внешний вид формы.

          1. Пункт меню “Menu”
          2. В “Search” есть команда “Find Error” (поиск ошибки), которая поможет отследить ошибку периода выполнения программы. Когда в сообщении об ошибке указан ее адрес, Вы можете выбрать пункт меню Search | Find Error и ввести этот адрес. Если это представится возможным, то среда переместит Вас в то место программы, где произошла ошибка.
          3. Пункт меню “View”

    Составляющие пункта меню “View”:

    • Project Manager (Менеджер Проекта).
    • Project Source — загружает главный файл проекта (DPR) в Редактор
    • Установка, показывать или нет Object Inspector на экране.
    • Установка, показывать или нет Alignment Palette. То же самое доступно из пункт меню Edit | Align.
    • Browser — вызов средства для просмотра иерархии объектов программы, поиска идентификатора в исходных текстах и т.п.
    • Watch, Breakpoint и Call Stack — связаны с процедурой отладки программы и будут обсуждаться позднее.
    • Component List — список компонент, альтернатива Палитре Компонент. Используется для поиска компонента по имени или при отсутствии мыши.
    • Window List — список окон, открытых в среде Delphi.
    • Toggle Form/Unit, Units, Forms — переключение между формой и соответствующим модулем, выбор модуля или формы из списка.
    • New Edit Window — открывает дополнительное окно Редактора. Полезно, если нужно, например, просмотреть две разных версии одного файла.
    • SpeedBar и Component Palette — установки, нужно ли их отображать.
          1. Пункт меню “Compile”
          2. В пункте меню “Compile” проект можно скомпилировать (compile) или перестроить (build). Если выбрать Compile или Run, то Delphi перекомпилирует только те модули, которые изменились со времени последней компиляции. Build all, с другой стороны, перекомпилирует все модули, исходные тексты которых доступны. Команда Syntax Check только проверяет правильность кода программы, но не обновляет DCU файлы.

            В самом низу — пункт Information, который выдает информацию о программе: размеры сегментов кода, данных и стека, размер локальной динамической памяти и количество скомпилированных строк.

            Можно использовать “Run” для компиляции и запуска программы и для указания параметров командной строки для передачи в программу. Здесь же имеются опции для режима отладки.

            Пункт меню Options | Project

            “Options” наиболее сложная часть системного меню. Это центр управления, из которого вы можете изменять установки для проекта и для всей рабочей среды Delphi. В “Options” есть семь пунктов:

            Первые четыре пункта вызывают диалоговые окна. Ниже приведено общее описание пункта меню “Options”:

            • Project — выбор установок, которые напрямую влияют на текущий проект, это могут быть, к примеру, директивы компилятора проверки стека (stack checking) или диапазона (range checking).
            • Environment — конфигурация самой среды программирования (IDE). Например, здесь можно изменить цвета, используемые в Редакторе.
            • Tools — позволяет добавить или удалить вызов внешних программ в пункт главного меню “Tools”. Например, если Вы часто пользуетесь каким-нибудь редактором или отладчиком, то здесь его вызов можно добавить в меню.
            • Gallery — позволяет определить специфические установки для Эксперта Форм и Эксперта Проектов и их “заготовок”. Эксперты и “заготовки” предоставляют путь для ускорения конструирования интерфейса программы.
            • Последние три пункта позволяют сконфигурировать Палитру Компонент.

            Диалог из пункта Options | Project включает пять страниц:

            • На странице Forms перечислены все формы, включенные в проект; Вы можете указать, нужно ли автоматически создавать форму при старте программы или Вы ее создадите сами.
            • На странице Application Вы определяете элементы программы такие, как заголовок, файл помощи и иконка.
            • Страница Compiler включает установки для генерации кода, управления обработкой ошибок времени выполнения, синтаксиса, отладки и др.
            • На странице Linker можно определить условия для процесса линковки приложения
            • Страница Directories/Conditionals — здесь указываются директории, специфичные для данного проекта.

            После предыдущего абзаца с общим описанием, каждая страница описана детально в отдельной главе.

            Все установки для проекта сохраняются в текстовом файле с расширением OPT и Вы можете вручную их исправить.

            На странице Forms можно выбрать главную форму проекта. Изменения, которые Вы сделаете, отобразятся в соответствующем файле DPR. Например, в нижеследующем проекте, Form1 является главной, поскольку появляется первой в главном блоке программы:

            Unit1 in ‘UNIT1.PAS’ ,

            Unit2 in ‘UNIT2.PAS’ ;

            Если изменить код так, чтобы он читался

            то теперь Form2 станет главной формой проекта.

            Вы также можете использовать эту страницу для определения, будет ли данная форма создаваться автоматически при старте программы. Если форма создается не автоматически, а по ходу выполнения программы, то для этого нужно использовать процедуру Create.

            Кстати, в секции Uses имя формы в фигурных скобках является существенным для Менеджера Проектов и удалять его не стоит. Не нужно вообще ничего изменять вручную в файле проекта, если только Вы не захотели создать DLL, но об этом позднее.

          3. Страница Applications
          4. На странице Applications, см. рис.5, вы можете задать заголовок (Title), файл помощи (Help file) и пиктограмму (Icon) для проекта.

            Рис.5: Страница общих установок для приложения.

          5. Страница Compiler
          6. Ранее уже говорилось, что установки из пункта меню “Options | Project” сохраняются в соответствующем файле с расширением OPT. Давайте рассмотрим директивы компилятора на странице Compiler (рис.6).

            Рис.6: Страница для определения директив компилятора.

            Следующая таблица показывает, как различные директивы отображаются в OPT файле, на странице Compiler и внутри кода программы:

            OPT File Options Page Editor Symbol
            F Force Far Calls
            A Word Align Date
            U Pentium-Safe FDIV
            K Smart Callbacks
            W Windows (3.0) Stack Frame
            R Range Checking
            S Stack Checking
            I IO Checking
            Q Overflow Checking
            V Strict Var Strings
            B Complete Boolean Evaluation
            X Extended Syntax
            T Typed @ Operator
            P Open Parameters
            D Debug Information
            L Local Symbols
            Y Symbol Information
            N Numeric Processing
          7. Страница Linker
          8. Теперь давайте перейдем к странице Linker, показанной на рис.7.

            Рис.7: Страница линковщика.

            Установки отладчика рассматриваются ниже. Если буфер линковщика расположен в памяти, то линковка происходит быстрее.

            Размер стека (Stack Size) и локальной динамической памяти (Heap Size) весьма важны. Delphi устанавливает по умолчанию и Stack Size, и Heap Size в 8192 байт каждый. Вам может понадобиться изменить размер стека в программе, но обычно это не более 32Кб. В сумме эти два размера не должны превышать 64Кб, иначе будет выдаваться ошибка при компиляции программы.

            Страница Directories/Conditionals, рис.8, дает возможность расширить число директорий, в которых компилятор и линковщик ищут DCU файлы.

            Рис.8: Страница Directories/Conditionals.

            В файле DELPHI.INI содержится еще один список директорий. Запомните, что в OPT файле — список директорий для конкретного проекта, а в файле DELPHI.INI — список относится к любому проекту.

            Output directory — выходная директория, куда складываются EXE и DCU файлы, получающиеся при компиляции.

            Search path — список директорий для поиска DCU файлов при линковке. Директории перечисляются через точку с запятой ;

            Conditional defines — для опытного программиста и на первом этапе создания проекта не требуется. Для информации можно вызвать Справочник (on-line help).

            Конфигурация среды программирования (IDE)

            Пункт меню “Options | Environment” предоставляет Вам большой набор страниц и управляющих элементов, которые определяют внешний вид и работу IDE. Delphi позволяет сделать следующие важные настройки:

            1. Определить, что из проекта будет сохраняться автоматически.
            2. Можно менять цвета IDE.
            3. Можно менять подсветку синтаксиса в Редакторе.
            4. Можно изменить состав Палитры Компонент.
            5. Указать “горячие клавиши” IDE.

            Первая страница пункта меню “Options | Environment” показана на рис.9

            Рис.9: Страница Preferences.

            В группе “Desktop Contents” определяется, что будет сохраняться при выходе из Delphi. Если выбрать Desktop Only — это сохранит информацию о директориях и открытых окнах, если выбрать Desktop And Symbols — это сохранит то же самое плюс информацию для броузера (browser).

            В группе “Autosave” указывается, что нужно сохранять при запуске программы. Если позиция Editor Files выбрана, то сохраняются все модифицированные файлы из Редактора при выполнении команд Run|Run, Run|Trace Into, Run|Step Over, Run|Run To Cursor или при выходе из Delphi. Если позиция Desktop выбрана — сохраняется рабочая среда при закрытии проекта или при выходе из Delphi. Если Вы позже откроете проект, то он будет иметь тот же вид, что и при его закрытии.

            В группе “Form Designer” можно установить, показывать ли сетку (grid) на экране и выравнивать ли объекты по ней, и размер ячеек сетки.

            В группе “Debugging”: опция Integrated Debugging — использовать ли встроенный отладчик; Step Program Block — отладчик остановится на первой строке модуля, в котором есть отладочная информация; Break On Exception — останавливать ли программу при возникновении исключительной ситуации; Minimize On Run — свертывать ли Delphi при запуске программы. После закрытия программы среда Delphi восстанавливается. Hide Designers On Run — прячет окна Дизайнера (Инспектор Объектов, формы) при запуске приложения.

            Show Compiler Progress — показывать ли окно, в котором отражается процесс компиляции программы.

            “Gallery” — указывает, в каких случаях нужно предоставлять “галерею” (коллекцию заготовок и экспертов).

            Страницы Editor Options, Editor Display и Editor Colors позволяют Вам изменить цвета и “горячие” клавиши, используемые IDE. Страница Editor Display показана на рис.10, а Editor Colors — на рис.11.

            Рис.10: Страница Editor Display.

            Рис.11: Страница Editor Colors.

            Существует несколько способов изменить назначение “горячих” клавиш, используемых Редактором. Например, многие пользователи привыкли, что по клавише F5 максимизируется окно Редактора. Для этого им надо использовать расположение клавиш, называемое “Classic” (Keystroke mapping : Classic). Всего есть четыре вида конфигурации клавиш:

            • “Default” — характерно для Microsoft. Если Вы новичок в Windows или уже привыкли к этому расположению клавиш, то это подойдет.
            • “Classic” — более известно ветеранам Borland C++ и Borland Pascal. Поддерживает многие комбинации клавиш WordStar и отладчик управляется старым добрым способом.
            • Остальные два вида — имитируют редакторы Epsilon и BRIEF. Подойдут, если вы с ними знакомы.

            Точное описание назначения клавиш можно найти в Справочнике (в Help | Topic Search набрать “key mapping”).

            Цвета IDE можно изменить на странице Editor Colors.

            И, наконец, Editor Options (рис.12).

            Рис.12: На странице Editor Options можно настроить тонкие детали работы Редактора.

            Многие из установок на данной странице не очень важны для большинства пользователей, поэтому остановимся лишь на некоторых.

            “Use syntax highlight” — выделять ли цветом синтаксические конструкции в Редакторе Исходного текста.

            “Find text at cursor” — если включено, то при поиске (Ctrl+F) в качестве подстроки для поиска будет браться то слово, на котором стоит курсор.

            Обо всех опциях можно подробнее узнать в Справочнике (F1).

            Блог GunSmoker-а

            . when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.

            19 апреля 2009 г.

            Настройки проектов в Delphi с точки зрения поиска ошибок

            О чём идёт речь

            Сначала, давайте посмотрим на них: открываем Project/Options. Нас будут интересовать вкладки Compiling и Linking (в старых версиях Delphi они назывались Compiler и Linker):

            На вкладке «Compiler» нас будут интересовать опции «Stack Frames», группа «Debug information», «Local Symbols» и «Symbol reference info», «I/O Checking», «Overflow checking» и «Range checking». На «Linking» — «Map file», «Debug Information» (известная в предыдущих версиях Delphi как «Include TD32 debug info») и «Include remote debug symbols».

            Давайте посмотрим, за что отвечают эти опции. А затем — как их лучше бы всего расставить. При этом мы будем рассматривать такие ситуации: обычное приложение и приложение с механизмом диагностики исключений.
            Кроме того, настройки проекта могут отличаться, компилируете ли вы приложение для себя или для распространения. В новых версиях Delphi появились профили настроек (Debug и Release, соответственно). Вы можете задать свой набор настроек в каждом профиле, а затем переключаться между ними. В старых Delphi есть только один профиль настроек и вам нужно менять каждую настройку вручную.

            Напомним, что при смене любой из опций необходимо сделать полный Build проекту (а не просто Compile).

            Что означают эти опции?

            Самыми важными настройками являются группа опций «Debug information», «Local Symbols» и «Symbol reference info».

            Программа представляет собой набор машинных команд. Текст программы представляет собой текстовый файл. Вопрос: как отладчик узнаёт, когда надо остановиться, если вы поставили бряк на строку в тексте? Где же соответствие между текстовым файлом и набором байт в exe-файле? Вот для такой связи и служит отладочная информация. Это, грубо говоря, набор инструкций типа: «машинные коды с 1056 по 1059 относятся к строке 234 модуля Unit1.pas». Вот с помощью такой информации и работает отладчик. Указанные выше опции отвечают за генерацию отладочной информации для ваших модулей.

            Отладочная информация сохраняется вместе с кодом модуля в dcu-файле. Т.е. один и тот же Unit1.pas может быть скомпилирован как с отладочной информацией, так и без неё — в разные dcu файлы. Отладочная информация увеличивает время компиляции, размер dcu-файлов, но не влияет на размер и скорость работы полученного exe-файла (т.е. отладочная информация не подключается к exe-файлу) (*).

            Бывают ситуации, когда наличие отладочной информации в файле или (хотя бы) рядом с файлом является необходимым. Например, если вы выполняете удалённую отладку или отладку внешнего процесса. Или если вам нужен читаемый стек вызовов в вашем средстве диагностики исключений.

            Подключение отладочной информации к приложению осуществляется несколькими способами: либо это опции проекта (а именно: «Map File», «Debug information» (Linker)/«Include TD32 Debug info» или «Include remote debug symbols»), либо это возможности всевозможных экспертов (типа EurekaLog, JCL или madExcept), которые добавляют отладочную информацию в программу в своём формате.

            Итак, опции отладочной информации:

            • «Debug information» (директива <$D+>или <$D->) – это собственно и есть отладочная информация. Т.е. соответствие между текстом программы и её машинным кодом. Вы должны включить эту опцию, если хотите ставить бряки, выполнять пошаговую отладку, а также иметь стек с именами для своего кода. Часто эту опцию включают автоматически различные эксперты типа EurekaLog.
            • «Local symbols» (директива <$L+>или <$L->) – является дополнением к отладочной информации. Она отвечает за соответствие между данными в exe-файле и именами переменных. Если вы включаете эту опцию, то отладчик позволит вам просматривать и изменять переменные. Также окно «Call Stack» будет способно отражать переданные в процедуры параметры.
            • «Reference info» – это дополнительная информация для редактора кода, которая позволяет ему отображать более подробную информацию об идентификаторах. Например, где была объявлена переменная.

            Эти три опции тесно связаны и обычно нет смысла включать/выключать их по одной.

            • «Use Debug DCUs» — эта опция переключает сборку вашей программы с отладочными модулями Delphi или с обычными. Если вы внимательно посмотрите на установку Delphi, то увидите, что pas файлы из папки Source никогда не используются для компиляции — а только для отладки. Для компиляции же используются уже готовые dcu-файлы из папки Lib. Это уменьшает время компиляции. Поскольку dcu могут быть скомпилированы с отладочной информацией и без неё, то в папке Lib есть два набора dcu-файлов: обычные и отладочные. Переключая эту опцию, вы указываете, какие из них использовать. Если вы выключите эту опцию, то не сможете заходить по F7 в стандартные функции и методы Delphi (т.к. для них будет отсутствовать отладочная информация). Также при выключенной опции вы не будете видеть информацию о стандартном коде в стеке вызовов.
            • «Stack Frames» — эта опция отвечает за генерацию стековых фреймов. Если опция выключена, то стековый фрейм не генерируется без необходимости. Если она включена -то фрейм генерируется всегда. Стековые фреймы используются при построении стека вызовов по фреймам (построение методом raw-сканирование не нуждается в стековых фреймах). В обычном приложении стековые фреймы генерируются практически всегда (**).
            • «Range checking» — служит помощником в поиске проблем при работе, например, с массивами. Если её включить, то для любого кода, который работает с массивами и строками, компилятор добавляет проверочный код, который следит за правильностью индексов. Если при проверке обнаруживается, что вы вылезаете за границы массива, то будет сгенерировано исключение класса ERangeError. При этом вы можете идентифицировать ошибку обычной отладкой. Если же опция выключена, то никакого дополнительного кода в программу не добавляется. Включение опции немного увеличивает размер программы и замедляет её выполнение. Рекомендуется включать эту опцию только в отладочной версии программы.
            • «Overflow checking» — похожа на опцию «Range checking», только проверочный код добавляется для всех арифметических целочисленных операций. Если результат выполнения такой операции выходит за размерность (происходит переполнение результата), то возбуждается исключение класса EIntOverflow. Пример – к байтовой переменной, равной 255, прибавляется 2. Должно получиться 257, но это число больше того, что помещается в байте, поэтому реальный результат будет равен 1. Это и есть переполнение. Эта опция используется редко по трём причинам. Во-первых, самый разный код может рассчитывать на то, что эта опция выключена (часто это различного рода криптографические операции, подсчёт контрольной суммы и т.п., но не только). В связи с этим при включении этой опции могут начаться совершенно различные проблемы. Во-вторых, в обычных ситуациях работают с четырёхбайтовыми знаковыми величинами, и работа около границ диапазонов представления происходит редко. В-третьих, арифметические операции с целыми – достаточно частый код (в отличие от операций с массивами), и добавление дополнительной работы на каждую операцию иногда может быть заметно (в смысле производительности).
            • «I/O Checking» — эта опция используется только при работе с файлами в стиле Паскаля, которые считаются устаревшими. По-хорошему, вы не должны использовать их и, соответственно, эту опцию.

            Замечу также, что эти опции можно выставлять и локально — как для целого модуля, так и для отдельной функции/процедуры (а для некоторых опций — даже для участка кода). Делается это обычными директивами компилятора, узнать которые вы можете, нажав F1 в окне настроек. Например, «Stack Frames» регулируется <$W+>и <$W->.

            Кроме того, помимо настроек компилятора (Compiling) есть ещё настройки компоновщика (Linking):

            • «Map file» — включение опции заставляет линкёр Delphi создавать вместе с проектом map-файл. Различные установки опции отвечают за уровень детализации и обычно имеет смысл ставить только Off или Detailed. Map файл обычно используется всевозможными утилитами типа EurekaLog, JCL или madExcept в качестве первичного источника для создания отладочной информации в своём формате. Поэтому руками устанавливать эту опцию вам придётся крайне редко — эксперты включают её самостоятельно по необходимости.
            • «Debug Information» (Linker)/«Include TD32 debug info» — внедряет в приложение отладочную информацию для внешнего отладчика в формате TD32. Обычно эта опция включается, если вы отлаживаете проект через Attach to process и Delphi не может найти отладочную информацию. При включении этой опции размер самого приложения увеличивается в 5-10 раз (при условии, что опция «Place debug information in separate TDS file» выключена). Поэтому, если вам нужна отладочная информация в распространяемом приложении — лучше рассмотреть другие варианты (лучше всего подходит отладочная информация в специализированных форматах — EurekaLog, JCL, madExcept).
            • «Include remote debug symbols» — заставляет линкёр создать rsm-файл вместе с проектом, в который записывается информация для удалённого отладчика Delphi. Вам нужно включать эту опцию, если вы хотите выполнить удалённую отладку. Полученный rsm-файлик нужно копировать вместе с приложением на удалённую машину.

            Всю эту информацию можно просуммировать и дать рекомендации по установке опций для различных случаев жизни. Они приведены ниже. Жирным выделены настройки, отличающиеся от умалчиваемых (т.е. на них нужно обратить внимание и выставить вручную).

            Хочу заметить, что помимо опций Delphi, в самих экспертах/инструментах также могут быть настройки, влияющие на детальность отладочной информации. Например, обзор таких настроек для EurekaLog мы уже делали в этой статье.

            Обычное приложение без механизма диагностики исключений

            Общие настройки для любых профилей

            Все опции отладки («Debug information» (Compiler), «Local symbols», «Reference info») вообще на готовый модуль не влияют, т.к. отладочная информация в exe/DLL не хранится, ну и нам жить не мешают => поэтому смысла их выключать я не вижу («Use Debug DCUs» — устанавливайте по вкусу, смотря по тому, хотите вы отлаживаться в стандартных модулях или нет).

            «Stack Frames» вообще включать незачем.

            Генерацию map-файла выключаем.

            Профиль Debug

            Включаем «Range checking» и (по вкусу) «Overflow checking».

            «Include TD32 debug info» — включаем только для отладки внешнего процесса.

            Соответственно, «Include remote debug info» — включаем только для удалённой отладки.

            Профиль Release

            Выключаем «Range checking», «Overflow checking», «Include TD32 debug info» и «Include remote debug info».

            Приложение с механизмом диагностики исключений (типа EurekaLog, JCL или madExcept)

            Общие настройки любых профилей

            Все опции отладки («Debug information» (Compiler), «Local symbols», «Reference info») держать включёнными, т.к. в противном случае не будет доступна отладочная информация. Соответственно, ваши информационные механизмы пойдут лесом.

            «Stack Frames» — вообще вЫключать незачем.

            Генерацию map-файла включаем, если об этом не позаботился эксперт (маловероятно).

            Профиль Debug

            «Use Debug DCUs» — по вкусу.
            Включаем «Range checking» и (по вкусу) «Overflow checking».

            «Include TD32 debug info» — включаем только для отладки внешнего процесса.

            «Include remote debug info» — включаем только для удалённой отладки.

            Профиль Release

            Включаем «Use Debug DCUs».

            Выключаем «Range checking», «Overflow checking», «Include TD32 debug info» и «Include remote debug info».

            Примечание: если вы используете мало операций с индексами в своей программе (так что дополнительные проверки не замедлят её), то будет хорошей идеей всегда держать опцию «Range checking» включённой.

            Что может пойти не так, если настройки будут заданы неверно?

            Ну, во-первых, это невозможность отладки (например, отсутствие информации для удалённого отладчика или выключенная опция «Debug information» (Compiler)), большой размер приложения (например, случайно забыли выключить «Debug information» (Linker)/«Include TD32 debug info»), медленная работа (например, компиляция с отладочным кодом), отсутствие или неполный стек вызовов в средствах диагностики исключений (например, выключили «Debug information» (Compiler)). В очень редких и запущенных случаях переключение опций может сказаться на работоспособности программы (например, установка Stack frames может снизить максимально возможную глубину рекурсии). Ну и недочёты по мелочи.

            Кстати, если вы разрабатываете компоненты, то надо учитывать, что у Delphi есть именно два набора DCU-файлов, которые отличаются настройками компиляции. Вообще говоря, простое переключение опций, ответственных за генерацию отладочной информации, никак не влияет на интерфейс и реализацию модуля. Но в общем случае код может использовать условные директивы. Поэтому может быть ситуация, когда два набора DCU файлов (скомпилированных с разными опциями) не совместимы друг с другом — потому что они использовали какую-либо директиву и содержат разный код (а вот и пример).
            Поэтому вам тоже надо иметь два набора DCU-файлов: один — скомпилированный с опцией «Use Debug DCUs», другой — без. Причём, не важно включена или выключена опция «Debug information» (Compiler) в ваших настройках в обоих случаях.

            Примечания:
            (*) Слова «отладочная информация увеличивает время компиляции, размер dcu-файлов, но не влияет на размер и скорость работы полученного exe-файла» некоторые понимают неправильно. В частности, многие замечают, что если переключить профиль приложения с Debug на Release (или наоборот), то размер приложения изменится (незначительно или же намного — зависит от настроек проекта и его исходного кода). Позвольте, но ведь я говорю об отладочной информации в чистом виде (мы говорим про опции «Debug Information», «Local Symbols» и т.п. с вкладки «Compiling»), а вы меняете профиль компиляции целиком. Это не только смена опций отладочной информации (которые, кстати, могут даже вообще не меняться при смене профиля), а также и множество других настроек.

            Например, в вашем коде может быть тьма конструкций вида <$IFDEF DEBUG>какой-то код <$ENDIF>. Разумеется, когда вы собираете программу в Release, этот код в программу не попадёт, а когда вы собираете его в Debug, то — попадёт. Потому что по умолчанию профиль Debug содержит символ условной компиляции «DEBUG». В результате размер .exe действительно получится разный. Но повлияла ли на этот размер отладочная информация? Неа. Фактически, вы собрали в разных профилях разных код — неудивительно, что он разный по размеру.

            Более того, вы можете удалить из конфигурации Debug символ условной компиляции «DEBUG» — и тогда вы будете собирать один и тот же код в обоих профилях. Ну, по крайней мере, свой код. Сторонний, уже собранный код, конечно же, никак не будет затронут. Например, код RTL/VCL уже скомпилирован с фиксированными настройками и не меняется при пересборке проекта. Вон там чуть выше я упомянул, что в некоторых версиях Delphi отладочный и релизный варианты кода RTL/VCL незначительно отличаются — опять же, благодаря условной компиляции. Но никак не отладочной информации.

            Кроме того, к иному коду приводит и включение/выключение опций вида Optimization, Stack Frames, Range Check Errors и др. Действительно, оптимизация может удалять код (оптимизировать ненужный) или увеличивать (вставлять inline вместо вызова), Stack Frames очевидно добавляет код (код установки фрейма), равно как и Range Check Errors (код проверки диапазонов). В результате, вы меняете профиль — вы меняете и код (при условии, что разные профили имеют разные настройки вышеупомянутых опций — что так и есть по умолчанию). Меняете код — меняете и размер. Имеет ли хоть какое-то отношение к этому изменению размера отладочная информация? Нет.

            Далее, другой пример. Несмотря на то, что по умолчанию отладочная информация в .exe файл не попадает — никто же не запрещает её вам туда добавить самому! Например, если вы будете использовать трейсер исключений, то он самостоятельно добавит в .exe часть отладочной информации, которая нужна ему для построения читабельных стеков вызовов.

            Также о внедрении отладочной информации можно попросить и среду. Например, вы можете включить «Include TD32 Debug Info» (эта опция называется «Debug Information» на вкладке «Linking» в последних версиях Delphi) и выключить опцию «Place debug information in separate TDS file». Тогда вся отладочная информация из .dcu файлов будет собрана в один большой файл и этот файл будет внедрён в .exe. Тогда да, отладочная информация повлияет на размер файла, но это происходит не из-за её свойств, а потому что мы явно попросили такое поведение: «добавьте отладочную инфу в мою программу».

            Кстати говоря, в последних версиях Delphi здорово поменяли настройки профилей компиляции. Если раньше Release и Debug мало чем отличались, то теперь отличия существенны. Профиль Debug выключает Optimization, но включает Stack Frames (а профиль Release — делает наоборот). Профиль Debug включает отладочную информацию, а Release — отключает. Но оба профиля включают Assert-ы. Также оба профиля включают I/O checks, но выключают overflow и range. В настройках компоновщика (linking) профиль Debug включает TD32 («Debug information») и Remote debug symbols (не для всех платформ). Release, соответственно, выключает эти же опции. И оба профиля не включают Map file и отдельный файл для TD32.

            (**) Например: Button1Click состоит всего из двух инструкций: «call A; ret;». Она очень короткая и не использует аргументы или локальные переменные. Поэтому, очевидно, что ей не нужен стековый фрейм. Когда опция «Stack frames» выключена, то для Button1Click стековый фрейм не создаётся (но он создаётся, если опция «Stack frames» будет включена).

            Но, для более сложных процедур стековые фреймы будут генерироваться вне зависимости от установки опции «Stack frames».

            Например, тоже очень короткая процедура B всегда имеет фрейм. Причина: использование типа String в ShowMessage. Компилятору нужно вставить неявную строковую переменную и неявный try/finally для её освобождения, поэтому процедуре нужен фрейм.

            В реальных приложениях фреймы генерируются для 99% процедур. Подробнее: Фреймы на стеке.

            Недокументированные ключи компиляции

            В файлах проекта dof и cfg они представляют собой недокументированные ключи: E, F, K, N и S. Они появляются также при вставке переключателей ctrl-OO:

            Эти ключи не описаны в файлах справки.

            Может ли кто-нибудь получить информацию об их значении?

            3 ответа

            1 Решение Ozz Nixon [2020-01-15 04:04:00]

            Легкий способ выйти из этих «недокументированных» — запустить DCC32.exe из командной строки, вы увидите все параметры компилятора, доступные для вашей версии Delphi. За эти годы некоторые коммутаторы изменились.

            Я все еще собираюсь в Паскале, поэтому я узнал их. $ K не из дней Turbo Pascal, ни Free Pascal, ни Delphi 7 или более старых. (Я не использую новее, чем D7 — возможно, версия CodeGear или Embarcadero?

            0 AHiismak [2020-12-21 06:23:00]

            Примечание: <$ N>и <$ E>обрабатываются как пара.

            <$F->= форсировать дальние вызовы (только Turbo Pascal/Borland Pascal и Delphi 1 (16 -bit); ничего не делает в новых Delphis)

            <$K->Умные обратные вызовы

            <$S->= Проверка стека. if <$S+>, вызов подпрограммы проверки стека вставляется в начало каждой процедуры/функции, чтобы проверить, можно ли зарезервировать место для локальных переменных в стеке. Вызывает EStackOverflow (если SysUtils — USEd) или завершается с ошибкой времени выполнения (если SysUtils НЕ ИСПОЛЬЗУЕТСЯ), если в стеке недостаточно места для локальных переменных.

            <$N+>и <$E->: они были использованы в Турбо Паскале. (и, возможно, Delphi 1?) В более новых Delphis они не используются, но см. тип Real48 и директиву <$ REALCOMPATIBILITY>.

            <$N-, E+>бессмысленно, либо рассматривается как <$N-, E->, либо вызывает ошибку компиляции.

            <$N-, E->Реальный тип — это 6 -byte (= 48 -bit) программный реал. Математический сопроцессор не используется (даже если он существует).

            <$N+, E+>тип Real — это математический сопроцессор 8 -byte (IEEE real), такой же тип, как Double в Delphi. Используется математический сопроцессор (если он существует), в противном случае он эмулируется с помощью программного обеспечения (медленно, но дает те же результаты, что и математический сопроцессор).

            <$N+, E->тип Real — это математический сопроцессор 8 -byte (действительный стандарт IEEE) того же типа, что и Double в Delphi. Математический сопроцессор должен присутствовать во время выполнения, в противном случае программа немедленно завершает работу с ошибкой времени выполнения «Математический сопроцессор требуется, но не присутствует».

            Последние версии Windows не могут работать с таким старым процессором, который не имеет встроенного модуля с плавающей запятой, поэтому <$N+>и <$E->теперь не имеют смысла.

            Большинство указаний, которые вы указали, задокументированы в Embarcadero DocWiki:

            <$ A8>= Выровнять поля записи с выравниванием QuadWord

            <$B->= включить булевую оценку короткого замыкания

            <$D+>= включить отладочную информацию

            <$G+>= включить импорт данных

            <$H+>= включить длинные строки (установить тип String в AnsiString ) — игнорируется в современных версиях Delphi

            <$I+>= включить проверку процедур ввода-вывода

            <$J->= отключить записываемые константы

            <$L+>= включить локальную информацию о символах

            <$M->= отключить информацию о времени выполнения

            <$O+>= включить оптимизацию кода

            <$P+>= включить параметры открытой строки — игнорируется в современных версиях Delphi

            <$Q->= отключить проверку переполнения

            <$R->= отключить проверки диапазона

            <$T->= отключить указатели, отмеченные типом

            <$U->= отключает операции деления с плавающей запятой, совместимые с Pentium

            <$V+>= включить строгую проверку параметров коротких строк

            <$W->= генерировать фреймы стека только при необходимости

            <$X+>= включить синтаксис расширенного языка

            <$Y+>= генерировать информацию о перекрестных ссылках

            <$ Z1>= установить минимальный размер перечисления в 1 байт

            Как вы можете видеть, 5 конкретных переключателей, о которых вы спрашиваете, STILL не документированы через 15 лет с момента выпуска Delphi 7. Так что неизвестно, что они на самом деле делают, если что-нибудь.

            Илон Маск рекомендует:  Добавление треугольника
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL