Методические указания к работам 7 и 8

Методические указания к работам 7 и 8

Работа с файлами

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

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

На форму необходимо поместить компоненты: Memo1, две кнопки Button, кнопку ButBtn1 и OpenDialog1 из палитры Dialogs (рис. 17).

Методические указания к работам 7 и 8 - student2.ru

Рис. 17

В разделе Implementation необходимо описать файловую переменную и переменную типа String – имя файла.

Var f:Textfile; fname:String;

Procedure TForm1.Button1Click(Sender: TObject); // кнопка Открыть

Var buf: string; // буфер для чтения строк

Begin

If OpenDialog1.Execute then

Begin

Memo1.Clear;

fname:= OpenDialog1.FileName;

Assignfile(f,fname); //связываем файловую переменную f и файл с именем fname

Reset(f); //открытие файла для чтения

While Not Eof(f) do //пока не конец файла

Begin

Readln(f,buf); //прочитать строку из файла

Memo1.Lines.Add(buf); //добавить строку в поле Memo1

End;

Closefile(f);

End

Else

Begin

ShowMessage('Ошибка доступа к файлу'); Exit

End;

End;

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

В результате выбора файла свойство FileName компонента OpenDialog получает значение полного имени выбранного файла, которое и используется в процедуре Assignfile.

В диалоговом окне Открыть приходится выбирать из всех файлов в нужном каталоге. Удобнее видеть только, например, текстовые файлы, или другой тип файлов по нашему выбору. Для этого используется свойство Filter компонента OpenDialog1. Это свойство можно установить с помощью специального редактора на этапе конструирования формы или программно. Для доступа к редактору достаточно щелкнуть на кнопке … в строке свойства Filter окна Инспектора объектов (рис. 18).

Методические указания к работам 7 и 8 - student2.ru

Рис. 18

В колонке FilterName записываются имена фильтров, в колонке Filter - список масок файлов, разделённых точкой с запятой. Маска файла в данном случае выглядит как

*.расширение_файла

Звёздочка означает, что выбираются файлы с любыми именами, подходящие по расширению.

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

OpenDialog1.Filter:= 'Текстовые файлы | *.txt | Файлы Паскаля | *.pas';

Свойство InitialDir позволяет в момент открытия диалогового окна Открыть оказаться в нужной папке. Оно доступно как на этапе конструирования, так и программно:

OpenDialog1.InitialDir:= 'С:\Программирование';

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

procedure TForm1.Button2Click(Sender: TObject); // Кнопка Сохранить

Var i:integer;

Begin

Rewrite(f); // открыть для перезаписи

For i:= 0 to Memo1.Lines.Count do //строки в поле Memo1 пронумерованы с нуля

Writeln(f,Memo1.Lines[i]);

Closefile(f); //закрытие файла

ShowMessage('Данные записаны в файл');

end;

Если мы хотим содержимое компонента Memo1 сохранить в файле с другим именем, то надо на форму добавить еще одну кнопку Button (Сохранить как) и компонент SaveDialog1 (палитра Dialogs). Обработчик события для кнопки Сохранить как можно записать так:

Procedure TForm1.Button3Click(Sender: TObject);

Var t:Textfile; newname:String; i:Integer;

Begin

If Savedialog1.Execute Then

Begin

newname:= Savedialog1.filename;

Assignfile(t,newname);

Rewrite(t);

For I := 0 to Memo1.Lines.Count do

Writeln(t,Memo1.Lines[i]);

Closefile(t);

End

Else

Begin

ShowMessage('Ошибка доступа к файлу'); Exit

End;

End;

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

Пример 5.2. Разработать программу текстового редактора, позволяющего работать с файлами: создавать новые, сохранять, открывать имеющиеся в памяти компьютера; а также редактировать документы: вырезать, вставлять и копировать текстовые фрагменты (рис. 19).

На форму необходимо поместить компоненты Memo, Edit и MainMenu (палитра Standard). Компонент MainMenu имеет вид:

Методические указания к работам 7 и 8 - student2.ru

Методические указания к работам 7 и 8 - student2.ru

Рис. 19

Далее надо задать обработчик события на создание формы, в котором будет очищаться содержимое компонента Memo:

Procedure TForm1.FormCreate(Sender: TObject);

Begin

Memo1.Clear;

End;

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

В строку главного меню (свойство Caption) надо внести следующие пункты Файл, Редактирование, О программе.

Пункты Файл и Редактирование должны содержать вложенное меню следующей структуры (табл. 17):

Таблица 17

Методические указания к работам 7 и 8 - student2.ru

Для того чтобы запроектировать обработчики события необходимо войти в редактор главного меню и выбрать пункт О программе и дважды щелкнуть на нем мышкой (или в окне Инспектора объектов выбрать событие OnClick). В окно редактора кода с заготовкой обработчика события можно внести следующий код:

ShowMessage('Program is redact only files with extentions *.txt')

Аналогично можно создать обработчики событий со следующими кодами (табл 18):

Таблица 18

Событие щелчка по пункту… Процедура обработчика
Файл \ Новый Procedure TForm1.N4Click(Sender: TObject); begin AssignFile(f,'C:\newfile.txt'); Rewrite(f); Closefile(f); end; (Переменная f должна быть описана как TextFile) Эта команда создает пустой файл и дает возможность пользователю набрать нужный текст в поле Memo1
Файл \ Открыть Procedure TForm1.N5Click(Sender: TObject); Begin Memo1.Lines.LoadfromFile('C:\newfile.txt'); End;
Файл \ Сохранить procedure TForm1.N6Click(Sender: TObject); Begin Memo1.Lines.SaveToFile('C:\newfile.txt'); End;
Файл \ Сохранить как Procedure TForm1.N7Click(Sender: TObject); Var filename:String; Begin filename:=Edit1.Text; Memo1.Lines.SaveToFile(filename); End;
Файл\Выход Procedure TForm1.N8Click(Sender: TObject); Begin Close; End;
Редактирование \ Копировать Procedure TForm1.N9Click(Sender: TObject); Begin Memo1.CopyToClipboard; End;
Редактирование \ Вырезать Procedure TForm1.N10Click(Sender: TObject); Begin Memo1.CutToClipboard; End;
Редактирование \ Вставить Procedure TForm1.N11Click(Sender: TObject); Begin Memo1.PastefromClipboard; End;
Редактирование \ Выделить все Procedure Tform1.N12Click(Sender: Tobject); Begin Memo1.Selectall; End;

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

Процедуры и функции

Процедура ShowMessage

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

Можно разделить все программные сообщения на: информационные сообщения ("Загрузка данных завершена"), предупреждающие сообщения ("Файл модифицирован. Сохранить?"), сообщения об ошибке ("Файл данных не найден").

Сообщение можно вывести с помощью процедуры ShowMessage (const Msg: String). Эта процедура выводит окно с сообщением и кнопкой OK. В заголовке окна содержится название исполняемого файла. Изначально это Project1, в дальнейшем его можно изменить. Строка Msg будет выводиться как текст сообщения.

Например,

ShowMessage('Привет!');

Результат представлен на рис.20.

Методические указания к работам 7 и 8 - student2.ru

Рис. 20

На этой команде работа процедуры (не всей программы!) приостанавливается. Пока пользователь не нажмет на кнопку Ok, работа с приложением становится невозможным, т.е. нельзя «добраться» до окна, расположенного позади, т.е. это сообщение открывается модально.

Функция MessageDlg

MessageDlg (Msg, AType, Abuttons, HelpCtx) - функция, типа Integer, показывающая в центре экрана диалоговое окно сообщения и дающая возможность пользователю ответить на сообщение.

Msg - параметр типа String, отвечающий за выводимый текст сообщения.

Параметр AType может принимать одно из несколько значений. От этих значений зависит содержимое заголовка и иконка в левом верхнем углу окна (табл. 19).

Таблица 19

Тип сообщения Описание Вид окна
mtWarning Можно использовать в предупреждающих сообщениях. Например, "Вы действительно желаете удалить данные?" Методические указания к работам 7 и 8 - student2.ru
mtError Обычное окошко вывода сообщения об ошибки. Методические указания к работам 7 и 8 - student2.ru
mtInformation Какая-нибудь информация. Методические указания к работам 7 и 8 - student2.ru
mtConfirmation Это запрос. Например, запрос на сохранение перед выходом. Методические указания к работам 7 и 8 - student2.ru
mtCustom Это сообщение полностью аналогично ShowMessage Методические указания к работам 7 и 8 - student2.ru

AButtons - параметр, который задает набор кнопок в окне и может принимать произвольные комбинации из значений:

§ кнопка Yes - mbYes,

§ кнопка Ok - mbOk,

§ кнопка No - mbNo,

§ кнопка Cancel - mbCancel,

§ кнопка Abort - mbAbort,

§ кнопка Retry - mbRetry,

§ кнопка Ignore - mbIgnore,

§ кнопка All - mbAll,

§ кнопка Help - mbHelp.

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

MessageDlg('Большое значение', mtConfirmation, [mbYes, mbNo],0 );

Кроме перечисления отдельных кнопок, есть возможность задать часто используемым сочетаниям кнопок значения специальных констант:

§ кнопки OK и Cancel - mbOkCancel,

§ кнопки Yes, No и Cancel - mbYesNoCancel,

§ кнопки Abort, Retry и Ignore - mbAbortRetryIgnore.

Эти константы не надо брать в скобки, так как они являются предопределенными множествами.

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

mrYes = 6

mrNo = 7

mrOK = 1

mrCancel = 2

mrAbort = 3

mrRetry = 4

mrIgnore = 5

mrAll = 8

Кнопка Help не имеет никакого эквивалентного возвращаемого значения, потому что она не заканчивает диалог. Параметр HelpCtx задает тему справки. Ее можно вызвать во время показа диалогового окна клавишей F1. Обычно этот параметр устанавливается равным нулю и справка не выводится.

Пример 6.1. Необходимо спросить у пользователя о дальнейших действиях перед выходом из программы:

· Сохранить файл;

· Не сохранять файл;

· Продолжить редактирование (рис. 21)

………………….

Var R:Integer; // переменная, в которой хранится результат

R:=MessageDLG('Сохранить файл?', mtConfirmation, [mbYes,mbNo,mbCancel],0);

If R=mrYes Then // если нажата кнопка Yes

Begin

… // сохраняем файл и завершаем программу

End;

If R=mrNo Then // если нажата кнопка No

Begin

… // завершаем работу программы без сохранения

End;

If R=mrCancel Then // если нажата кнопка Cancel

Begin

… // продолжаем работу без сохранения

End;

или

Var R:Integer; // переменная, в которой хранится результат

R:=MessageDLG('Сохранить файл?', mtConfirmation, [mbYes,mbNo,mbCancel],0);

Case R of

6: Begin // если нажата кнопка Yes

… // сохраняем файл и завершаем программу

End;

7: Begin // если нажата кнопка No

… // завершаем работу программы без сохранения

End;

2: Begin // если нажата кнопка Cancel

… // продолжаем работу без сохранения

End;

End;

Методические указания к работам 7 и 8 - student2.ru

Рис. 21

Функция InputBox

InputBox(ACaption, APrompt, ADefault) – функция типа String, выводящая на экран диалоговое окно для ввода строки пользователем.

Параметр ACaption определяет заголовок диалогового окна.

APrompt – текст, который будет отображен над полем редактирования (подсказка пользователю о том, что конкретно необходимо ввести в поле редактирования).

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

Если пользователь нажимает кнопку OK, то функция возвращает строку, введенную в поле редактирования. Если пользователь нажимает кнопку Cancel или клавишу клавиатуры Esc, то функция возвращает строку, определенную по умолчанию (ADefault). Если в программе необходимо определить, какую конкретно из кнопок (OK или Cancel) нажал пользователь, то в таком случае надо использовать функцию InputQuery.

Например:

var fio : string; age: integer;… fio := InputBox('ФИО', 'Как Вас зовут', 'Не задано'); age := StrToInt(InputBox('Возраст', 'Сколько Вам лет',' '));…Вид диалоговых окон показан на рис.22 (а, б). Методические указания к работам 7 и 8 - student2.ru Методические указания к работам 7 и 8 - student2.ru а б

Рис. 22

Классы общего назначения

Методические указания к работам 7 и 8

Работа с файлами

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

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

На форму необходимо поместить компоненты: Memo1, две кнопки Button, кнопку ButBtn1 и OpenDialog1 из палитры Dialogs (рис. 17).

Методические указания к работам 7 и 8 - student2.ru

Рис. 17

В разделе Implementation необходимо описать файловую переменную и переменную типа String – имя файла.

Var f:Textfile; fname:String;

Procedure TForm1.Button1Click(Sender: TObject); // кнопка Открыть

Var buf: string; // буфер для чтения строк

Begin

If OpenDialog1.Execute then

Begin

Memo1.Clear;

fname:= OpenDialog1.FileName;

Assignfile(f,fname); //связываем файловую переменную f и файл с именем fname

Reset(f); //открытие файла для чтения

While Not Eof(f) do //пока не конец файла

Begin

Readln(f,buf); //прочитать строку из файла

Memo1.Lines.Add(buf); //добавить строку в поле Memo1

End;

Closefile(f);

End

Else

Begin

ShowMessage('Ошибка доступа к файлу'); Exit

End;

End;

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

В результате выбора файла свойство FileName компонента OpenDialog получает значение полного имени выбранного файла, которое и используется в процедуре Assignfile.

В диалоговом окне Открыть приходится выбирать из всех файлов в нужном каталоге. Удобнее видеть только, например, текстовые файлы, или другой тип файлов по нашему выбору. Для этого используется свойство Filter компонента OpenDialog1. Это свойство можно установить с помощью специального редактора на этапе конструирования формы или программно. Для доступа к редактору достаточно щелкнуть на кнопке … в строке свойства Filter окна Инспектора объектов (рис. 18).

Методические указания к работам 7 и 8 - student2.ru

Рис. 18

В колонке FilterName записываются имена фильтров, в колонке Filter - список масок файлов, разделённых точкой с запятой. Маска файла в данном случае выглядит как

*.расширение_файла

Звёздочка означает, что выбираются файлы с любыми именами, подходящие по расширению.

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

OpenDialog1.Filter:= 'Текстовые файлы | *.txt | Файлы Паскаля | *.pas';

Свойство InitialDir позволяет в момент открытия диалогового окна Открыть оказаться в нужной папке. Оно доступно как на этапе конструирования, так и программно:

OpenDialog1.InitialDir:= 'С:\Программирование';

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

procedure TForm1.Button2Click(Sender: TObject); // Кнопка Сохранить

Var i:integer;

Begin

Rewrite(f); // открыть для перезаписи

For i:= 0 to Memo1.Lines.Count do //строки в поле Memo1 пронумерованы с нуля

Writeln(f,Memo1.Lines[i]);

Closefile(f); //закрытие файла

ShowMessage('Данные записаны в файл');

end;

Если мы хотим содержимое компонента Memo1 сохранить в файле с другим именем, то надо на форму добавить еще одну кнопку Button (Сохранить как) и компонент SaveDialog1 (палитра Dialogs). Обработчик события для кнопки Сохранить как можно записать так:

Procedure TForm1.Button3Click(Sender: TObject);

Var t:Textfile; newname:String; i:Integer;

Begin

If Savedialog1.Execute Then

Begin

newname:= Savedialog1.filename;

Assignfile(t,newname);

Rewrite(t);

For I := 0 to Memo1.Lines.Count do

Writeln(t,Memo1.Lines[i]);

Closefile(t);

End

Else

Begin

ShowMessage('Ошибка доступа к файлу'); Exit

End;

End;

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

Пример 5.2. Разработать программу текстового редактора, позволяющего работать с файлами: создавать новые, сохранять, открывать имеющиеся в памяти компьютера; а также редактировать документы: вырезать, вставлять и копировать текстовые фрагменты (рис. 19).

На форму необходимо поместить компоненты Memo, Edit и MainMenu (палитра Standard). Компонент MainMenu имеет вид:

Методические указания к работам 7 и 8 - student2.ru

Методические указания к работам 7 и 8 - student2.ru

Рис. 19

Далее надо задать обработчик события на создание формы, в котором будет очищаться содержимое компонента Memo:

Procedure TForm1.FormCreate(Sender: TObject);

Begin

Memo1.Clear;

End;

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

В строку главного меню (свойство Caption) надо внести следующие пункты Файл, Редактирование, О программе.

Пункты Файл и Редактирование должны содержать вложенное меню следующей структуры (табл. 17):

Таблица 17

Методические указания к работам 7 и 8 - student2.ru

Для того чтобы запроектировать обработчики события необходимо войти в редактор главного меню и выбрать пункт О программе и дважды щелкнуть на нем мышкой (или в окне Инспектора объектов выбрать событие OnClick). В окно редактора кода с заготовкой обработчика события можно внести следующий код:

ShowMessage('Program is redact only files with extentions *.txt')

Аналогично можно создать обработчики событий со следующими кодами (табл 18):

Таблица 18

Событие щелчка по пункту… Процедура обработчика
Файл \ Новый Procedure TForm1.N4Click(Sender: TObject); begin AssignFile(f,'C:\newfile.txt'); Rewrite(f); Closefile(f); end; (Переменная f должна быть описана как TextFile) Эта команда создает пустой файл и дает возможность пользователю набрать нужный текст в поле Memo1
Файл \ Открыть Procedure TForm1.N5Click(Sender: TObject); Begin Memo1.Lines.LoadfromFile('C:\newfile.txt'); End;
Файл \ Сохранить procedure TForm1.N6Click(Sender: TObject); Begin Memo1.Lines.SaveToFile('C:\newfile.txt'); End;
Файл \ Сохранить как Procedure TForm1.N7Click(Sender: TObject); Var filename:String; Begin filename:=Edit1.Text; Memo1.Lines.SaveToFile(filename); End;
Файл\Выход Procedure TForm1.N8Click(Sender: TObject); Begin Close; End;
Редактирование \ Копировать Procedure TForm1.N9Click(Sender: TObject); Begin Memo1.CopyToClipboard; End;
Редактирование \ Вырезать Procedure TForm1.N10Click(Sender: TObject); Begin Memo1.CutToClipboard; End;
Редактирование \ Вставить Procedure TForm1.N11Click(Sender: TObject); Begin Memo1.PastefromClipboard; End;
Редактирование \ Выделить все Procedure Tform1.N12Click(Sender: Tobject); Begin Memo1.Selectall; End;

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

Процедуры и функции

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