Сохранение проекта
Проект — это набор файлов, используя которые компилятор создает исполняемый файл программы (ЕХЕ-файл). В простейшем случае проект состоит из файла описания проекта (DOF-файл), файла главного модуля (DPR-файл), файла ресурсов (RES-файл), файла описания формы (DFM-файл), файла модуля формы, в котором находятся основной код приложения, в том числе функции обработки событий на компонентах формы (PAS-файл), файл конфигурации (CFG-файл).
Чтобы сохранить проект, нужно из меню File выбрать команду Save Project As. Если проект еще ни разу не был сохранен, то Delphi сначала предложит сохранить модуль (содержимое окна редактора кода), поэтому на экране появится окно Save Unitl As. В этом окне (рис. В36) надо выбрать папку, предназначенную для файлов проекта, и ввести имя модуля. После нажатия кнопки Сохранить, появляется следующее окно (рис. В37), в котором необходимо ввести имя файла проекта.
Рис. В36. Сохранение модуля формы
Рис. В37. Сохранение проекта
Обратите внимание на то, имена файлов модуля (pas-файл) и проекта (dpr-файл) должны быть разными. Имя генерируемого компилятором исполняемого файла совпадает с именем проекта. Поэтому файлу проекта следует присвоить такое имя, которое, по вашему мнению, должен иметь исполняемый файл программы, а файлу модуля — какое-либо другое имя, например, полученное путем добавления к имени файла проекта порядкового номера модуля.
Примечание
Так как проект представляет собой набор файлов, то рекомендуется для каждого проекта создавать отдельную папку.
Файлы проекта Delphi
В первой статье мы рассмотрели интерфейс Delphi, теперь давайте сохраним наш проект(File-> Save Project as) создайте папку и сохраните, теперь давайте откомпилируем проект (Project –> built и Project -> Compile). Посмотрим, что у нас образовалось в папке с нашими файлами.
|
У меня получилось:
Как видно, чтобы исполняемый файл не был такого большого размера, как у меня (Project1.exe – 360 Кб), давайте сделаем следующее – Project->Options->Вкладка Packages поставьте галочку:
Потом повторим компиляцию. Теперь мой Project1.exe весит всего 17 кб. Имейте это ввиду, т. к. у Вас возможно будут большие программки и желательно, чтобы много места они не занимали.
Давайте кратко теперь познакомимся с файлами:
- файл проекта (.dbr) это текстовый файл используется для хранения информации о формах и модулях. В нем содержатся операторы инициализации и запуска программы на выполнение.
- файл модуля (.pas) соответствующий файл модуль для хранения кода.
- файл формы (.dfm) – это двоичный файл, который создается для хранения информации о ваших формах и фреймах.
- файл опций проекта (.dof) — в нем хранится установки опций проекта.
- файл конфигурации проекта (.cfg) в нем хранятся установки проекта.
- файл ресурсов (.res) содержит пиктограмму и прочие ресурсы.
- файл группы файлов (.bpg) для создания групп файлов.
- резервные копии (~dp,~df,~pa).
Варианты компиляции и сообщения компилятора
Компиляция с последующим выполнением приложения осуществляется командой Run | Run или горячей клавишей F9. Выполнение будет проводиться только в случае, если при компиляции не обнаружены неисправимые ошибки и загрузочный модуль создан. Компиляция без последующего выполнения приложения осуществляется командой Project | Compile Project или горячими клавишами Ctrl-F9. В обоих вариантах команд компилируются только те модули, которые были изменены с момента последней компиляции. Такая выборочная компиляция позволяет в больших проектах экономить немало времени, поскольку модули, которые не изменялись, повторно не компилируются. Однако такая выборочная компиляция не всегда устраивает разработчика. Например, это не устроит вас, если вы ничего не меняли в самих модулях, а только изменили опции компилятора: например, включили ранее отключенную оптимизацию кода (флажок Optimization страницы Compiler окна Project Options, которое вы можете вызвать командой Project | Options) или убрали ранее использованную поддержку пакетов времени выполнения.
|
В этих случаях вам надо перекомпилировать все модули проекта, независимо от того, изменялись они или нет. Для такой принудительной компиляции существует команда Project | Build Project. Она компилирует все файлы проекта независимо от времени их предыдущей компиляции. В меню Project имеется еще две команды компиляции: Compile All Projects и Build All Projects. Если вы работаете только с одним проектом, то эти команды идентичны рассмотренным командам Compile Project и Build Project. Но если вы работаете с группой проектов, то первая из этих команд осуществляет выборочную компиляцию всех измененных с момента последней компиляции файлов всех проектов группы, а вторая принудительно компилирует все файлы всех проектов группы.
В результате компиляции могут быть сделаны замечания — Hint, предупреждения — Warning и сообщения об ошибках — Error. Чтобы посмотреть эти сообщения, давайте сделаем простое приложение с ошибочными операторами. Начните новое приложение, перенесите на форму окно редактирования Edit и кнопку. В окно занесите (в свойство Text) число 10. Объявите глобальные переменные i и j типа word, а в обработчик щелчка кнопки введите указанные ниже операторы. При этом весь раздел implementation вашего приложения должен иметь вид:
|
Implementation
{$R *.DFM}
var i,j:word;
procedure TForm1.Button1Click(Sender: TObject);
var A:double;
begin
for i:=1 to 5 do
A:= A * A;
Edit1.Text:= B;
end;
Попробуйте нажать клавишу F9. Вы увидите в окне Редактора Кода внизу сообщения о замечаниях и ошибках. Первое сообщение:
[Warning] Unit1.pas(30): For loop control variable must be simple local variable
([Предупреждение] модуль Unit1.pas, строка 30: Для цикла For управляющая переменная должна быть простой локальной переменной)
Это просто предупреждение, рекомендующее использовать для управляющей переменной цикла локальную, а не глобальную переменную. С этим замечанием
вы можете согласиться, а можете и не соглашаться. Во всяком случае, в данном приложении введение глобальной управляющей переменной ни к каким неприятностям не приведет.
Следующее сообщение:
[Error] Unit1.pas(32): Undeclared identifier: 'В'
([Ошибка] модуль Unit1.pas, строка 32: Необъявленный идентификатор 'В')
Это уже сообщение об ошибке. В данном случае вместо переменной А мы указали переменную В, которая не была объявлена. Строка кода с этой ошибкой выделена в окне Редактора Кода, и курсор остановился около необъявленного идентификатора. Ошибки такого рода будут у вас чаще всего — это результат описки в имени переменной, компонента, свойства, метода, функции.
Если в приложении несколько ошибок, то соответственно будет и несколько сообщений о них. Перейдя в окно сообщений и сделав двойной щелчок на каком-нибудь из сообщений, вы увидите, что в окне Редактора Кода выделится строка, соответствующая этому сообщению.
Поскольку рассмотренная выше ошибка неисправима, то в данном примере вь видите внизу последнее сообщение:
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
([Неисправимая ошибка] проект Project1.dpr, строка 5: Невозможно компилировать используемый модуль 'Unit1.pas')
Таким образом, в данном случае выполняемый модуль не сформирован и приложение не выполняется.
Если вы исправите в ошибочном операторе переменную В на А, то получите новое сообщение об ошибке:
[Error] Unit1.pas(32): Incompatible types: 'String' and 'Double'
([Ошибка] модуль Unit1.pas, строка 32: Несовместимые типы 'String' и 'Double')
Действительно, нельзя присвоить переменной типа string — тексту окна редактирования Text значение переменной А, объявленной как double. Подобные ошибки использования несовместимых типов тоже очень распространены и вы, вероятно, не раз невольно будете их делать.
Правильный оператор в нашем примере должен иметь вид:
Edit1.Text:= FloatToStr(A);
Исправив этот оператор, не нажимайте пока клавишу F9, поскольку приложение запустится на выполнение и вы не увидите еще сообщений, которые появятся Нажмите лучше Ctrl-F9 — компиляцию без выполнения. На этот раз сообщения о неисправимой ошибке не будет и выполняемый модуль создастся. Но появится замечание:
[Hint] Unit1.pas(25): Variable 'j' is declared but never used in 'Unit1’
([Замечание] модуль Unit1.pas, строка 25: Переменная 'j' объявлена, но нигде в 'Unit1 не используется)
Действительно, мы объявили переменную j, но не использовали ее. Если эта переменная — заготовка для каких-то будущих процедур, то это замечание можно проигнорировать. Но если переменная j действительно не нужна, то её объявление лучше удалить из текста, так как под эту переменную тратится, конечно, небольшой, но совершенно бессмысленный объем памяти.
С этим замечанием мы разобрались. Но у нас появилось еще одно более серьезное предупреждение:
[Warning] Uhitl.pas(31): Variable 'A' might not have been initialized ([Предупреждение] модуль Unit1.pas, строка 31: Переменная 'А' может оказаться не инициализированной).
Действительно, мы ввели локальную переменную А и нигде не задали ее начальное значение. С точки зрения компилятора это не ошибка, а замечание. Но для программы это действительно ошибка, так как, строго говоря, неизвестно, чему будет равно значение этой переменной при входе в процедуру. Если мы хотим. например, чтобы при каждом выполнении процедуры значение А равнялось 1, мы должны добавить перед циклом оператор:
A:= 1;
Если же мы хотим, чтобы в переменной А накапливался результат при каждом щелчке на кнопке, мы должны убрать ее объявление из процедуры и ввести ее объявление после объявления раздела implementation, задав для неё начальное
значение 1:
var A:double=1;
Этот пример показывает, что не надо пренебрегать замечаниями компилятора. Всегда лучше перед запуском на выполнение сначала просто откомпилировать проект, тщательно проанализировать каждое замечание, и только исправив всё, что требует исправления, выполнять приложение. Это сэкономит вам время, которое в противном случае вы потратите на поиск причин, по которым ваша программа работает неправильно.
Просматривайте все замечания компилятора и стремитесь найти и устранить причины, вызвавшие эти замечания. Игнорируя их, вы рискуете снизить надежность и эффективность своего приложения.
Пусть в нашем примере мы хотим накапливать результат в переменной А. Объявим А как глобальную переменную. Это нам будет полезно в дальнейшем для наблюдения её изменения во время выполнения. Но для сохранения А мы выберем не те варианты, которые были указаны выше, а третий вариант, при котором начальное значение А при щелчке на кнопке берётся из окна Edit1, и в этом же окне хранится значение, полученное после предыдущего щелчка на кнопке. Тогда перед выполнением цикла надо прочитать значение А из окна Edit1.
И ёще одно замечание. Далее мы будем использовать наше приложение для вылавливания ошибок времени выполнения. Но при использовании Delphi 7 результаты этих ошибок могут быть различными в зависимости от настройки ИСР и вашего компьютера. Чтобы избежать этого, давайте сделаем в приложении ещё некоторые добавления. Введем оператор uses, ссылающийся на модуль Math, и добавим обработчик события OnCreate нашей формы вида:
SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
На смысле этих добавлений мы сейчас останавливаться не. После всех исправлений ваш код должен иметь вид:
Implementation
{$R *.dfrn}
uses Math;
var A:double;
procedure TForm1.Button1Click(Sender: TObject);
var i: word;
begin
A:= StrToFloat(Edit1.Text);
for i:=1 to 5 do
A:= A * A;
Edit1.Text:= FloatToStr(A);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin SetExceptionMask[exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]);
end;
end.
Теперь откомпилируйте ваше приложение и выполните его.
Создание иконки приложения |
Создание иконки необходимо выполнять в несколько этапов: 1) необходимо воспользоваться пунктом главного меню Tools/Image Editor; 2) в открывшемся диалоговом окне Image Editor воспользоваться пунктом меню File/New/Icon File(.ico) для созда- ния иконки; Рис. 2.2. Определение свойств создаваемой иконки 3) выбрать размер создаваемой вами иконки (рис. 2.2). Далее создаем рисунок иконки и сохраняем ее в каталоге данного про- екта. Затем в свойстве Icon компонента Form устанавливаем путь к файлу с иконкой. |
Начало работы
Запускается Delphi обычным образом, т. е. выбором из меню Borland Delphi 7 команды Delphi 7 (рис. В6).
Рис. В6. Запуск Delphi
Вид экрана после запуска Delphi несколько необычен (рис. В7). Вместо одного окна на экране появляются пять:
- главное окно — Delphi 7;
- окно стартовой формы — Form 1;
- окно редактора свойств объектов — Object Inspector;
- окно просмотра списка объектов — Object TreeView;
- окно редактора кода — Unitl.pas.
Окно редактора кода почти полностью закрыто окном стартовой формы.
Рис. В7. Вид экрана после запуска Delphi
В главном окне (рис. В8) находится меню команд, панели инструментов и палитра компонентов.
Окно стартовой формы (Forml) представляет собой заготовку главного окна разрабатываемого приложения.
Программное обеспечение принято делить на системное и прикладное. Системное программное обеспечение — это все то, что составляет операционную систему. Остальные программы принято считать прикладными. Для краткости прикладные программы называют приложениями.
Рис. В8. Главное окно
Окно Object Inspector (рис. В9) — окно редактора свойств объектов предназначено для редактирования значений свойств объектов. В терминологии визуального проектирования объекты — это диалоговые окна и элементы управления (поля ввода и вывода, командные кнопки, переключатели и др.). Свойства объекта — это характеристики, определяющие вид, положение и поведение объекта. Например, свойства width и Height задают размер (ширину и высоту) формы, свойства тор и Left — положение формы на экране, свойство caption — текст заголовка.
Рис. В9. На вкладке Properties перечислены свойства объекта и указаны их значения
Рис. В10. Окно редактора кода
В окне редактора кода (рис. В10), которое можно увидеть, отодвинув в сторону окно формы, следует набирать текст программы. В начале работы над новым проектом это окно редактора кода содержит сформированный Delphi шаблон программы.
Предупреждения и подсказки.
Компилятор переходит ко второму этапу генерации выполняемой программы только в том случае, если исходный текст не содержит синтаксических ошибок. В большинстве случаев в только что набранной программе есть ошибки. Программист должен их устранить. Процесс устранения ошибок носит итерационный характер. Обычно сначала устраняются наиболее очевидные ошибки, например, объявляются необъявленные переменные. После очередного внесения изменений в текст программы выполняется повторная компиляция.
Следует обратить внимание на то, что компилятор не всегда может точно локализовать ошибку. Поэтому, анализируя фрагмент программы, который, л о мнению компилятора, содержит ошибку, нужно обращать внимание не только на тот фрагмент кода, на который компилятор установил курсор, но и на тот, который находится в предыдущей строке. Например, в следующем фрагменте кода:
// вычислить ток
i = u/r
//. вывести результат в поле метки
Label4 › Caption = "Ток: " +
FloatToStrF(i,ffGeneral,7.2) + " А";
Не поставлена точка с запятой после оператора присваивания. Компилятор это обнаруживает, выводит сообщение statement missing;, но выделяет строку Label4 › caption = "Ток: " + и устанавливает курсор после идентификатора Label4.
В табл. 2.10 перечислены типичные ошибки и соответствующие им сообщения компилятора.
Таблица 2.10. Типичные ошибки.
Сообщение | Ошибка |
Undefined symbol(неизвестный символ) | Используется необъявленная переменная Имя переменной, функции или параметра записано неверно. Например, в программе объявлена переменная Summ, а в инструкциях используется sum |
Statement missing;(отсутствует точка с запятой) | После инструкции не поставлена точка с запятой |
Unterminated string or character constant(незаконченная строковая или символьная константа) | В конце строковой константы, например, текста сообщения, нет двойных кавычек |
expected (ожидается закрывающая скобка) | При записи арифметического выражения, содержащего скобки, нарушен баланс открывающих и закрывающих скобок |
if statement missing ((в инструкции if нет открывающей скобки) | В инструкции if условие не заключено в скобки |
Compound statement missing | Нарушен баланс открывающих и закрывающих фигурных скобок. Вероятно, не поставлена закрывающая фигурная скобка отмечающая конец функции или группы инструкций, например, после условия или слова else в инструкции if |
Extra parameter in call to(лишний параметр при вызове функции) | Неверно записана инструкция вызова функции, указан лишний параметр |
Если компилятор обнаружил достаточно много ошибок, то просмотрите все сообщения и устраните сначала наиболее очевидные ошибки и выполните повторную компиляцию. Вполне вероятно, что после этого количество ошибок значительно уменьшится. Это объясняется особенностями синтаксиса языка, когда одна незначительная ошибка может "тащить" за собой довольно большое количество других.