Структура простого проекта Дельфи

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

Примечание:

Главный модуль хранится в файле с расширением .dpr. Для того чтобы увидеть текст главного модуля приложения, необходимо выбрать команду View Source (Просмотреть исходный код) меню Project.

На листинге 1 приведен пример главного модуля программы пересчета веса из фунтов в килограммы.

Листинг 1. Главный модуль приложения Фунты-Килограммы program FuntToKg; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.Title := 'Фунты-килограммы'; Application.CreateForm(TForm1, Form1); Application.Run; end.

Главный модуль начинается словом Program, за которым следует имя программы, совпадающее с именем проекта. Имя проекта задается программистом в момент сохранения файла проекта, и оно определяет имя создаваемого компилятором исполняемого файла программы. Далее за словом uses следуют имена используемых модулей: библиотечного модуля Forms и модуля формы Unti1.pas

Похожая на комментарий директива {$R *.RES} указывает компилятору, что нужно использовать файл ресурсов, который содержит описания ресурсов приложения, например, пиктограммы. Звездочка показывает, что имя файла ресурсов такое же, как и у файла проекта, но с расширением .res

Примечание:

Файл ресурсов не является текстовым файлом, поэтому просмотреть его с помощью текстового редактора нельзя. Для работы с файлами ресурсов используются специальные программы, например, Resource Workshop. Можно также использовать входящую в состав Дельфи утилиту Image Editor, доступ к которой можно получить выбором команды Image Editor меню Tools.

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

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

На листинге 2 приведен текст модуля программы пересчета веса из фунтов в килограммы.

Листинг 2. Модуль программы Фунты-килограммы unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var f:real;//вес в фунтах k:real;//вес в килограммах begin f:=StrToFloat(Edit1.Text);//перевели содержимое Edit1 в число k:=f*0.4059; label2.Caption:=Edit1.text+' фунт(а/ов) это '+ FloatToStr(k)+ ' килограмм'; end; end.

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

Модуль состоит из трех разделов: интерфейса, реализации и инициализации.

Раздел интерфейса (начинается словом interface) сообщает компилятору, какая часть модуля является доступной для других модулей программы. В этом разделе перечислены библиотечные модули, используемые данным модулем, а также находится сформированное Дельфи описание формы (типа), которое следует за словом type.

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

Далее идет директива {$R *.DFM}, указывающая компилятору, что в раздел реализации надо вставить инструкции установки значений свойств формы, которые находятся в файле с расширением .dfm. Файл в формате DFM генерируется Дельфи на основе внешнего вида формы. На листинге 3 приведен текст файла unit1.dfm нашего проекта перевода из фунтов в килограммы. На этом примере очень хорошо видно как Delphi хранит свойства объектов.

Листинг 3. Текст файла unit1.dfm проекта Фунты-килограммы object Form1: TForm1 Left = 191 Top = 108 Width = 290 Height = 185 Caption = 'Фунты-килограммы' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 24 Top = 16 Width = 250 Height = 13 Caption = 'Введите вес в фунтах и щелкните на <Пересчет>' end object Label2: TLabel Left = 24 Top = 80 Width = 121 Height = 73 WordWrap = True end object Edit1: TEdit Left = 24 Top = 48 Width = 121 Height = 21 TabOrder = 0 end object Button1: TButton Left = 160 Top = 48 Width = 75 Height = 25 Caption = 'Пересчет' TabOrder = 1 OnClick = Button1Click end end

За директивой {$R *.DFM} следует описание процедур обработки событий формы. Сюда же программист может поместить описание своих процедур и функций, которые могут вызываться из процедур обработки событий.

Раздел инициализации позволяет выполнить инициализацию переменных модуля. Инструкции раздела инициализации располагаются после раздела реализации между begin и end. Если раздел инициализации не содержит инструкций (как в приведенном примере), то слово begin не указывается.

Следует отметить, что значительное количество инструкций модуля формирует Delphi. Например, Delphi, анализируя действия программиста по созданию формы, формирует описание класса формы (после слова type).

Вывод (запись) в файл

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

Объявление файла

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

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

В общем виде объявление файла выглядит так:

Имя: file of Тип_Элементов;

Приведу несколько примеров:

res: file of char; {файл символов}

numb: file of integer; {файл целых чисел}

Файл, компонентами которого являются данные символьного типа, называется символьным или текстовым. Описание текстового файла в общем виде выглядит так:

Имя: TextFile;

Назначение файла

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

Имя файла задается с помощью процедуры AssignFile, связывающей файловую переменную с конкретным файлом.

Описание процедуры AssignFile выглядит так:

AssignFile( var f, Имя_файла: string);

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

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

AssignFile(f,'c:\Windows\1.txt');

AssignFile(f,'\students\results.txt');

А если необходимый вам файл находится в той же директории, что и ваша программа, то объявление процедуры может выглядеть так:

AssignFile(f,'config.cfg');

Вывод в файл

Непосредственно вывод в текстовый файл осуществляется при помощи знакомых всем инструкций write или writeln. В общем виде эти инструкции можно записать так:

write(Файловая_перменная, Список_Вывода);

где, Файловая_переменная - переменная, идентифицирующая файл, в который выполняется вывод.

Список_Вывода - разделенные запятыми имена переменных, значения которых надо записать в файл. Помимо имен переменных в список вывода можно включать и строковые константы.

Например, если переменная f является переменной типа TextFile, то инструкция вывода значений переменных x1 и x2 может быть такой:

write(f, ' Корни введенного уравнения: ',x1,x2);

Различие между инструкциями write и writeln состоит в том, что инструкция writeln после вывода всех значений, указанных в списке вывода, записывает в файл символ "новая строка".

Открытие файла для вывода

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

Возможны следующие режимы открытия файла для записи в него данных:

Перезапись (запись нового файла поверх существующего или создание нового файла, если его не существует)

Добавление в существующий файл (как правило в конец файла, но можно записать данные и в произвольное место)

Для того, чтобы открыть файл в режиме создания нового файла или замены существующего, необходимо вызвать процедуру Rewrite(f), где f - файловая переменная типа TextFile.

Для того, чтобы открыть файл в режиме добавления, необходимо вызвать процедуру Append(f), где f - файловая переменная типа TextFile.

Для того, чтобы понять принцип работы с файлами создадим пробную программу. На форме будут две командных кнопки. Одна с надписью "Создать", другая - "Добавить". При нажатии на кнопку "Создать" (Button1) будет создаваться текстовый файл и в него будет записано 3 строки. При нажатии "Добавить" в конец файла будет добавлено еще 3 строки текста.

Процесс создания программы рассмотрим по частям. Для начала напишем обработчик события кнопки "Создать" (Button1). Этот код будет выглядеть примерно так:

Листинг 4. Создание нового или замена существующего файла procedure TForm1.Button1Click(Sender: TObject); var f:TextFile; i:integer; begin AssignFile(f,'D:\test.txt');{Объявляем файл} Rewrite(f); {Открываем файл} for i:=1 to 3 do writeln(f,'Строка ',i);{записываем в файл} CloseFile(f);{закрываем файл} end;

В результате выполнения приведенной выше процедуры на диске D: появится файл test.txt. Его содержание будет таким:

Строка 1

Строка 2

Строка 3

На листинге 5 приведена процедура, которая запускается щелчком командной кнопки "Добавить".

Листинг 5. Добавление в существующий файл procedure TForm1.Button2Click(Sender: TObject); var f:TextFile; i:integer; begin AssignFile(f,'D:\test.txt');{объявляем файл} Append(f);{открываем для добавления} for i:= 4 to 6 do writeln(f,'Строка ',i);{записываем} CloseFile(f);{закрываем файл} end;

В результате нажатия на первую кнопку, а затем на вторую содержимое файла test.txt изменится и его содержимое станет таким:

Строка 1

Строка 2

Строка 3

Строка 4

Строка 5

Строка 6

Если после щелчка на кнопке "Добавить", нажать еще раз кнопку "Создать", то файла будет содержать только три строки.

Исходные коды это программки для Дельфи 5 вы можете скачать здесь.

На всякий случай приведу полный код приложения:

Листинг 6. Полный код программы работы с файлами unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var f:TextFile; i:integer; begin AssignFile(f,'D:\test.txt');{Объявляем файл} Rewrite(f); {Открываем файл} for i:=1 to 3 do writeln(f,'Строка ',i);{записываем в файл} CloseFile(f);{закрываем файл} end; procedure TForm1.Button2Click(Sender: TObject); var f:TextFile; i:integer; begin AssignFile(f,'D:\test.txt');{объявляем файл} Append(f);{открываем для добавления} for i:= 4 to 6 do writeln(f,'Строка ',i);{записываем} CloseFile(f);{закрываем файл} end; end.

Ошибки открытия файла

Попытка открыть файл может завершиться неудачей и вызвать ошибку времени выполнения. Причин неудачи открытия файла может быть несколько. Например, программа может попытаться открыть файл на гибком диске, который не готов к работе (не закрыта шторка накопителя или диск не вставлен в накопитель). Другая причина - отсутствие открываемого в режиме добавления файла.

Программа может взять на себя задачу контроля за результатом выполнения инструкций открытия файла. Сделать это можно, проверив значение функции IOResult (Input - Output Result - результат ввода-вывода). Функция IOResult возвращает 0, если операция ввода-вывода завершилась успешно, в противном случае - не ноль.

Для того, чтобы программа смогла проверить результат выполнения операции ввода-вывода, нужно разрешить ей это делать. Для этого надо перед инструкцией вызова процедуры открытия файла поместить директиву компилятору - строку {$I-}, которая запрещает автоматическую обработку ошибок ввода-вывода (эта директива сообщает компилятору, что программа берет на себя контроль за ошибками). После инструкции открытия файла следует поместить директиву {$I+}, восстанавливающую режим автоматической обработки ошибок ввода-вывода.

Алгоритм добавления в файл может примерно таким:

Открыть файл в режиме добавления

ОШИБКА ???

ДА - Открыть файл в режиме замены (т.е. создание нового файла)

НЕТ - конец алгоритма

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

AssignFile(f,'D:\testfile.txt');
{$I-}
Append(f);{Пытаемся открыть для добавления}
{$I+}

If IOResult <> 0 //т.е. ошибка открытия
then Rewrite(f);//создадим новый файл

Закрытие файла

Перед завершением работы программа должна закрыть все открытие файлы. Это делается перед вызовом процедуры Close. Процедура close имеет один параметр - имя файловой переменной. Пример использования процедуры:

Close(f);

Также можно воспользоваться процедурой CloseFile(f);

Наши рекомендации