Опубликован: 07.04.2008 | Уровень: специалист | Доступ: свободно
Лекция 11:

Структура проекта

< Лекция 10 || Лекция 11: 12 || Лекция 12 >

Далее идет описание глобальных записей, констант и переменных. Здесь у нас есть только одна глобальная переменная:

var
  fMain: TfMain;

Это – форма. Да, да, не удивляйтесь, форма – это переменная типа TForm. Точнее, не просто переменная, а объект со своими свойствами, событиями и методами.

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

В этом разделе глобальных переменных мы можем создать собственную переменную:

var
  fMain: TfMain;
  adres: String; //для адреса, откуда запущена программа

Затем выделить главную форму, перейти на вкладку Events (События) и двойным щелчком мыши сгенерировать событие OnCreate, которое происходит однажды, при создании формы, или же OnActivate, которое происходит, когда форма становится активной. В этом событии прописать такую строку:

adres := ExtractFilePath(Application.ExeName);

Переменную adres в процедуре описывать не нужно – она глобальная, и мы ее уже описали. Функция Application.ExeName вернет полное имя файла нашей программы, а функция ExtractFilePath() вычленит из этого имени адрес, и вернет его. В дальнейшем, в любой процедуре или функции модуля, где будет необходимо обратиться к файлу, например, myparam.ini, который находится там же, откуда запущена программа, достаточно указать:

... adres + 'myparam.ini' ...

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

Далее идет раздел implementation. Это раздел реализации. Он содержит сами процедуры и функции, которые поддерживают работу этой формы. Кроме того, в этом разделе также может присутствовать директива uses, в которой объявлены модули, подключенные к данной форме. Данный раздел необязателен – если в вашем проекте только одна форма, то раздела не будет вовсе. Если есть еще одна форма, как в нашем примере – форма fAbout, модуль которой называется About, то этот раздел добавляется автоматически, как только вы воспользуетесь командой File -> Use Unit. Сразу под ключевым словом implementation у нас есть строка

uses About;

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

Далее вы видите такую строку, выделенную зеленым цветом:

{$R *.dfm}

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

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

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

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

end.

Обратите внимание, что слова begin перед ней нет, и быть не должно! Это – единственное исключение из правила скобок begin..end. Собственно, это даже не исключение, потому что эта end не является закрывающей скобкой, это завершение модуля.

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

Файлы проекта

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

Таблица 11.1. Описание файлов проекта
Расширение Описание файла
*.cfg Этот файл содержит конфигурацию всего проекта, поэтому он один, и имеет имя, как у проекта. Редактировать этот файл вручную не стоит, если не хотите испортить проект.
*.dof Этот файл содержит опции проекта – настройки, версию Delphi, версию проекта, используемые модули и многое другое. Редактировать этот файл вручную нельзя.
*.dpr Это сам проект. Это текстовый файл с описанием используемых форм и модулей, а также процедура инициализации программы. Редактировать такой файл вручную можно, но только опытным программистам, которые точно знают, что они делают, и для чего это нужно. Даже им это бывает необходимо очень редко, поэтому лучше файл не трогать. Однако можно загрузить проект, просто щелкнув по нему дважды, либо поставить на него курсор и нажать Enter. Если Delphi не загружена, она загрузится и загрузит проект.
*.res Файл ресурсов проекта, таких как иконки, курсоры и так далее.
*.pas Модуль формы. Этот файл мы видим в редакторе кода, его мы редактируем. Таких файлов имеется по одному на каждую форму проекта.
*.dfm Это файлы с информацией о форме. Тут содержатся описания используемых компонентов и их настройки.
*.ddp Это вспомогательные файлы модуля, они генерируются автоматически.
*.dcu Откомпилированный файл модуля. Фактически, та же программа, но только для одного модуля. Работать самостоятельно она не может.
*.exe Готовая программа. Компилятор собирает все *.dcu в единый исполняемый файл. Если вы в проекте не использовали других файлов, таких как базы данных, например, то этот файл единственный, который нужен. При распространении программы отдавайте пользователю только его. Однако это не значит, что все остальные файлы можно удалить. Ведь в них ваш проект! В будущем, возможно, вам понадобится процедура или функция, аналогичная той, которую вы использовали в проекте. Чтобы заново не изобретать велосипед, просто откройте старый проект и посмотрите, как вы реализовали эту функцию. Скопируйте ее и вставьте в новый проект, если нужно.
*.~* Файлы, расширение которых начинается с тильды – это резервные копии модулей и форм. Когда вы производите изменения и сохраняете проект, появляется такой файл. Это предыдущее сохранение. Если вы сохранили проект, и увидели, что ошиблись – его можно восстановить из этого файла. Однако лучше всего делать архивные копии проекта перед каждым серьезным изменением программы.

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

< Лекция 10 || Лекция 11: 12 || Лекция 12 >
Виктор Пелих
Виктор Пелих
Работа с BDE в Delphi 11
Федор Антонов
Федор Антонов
Оплата и обучение
Руслан Дюсенов
Руслан Дюсенов
Россия, Астрахань, Астраханский Государственный Технический Университет, 2009