Как сохранить приложение делфи
В каком виде сохраняются созданные программы? Этот вопрос возникает у любого начинающего программиста. Эта тема заслуживает отдельного внимания. Как известно, в Windows любая программа представляет собой exe-файл, который является исполняемым, т.е. может быть запущен как отдельное приложение. Понятно, что разрабатывая программу, в итоге нужно получить именно exe-файл, чтобы его можно было запустить на компьютере, где не установлена среда, в которой эта программа была создана. В языках программирования для DOS, в частности Turbo Pascal, всё довольно просто - весь программный код сохраняется в один-единственный файл, а в итоге получается exe-файл. Довольно просто и удобно. При переходе в Windows всё становится гораздо сложнее. Оконное приложение Windows не может быть сохранено в одном файле. Если в среде DOS программы можно называть именно программами, то в объектно-ориентированном программировании они называются проектами. Почему проектами? Всё достаточно просто - программа представляет собой совокупность некоторого числа файлов различного типа, определённым образом связанных между собой. Очевидно, что всю эту группу логично назвать проектом.
В этой статье мы познакомимся с самыми основными типами файлов, которые включены в любой проект, созданный на Delphi . На самом деле типов файлов гораздо больше, но эти - базовые.
*.dpr - файл проекта
Это главный файл всего проекта. Если этот файл отсутствует, запустить программу будет невозможно. В файле хранятся все основные параметры приложения, а также информация об окнах, которые в приложение включены. Файл представляет собой свободно читаемый код. Посмотреть содержимое этого файла можно командой меню Project -> View Source .
*.dfm - файл описания формы
В этом файле содержится описание всех объектов, которые расположены на форме, а также информация обо всех их свойствах. При этом в этот файл сохраняются только те свойства объектов, которые были принудительно изменены. Это объясняется тем, что все свойства любого объекта имеют значения по умолчанию (т.е. заранее установленные). Соответственно нет смысла хранить значения абсолютно всех свойств - достаточно запомнить только те, которые имеют значение, отлиное от начального. Все остальные свойства принимают своё исходное значение и таким образом вся форма восстанавливается.
*.pas - модуль (самостоятельный, либо модуль формы)
Именно этот файл больше всего похож на файл программ Turbo Pascal. В этом файле находится код программы. Модули могут быть отдельными от конкретных проектов - в этом случае их можно подключить к любому проекту и использовать. Как правило, в отдельных модулях находятся вспомогательные функции, либо какие-либо объекты. Помимо этого модуль есть у каждой формы. В результате *.pas-файл неразрывно связан с файлом *.dfm, а форма соответственно описывается этими двумя файлами - один содержит её состояние и объекты, а второй - код программы, относящийся к этой форме. Следует отметить, что модули значительно облегчают процесс написания программы и ориентацию в больших модулях - отдельные элементы большого модуля можно вынести в несколько модулей и просто подключить их к проекту.
*.res - файл ресурсов
Это дополнительный файл. В нём находятся данные различных типов - это могут быть тексты, изображения, звуки и т.д. К примеру, для проекта этот файл создаётся автоматически и в нём сохраняется иконка (значок) приложения, а также некоторая информация о проекте.
Работа с проектом
Ну а теперь пришло время рассказать о базовых операциях с проектом, так как ранее речь об этом не шла. Рассмотрим всё по порядку.
Создание нового проекта
Для создания "чистого листа" следует выбрать в меню File -> New -> Application . В разных версиях Delphi содержимое подменю New может немного отличаться, но всё основное присутствует всегда. После этого создаётся новый проект, такой, какой появляется при запуске Delphi.
Открытие существующего проекта (или файла)
Для этого существует команда File -> Open. Выбрав файл *.dpr , откроется проект, а выбрав какой-либо другой файл (например, *.pas или *.dfm ) откроется что-либо другое (например, отдельная форма).
С сохранением есть несколько тонкостей. Исходя из того, что проект представляет собой совокупность нескольких файлов, можно сделать вывод, что сохранять нужно все эти файлы, а не какой-то в отдельности. Выбрав File -> Save , Вы сохраните только текущую форму, но не более того, а проект останется "висеть в воздухе". File -> Save As. - стандартный пункт, который делает то же самое, что и Save , только позволяет пересохранить файл (форму) под другим именем. Команда Save Project As. сохраняет файл проекта (*.dpr). Таким образом, чтобы сохранить проект полностью, нужно сохранить каждую из форм и сам проект. Делать это по отдельности достаточно неудобно, поэтому существует команда, облегчающая этот процесс: File -> Save All . При вызове этой команды сначала появится диалог для сохранения формы (если форм несколько, то и диалогов будет несколько), а затем диалог для сохранения проекта. После того, как все диалоги отработали, можно с уверенностью сказать, что проект сохранён полностью.
Меню File содержит все основные команды управления проектомЖелезное правило: каждый проект должен быть сохранён в отдельном каталоге!
Если в один каталог сохранить несколько проектов, то все файлы перемешаются и можно отправлять всё в корзину. Этого нельзя делать ни в коем случае!
Запуск и остановка программы
Теперь, когда проект сохранён, программу можно и запустить и посмотреть, что же получилось. Ещё одно правило, которое желательно соблюдать: перед запуском программы проект нужно сохранить. Мгновенный вопрос: зачем? Конечно, делать это или нет - решать Вам, но бывают случаи, когда программа зависает (по вине самого программиста например), а с ней зависает и оболочка Delphi. В этом случае ничего не остаётся делать, как "убивать" Delphi через Диспетчер задач Windows. Понятно, что изменения, которые были внесены в проект, теряются. Однако не всё так плохо. Случаи зависания Delphi IDE достаточно редки. Как правило, если программа зависает, Delphi позволяет её просто уничтожить из памяти и продолжить работу. Процесс сохранения проекта перед запуском можно поручить оболочке: меню Tools -> Environment Options. , вкладка Preferences , блок Autosave options - опция Editor files .
Запомните следующие основные горячие клавиши:
Ctrl+F9 - компиляция программы. Что такое компиляция? Говоря простым языком - создание выходного (exe) файла программы. Следует отметить, что имя выходного файла совпадает с именем проекта, т.е. именем *.dpr-файла и не может быть изменено. Выходной файл создаётся в том же каталоге, где расположение *.dpr-файл. Однако компиляция просто "собирает" всю программу, но не запускает её.
F9 - запуск. В отличие от компиляции, это уже полноценный запуск программы из оболочки Delphi, однако не совсем такой, каким является запуск приложения из Windows. Запуск происходит под отладчиком. Но об этом позже.
Ctrl+F2 - остановка выполнения программы. Это именно то, о чём сказано чуть выше. Если нужно экстренно завершить работу программы, нужно активировать какое=-либо из окон оболочки Delphi и нажать это сочетание клавиш. Программа будет остановлена и можно будет безболезненно продолжить работу.
Все эти команды доступны и напрямую из меню: Run -> Run , Project -> Compile , Run -> Program Reset .
Все основные команды управления проектом вынесены также в виде кнопок на панели инструментов:
Для проекта можно установить множество разнообразных параметров. Все они находятся в окне Project -> Options . В частности, на вкладке Application можно указать заголовок проекта, который будет отображаться на кнопке программы на панели задач. Совет: всегда прописывайте заголовок своей программе, не оставляйте стандартного " Project1 " - это резко бросается в глаза. На этой же вкладке можно выбрать иконку (значок) для приложения - файл *.ico размером 32х32 пикселя. В блоке Output settings можно указать расширение выходного файла. Заполнять это поле не обязательно - по умолчанию файлу присваивается расширение .exe . Однако в некоторых случаях эта настройка бывает полезной. Например, экранные программы-заставки представляют собой те же исполняемые exe-файлы, только имеют расширение .scr . Неудобно каждый раз после внесения изменений в программу, чтобы протестировать заставку, переименовывать файл. А прописав в указанное поле " scr " проблема мигом решится.
Вкладка Application в окне свойств проекта влияет на внешний вид кнопки программы на панели задачВ этой статье рассмотрены все базовые навыки для управления проектами. Теперь можно приступить непосредственно к изучению языка и исследованию объектов.
То, что мы узнали в предыдущей части урока, позволяет работать с файлами по адресу, жёстко записанному в тексте программы. Мы же хотим иметь возможность открывать любые файлы и работать с файлами по нашему выбору. Естественно, Delphi предоставляет нам такую возможность. Рассмотрим компоненты, позволяющие в работающей программе осуществлять выбор файлов. Delphi диалоги выбора файла позволяют указать програме, с каким файлом мы хотим работать.
На вкладке палитры компонентов Dialogs находятся компонент Delphi OpenDialog и компонент Delphi SaveDialog. Все Delphi диалоги, находящиеся на этой вкладке, в том числе и Delphi диалоги выбора файла, невизуальные, т.е. при переносе их на Форму в работающей программе их не видно, они видны только на этапе конструирования. Компонент Delphi OpenDialog позволяет открыть в нашей программе стандартное Windows-окно диалога открытия файла, компонент Delphi SaveDialog - окно диалога сохранения.
Delphi диалоги выбора файла сами по себе ничего не делают, а только предоставляют настройки, сделанные пользователем при выборе файла. Самый важный метод Delphi диалогов - Execute. Он срабатывает в момент нажатия кнопки "открыть" или "сохранить" в окне выбора файла. Для примера давайте введём в программу возможность выбора файла для загрузки в редактор Memo, и сохранения после редактирования.
Итак, кидаем на Форму оба Delphi диалога, текстовый редактор Memo, и три кнопки Button. В свойство Caption одной из них записываем "Открыть. ", другой - "Сохранить", третьей - "Сохранить как. "
В обработчике OnClick кнопки "Открыть. " пишем:
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
В результате выбора файла свойство FileName компонента OpenDialog получает значение полного адреса выбранного файла, который мы и вставляем в функцию загрузки файла компонента Memo.
Всё это хорошо, но только в данном случае, когда записанное выражение записывается в одну строку. Если программа использует несколько раз выражение OpenDialog1.FileName, то писать руками устанешь. В Delphi для такого случая есть так называемый "оператор присоединения" with. Он используется для любых объектов, имеющих длинный "хвост" из свойств, которые приходится записывать многократно. Вот как он записывается:
with Объект do
begin
Свойства Объекта внутри логических скобок begin/end можно записывать непосредственно. Допускается перечислять через запятую несколько объектов. Естественно, в случае, когда внутри скобок находится один оператор, они необязательны. Перепишем фрагмент загрузки файла с использованием оператора присоединения:
with OpenDialog1, Memo1 do
if Execute then
Lines.LoadFromFile(FileName);
Запись получается более компактной.
Так как свойства компонентов OpenDialog и SaveDialog одинаковы, сохранение текста выглядит абсолютно аналогично. Создаём обработчик нажатия кнопки "Сохранить как. " и пишем:
with SaveDialog1, Memo1 do
if Execute then
begin
Lines.SaveToFile(FileName);
OpenDialog1.FileName:=FileName; // Чтобы исправленный текст не затёр источник
end;
Наконец, для кнопки "Сохранить" пишем:
Memo1.Lines.SaveToFile(OpenDialog1.FileName); // Сохраняем туда, откуда считали
(В предыдущей строчке была ошибка. Как справедливо заметил в комментариях Oraculum - OpenDialog1.FileNam e нужно писать без кавычек.)
При работе этих фрагментов можно заметить, что выбирать приходится из всех файлов в нужной директории. Удобнее видеть только, например, текстовые файлы, или другой тип файлов по нашему выбору. Для этого используются фильтры, свойство Filter в наших компонентах. Настраивается оно в Инспекторе Объектов. При выборе его можно перейти в редактор фильтров:
В колонке FilterName записываем имена фильтров, в колонке Filter - список масок файлов, разделённых точкой с запятой. Маска файла в данном случае выглядит как
* . расширение_файла ;
Теперь, пользуясь всем пройденным материалом, можно решить задачку на тему: как определить размер файла
При сохранении проекта Delphi создает несколько файлов. Некоторые из них содержат описание проекта в целом, некоторые — описания программных модулей и форм. Если проект еще ни разу не был сохранен, то в ответ на команду сохранения проекта Save Project As (Сохранить проект как), которая находится в меню File (Файл), Delphi сначала запрашивает имя программного модуля (рис. 12), затем имя проекта (рис. 13), причем требует, чтобы эти имена были разными. Здесь следует обратить внимание на то, что выполняемому файлу Delphi присваивает имя проекта.
Рис. 12. Диалоговое окно сохранения модуля
Рис. 13. Диалоговое окно сохранения проекта
5. Запуск приложения
Запустить приложение можно, не завершая работу с Delphi, для этого надо выбрать команду Run (Выполнить) меню Run.
Если ошибок в программе нет, компилятор создает исполняемый файл программы, который позже можно будет запустить непосредственно изWindows. Имя исполняемого файла такое же, как и у файла проекта, расширение — exe. Delphi помещает исполняемый файл в тот каталог, где находится файл проекта.
После ввода коэффициентов и нажатия кнопки Вычислить программа вычисляет значения корней уравнения (рис. 14).
Рис.14. Пример работы приложения "Решение квадратного уравнения"
Окно приложения ведет себя, как обычное окно Windows, его можно перемещать по экрану, развернуть на весь экран, свернуть в пиктограмму.
6. Структура простой программы Delphi
Программа Delphi представляет собой набор программных единиц — модулей. Один из модулей, главный модуль, содержит инструкции, с которых начинается выполнение программы. Главный модуль приложения формируется средой Delphi.
Ниже приведен текст главного модуля программы решения квадратного уравнения.
Главный модуль хранится в файле с расширением dpr. Чтобы увидеть текст главного модуля приложения, надо в меню View (Вид) выбрать командуProject source (Исходный текст проекта).
Forms, Root_u in 'ROOT_U.PAS' ;
Начинается главный модуль словом PROGRAM, за которым следует имя программы, которое совпадает с именем проекта. Имя программы задается программистом в момент сохранения проекта, и оно определяет имя создаваемого компилятором исполняемого файла программы. Далее, за словом USES, следуют имена используемых модулей: библиотечного модуля Forms и модуля формы Root_u.
Директива указывает компилятору, что нужно использовать файл ресурсов, который содержит описания ресурсов приложения, например, пиктограммы. Звездочка показывает, что имя файла ресурсов такое же, как и у файла проекта, но с расширением res.
Файл ресурсов не является текстовым файлом, и просмотреть его с помощью редактора текста нельзя. Для работы с файлами ресурсов используют специальные программы, например Resource Workshop. Можно использовать также входящую в состав Delphi утилиту ImageEditor, доступ к которой можно получить, выбрав команду Image Editor (Редактор образов) меню Tools (Сервис).
Исполняемая часть главного модуля находится между BEGIN и END. Инструкции выполняемой части обеспечивают инициализацию приложения и вывод на экран стартового окна. Помимо главного модуля каждая программа включает в себя как минимум один модуль формы, который содержит описание стартовой формы приложения и поддерживающих ее работу процедур. В Delphi каждой форме соответствует свой модуль.
Ниже приведен текст модуля формы для программы решения квадратного уравнения.
SysUtils, WinTypes, WinProcs, Messages, Classes, Controls, Forms, Dialogs, StdCtrls;
Procedure Button1Click(Sender: TObject);
+'Коэффициент при второй степени' +chr(13)+'неизвестного равен нулю'
labell.caption = 'Корни уравнения:' +chr(13)+'xl='+sl
Начинается модуль словом UNIT, за которым следует имя модуля. Именно это имя упоминается в списке используемых модулей в инструкции USESглавного модуля приложения.
Состоит модуль из трех частей: раздела интерфейса, раздела реализации и раздела инициализации.
- Раздел интерфейса (начинается словом INTERFACE) сообщает компилятору, какая часть модуля является доступной для других модулей программы. Здесь перечислены используемые модулем другие библиотечные модули, описание сформированного Delphi типа Tform1, описание доступных другим модулям переменных.
- Раздел реализации (начинается словом IMPLEMENTATION) содержит локальные объявления и реализацию процедур и функций, поддерживающих работу формы. Начинается раздел директивой , указывающей компилятору, что в раздел реализации надо вставить инструкции установки значений свойств формы, которые находятся в файле с расширением dfm, имя которого совпадает с именем модуля. Файл *.dfm на основе внешнего вида формы генерируется средой Delphi. Просмотреть файл DFM можно при помощи редактора текста. За директивой следует описание обработчиков событий формы. Сюда же программист может поместить описание своих процедур и функций, которые могут вызываться из обработчиков событий обычным образом.
- Раздел инициализации позволяет выполнить инициализацию переменных модуля. Инструкции раздела инициализации располагаются после раздела реализации между BEGIN и END. Если раздел инициализации не содержит инструкций (как в приведенном примере), то слово BEGIN не указывается.
Следует отметить, что значительное количество инструкций в модуль записывает Delphi. Например, Delphi, анализируя действия программиста по созданию формы, формирует описание класса формы. В приведенном примере инструкции, набранные программистом, выделены серым фоном. Очевидно, что средой Delphi выполняется значительная часть работы по составлению текста программы.
На прошлом уроке мы создали простейшую форму чтения из текстового файла test.txt, его редактирование и последующее сохранение в него же. Это, конечно же, очень далеко напоминает блокнот, идущий в комплекте с ОС Windows. В нашем блокноте открытие происходит только одного файла и сохранение в него же. Открытие производится при нажатии на кнопки, которые расположены на самой форме и никак не вписываются в удобство интерфейса. Первым делом давайте представим нашу программу пользователю в более удобном виде, добавим главное меню, которое является неотъемлемой частью всех прикладных приложений.
В Delphi уже разработан визуальный компонент «MainMenu», позволяющий быстро и легко реализовать стандартное главное меню. Этот компонент находится на вкладке «System» палитры компонентов:
При использовании этого компонента, в нашу форму встраивается поле под заголовком формы. Давайте немного изменим вид нашего блокнота (возьмем за основу MyNotepad v1). Уберем кнопки «Открыть» и «Закрыть», при этом очистите их код, достаточно удалить команду, расположенную в процедуре кнопок, между begin end, например, для кнопки «Открыть» удалить только «txt.Lines.LoadFromFile(ExtractFilePath(application.ExeName)+('\test.txt'));», после чего, при сохранении или запуске проекта, эти процедуры автоматически будут удалены. Немного расширим текстовое поле, например, так:
Для того что бы форма автоматически приняла размеры по краям расположенных на ней компонентов, можно включить свойство формы «AutoSize»:
Все. Немного видоизменили.
Теперь добавляем на форму компонент MainMenu, расположенный на вкладке «System» в палитре компонентов. Для добавления, достаточно его выбрать на палитре компонентов и щелкнуть один раз ЛКМ по форме. Для того чтобы создать пункты главного меню, кликните два раза ЛКМ по изображению компонента, находящегося на форме:
У вас откроется редактор пунктов меню:
Щелкаем ЛКМ по синей области, и вводим свойство «Caption» - «Файл»
Будет создан главный пункт меню «Файл». Кликните еще раз по созданному пункту «Файл», после чего у Вас появится вложенное пустое поле. В него введите «Открыть…» и задайте для этого пункта имя «fOpen» в свойстве Name
Для удобства работы с приложениями используются горячие клавиши. При задании горячих клавиш своим приложениям необходимо по максимум использовать общие для всех приложений сочетания, принятые в системе Windows. Например, Ctrl+O – открыть файл, Ctrl+S – сохранить и т.д.
Зададим нашему пункту сочетание Ctrl+O, по нажатию которого, будет происходить вызов диалога открытия файла. Для этого достаточно в свойстве «ShortCut» выбрать это сочетание из списка:
Добавим еще два пункта «Сохранить» и «Сохранить как…», при этом для «Сохранить» будем использовать горячую клавишу Ctrl+S, а для «Сохранить как» не будет горячих клавиш (Но Вы, при желании, можете установить). Имена пунктов «fSave» и «fSaveAs».
И еще добавим пункт «Выход» без горячих клавиш, который будет закрывать наше приложение.
Для удобного восприятия и группировки меню, необходимо его разделить на части. Чтоб это сделать, достаточно в новом пункте меню, в свойство Caption, записать «-», после чего будет создана разделительная черта. Итоговый вид меню будет выглядеть так:
Обратите внимание, на нашей форме появилось главное меню:
Диалоги OpenDialog и SaveDialog
Для открытия и сохранения файлов используются формы диалогов, позволяющие выбрать файл(ы), отфильтровать их по типам, которые поддерживаются программой. Пример диалога:
Такие диалоговые окна уже реализованы в среде Delphi. Располагаются они на вкладке «Dialogs»
Для нашего приложения потребуются OpenDialog и SaveDialog, выберите их и добавьте на форму, аналогично компоненту MainMenu.
Задайте имена этим диалогам fOpenDialog, fSaveDialog
Если кликнуть два раза по иконке компонента, то откроется форма диалога:
Как Вы видите, диалоговое окно не имеет фильтров по типам файлов. Для того чтоб создать список поддерживаемых типов, необходимо выделить тип диалога и перейти в пункт «Filter»
Нажав на «…» откроется окно редактирования фильтров:
Наш блокнот открывает файлы формата txt, а так же можно осуществлять попытки открытия файлов, которые предположительно содержат текст, например «html».
Создадим два фильтра следующим образом:
Теперь при двойном клике по диалогу открытия мы видим, что файлы отображаются согласно выбранного фильтра:
Если нужно чтоб по умолчанию стоял определенный фильтр, необходимо в свойстве «FilterIndex» указать номер фильтра в списке:
Для этого разверните список «Options» диалога fSaveDialog и измените параметр ofOverwritePrompt с false на true:
На этом пока остановимся. В следующей части урока перейдем к кодингу созданных элементов.
Читайте также: