Файлы

Приступая к решению задач этого раздела, необходимо вспомнить:

  • При выполнении файловых операций возможны ошибки.
  • Для обработки ошибок выполнения файловых операций НУЖНО ИСПОЛЬЗОВАТЬ ИНСТРУКЦИЮ try ... except.

50. Напишите программу, которая в поле Memo выводит содержимое текстового файла. Рекомендуемый вид формы приведен на рис. 1.51.

Рис. 1.51. Форма программы Чтение файла

implementation
{$R *.dfm}
// нажатие клавиши в поле редактирования
procedure TForml.EditlKeyPress(Sender: TObject; var Key: Char),
begin
if Key = #13 // клавиша <Enter>
then Buttonl.SetFocus;
end;
// щелчок на кнопке Открыть
procedure TForml.ButtonlClick(Sender: TObject);
var
f: TextFile; // файл
fName: String[80]; // имя файла
buf: String[80]; // буфер для чтения строк
begin
fName := Edit1.Text;
AssignFile(f, fName);
try
Reset (f); // открыть для чтения
except
on EInOutError do
begin
ShowMessage('Ошибка доступа к файлу '+
fName);
exit;
end;
end;
// чтение из файла
while not EOF(f) do
begin
readln(f, buf); // прочитать строку из файла
Memol.Lines.Add(buf); // добавить строку в поле Memol
end;
CloseFile(f); // закрыть файл
end;
// щелчок на кнопке Сохранить
procedure TForml.Button2Click(Sender: TObject);
var
f: TextFile; // файл
fName: String[80]; // имя файла
i: integer;
begin
fName := Edit 1.Text;
A.ssignFile (f, fName);
try
Rewrite(f); // открыть для перезаписи
except
on EInOutError do
begin
ShowMessage('Ошибка доступа к файлу '+ fName);
exit;
end;
end;
// запись в файл
for i:=0 to Memol.Lines.Count do // строки в поле Memo
// пронумерованы с нуля
writeln(f, Memol.Lines[i]);
CloseFile(f); // закрыть файл
MessageDlg('Данные записаны в файл',
mtlnformation,[mbOk],0);
end;
// щелчок на переключателе Только чтение
procedure TForml.CheckBoxlClick(Sender: TObject);
begin
if not CheckBoxl.Checked then
begin
Memol.Readonly := False; // разрешить редактирование
Button2.Visible := True // кнопка Сохранить доступна
end
else
begin
Memol.Readonly := True; // запретить редактирование
Button2.Visible := False; // скрыть кнопку Сохранить
end;
end;end.

51. Напишите программу, которая в поле Memo выводит содер жимое текстового файла. Для получения от пользователя имени файла используйте стандартное диалоговое окно Открытие фай ла. Рекомендуемый вид диалогового окна приведен на рис. 1.52.

Рис. 1.52. Форма программы Просмотр

implementation
{$R *.dfm)
// щелчок на кнопке Открыть
procedure TForml.ButtonlClick(Sender: TObject);
var
f: TextFiie; // файл
fName: String[80]; // имя файла
buf: String[80]; // буфер для чтения строк
begin
if not OpenDialogl.Execute
then ( пользователь закрыл диалог
щелчком на кнопке Отмена }
exit;
// пользователь выбрал файл
fName := OpenDialogl.FileName;
Forml.Capt ion := fName;
AssignFile(f, fName);
try
Reset(f); // открыть для чтения
except
on EInOutError do
begin
ShowMessage('Ошибка доступа к файлу '+
fName);
exit;
end;
end;
// чтение из файла
while not EOF(f) do
begin
readln(f, buf) ; // прочитать строку из файла
Memol.Lines.Add(buf); // добавить строку в поле Memol
end;
CloseFile (f) ; // закрыть файл
end;
procedure TForml.FormCreate(Sender: TObject);
begin
// определим фильтр
OpenDialogl.Filter := 'Текст I *.txt';
end;
end.

52. Напишите программу, которая добавляет в базу данных "По года", реализованную в виде текстового файла, информацию о дневной температуре. Для ввода даты используйте компонент MonthCalendar. Если файл данных отсутствует, то программа должна его создать. Рекомендуемый вид формы программы при веден на рис. 1.53.

implementation
{$R *.dfm}
const
DBNAME = 'pogoda.txt';
var
db: TextFile; // файл — база данных
// Начало работы. Откроем или создадим
// файл данных.
procedure TForml.FormCreate(Sender: TObject);

Рис. 1.53. Форма программы базы данных "Погода"

var
г: integer; // ответ пользователя
begin
AssignFile(db,DBNAME);
try
Append(db); // возможна ошибка
except
on E: EInOutError do
begin
r := MessageDlg('Файл базы данных (pogoda.txt) +
'не найден.' +
#13+'Создать файл?',mtWarning,[mbOk,mbCancel],0);
if r = mrOK
then begin
Rewrite(db); // создадут файл
ShowMessage('Файл базы данных создан!');
end
else Application.Terminate; // завершить работу
end;
end;
Editl.Enabled := True;
Buttonl.Enabled := True;
end;
// нажатие клавиши в поле Температура
procedure TForml.EditlKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
' 0 ' . . ' 9', #8 :; // цифры и клавиша <Backspace>
#13: // клавиша <Enter>
if Length(Editl.Text) о О
then Buttonl.SetFocus;
',','¦': begin // десятичная точка
Key:= DecimalSeparator;
if Pos(DecimalSeparator,Editl.Text) о О
then Key :=Char(0);
end;
'-': if Length(Editl.Text) о 0
then Key:=Char(0);
else Key:= Char(0); // остальные символы запрещены
end;
end;
// щелчок на кнопке Добавить
procedure TForml.ButtonlClick(Sender: TObject);
begin
if Length(Editl.Text) = 0
then ShowMessage('Надо ввести температуру.1)
else begin
writeln(db,
FormatDateTime('dd/mm/yy',
MonthCalendarl.Date),
1 ',Editl.Text);
Editl.Text :=
end;
end;
// завершение работы программы
procedure TForml.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
CloseFile(db); // закрыть файл
end;
end.

53. Напишите программу, которая в указанном пользователем каталоге и его подкаталогах выполняет поиск файла. Рекомен дуемый вид диалогового окна приведен на рис. 1.54. Для ввода имени каталога во время работы программы используйте стан дартное диалоговое окно Обзор папок (рис. 1.55).

// Поиск файла в указанном каталоге и его подкаталогах
// используется рекурсивная процедура Find.
unit FindFile_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, FileCtrl;
type
TForral = class(TForm)
Editl: TEdit; // что искать
Edit2: TEdit; // где искать
Memol: TMemo; //' результат поиска
Buttonl: TButton; /'/ кнопка Поиск
Button2: TButton; // кнопка Папка
Labell: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
/ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
implementation
i$R *.dfm}
var
FileName: string; // имя или маска искомого файла
cDir: string;
n: integer; // кол-во файлов, удовлетворяющих запросу
Рис. 1.54. Форма программы Поиск файла
Рис. 1.55. Стандартное окно Обзор папок
// поиск файла в текущем каталоге
procedure Find;
var
SearchRec: TSearchRec; // информация о файле или каталоге
begin '
GetDir(0, cDir); // получить имя текущего каталога
if cDir [length (cDir) I <> 'V then cDir := cDir+'V;
if FindFirst(FileName, faAnyFile,SearchRec) = 0 then
repeat
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr
then begin
Forml.Memol.Lines.Add(cDir + SearchRec.Name)
n := n + 1;
end;
until FindNext(SearchRec) <> 0;
// обработка подкаталогов текущего каталога
{ Если не обрабатывать системные каталоги, то
вместо faAnyFile можно задать faDirectory.
Это объясняется тем, что значение SearchRec.Attr
для обычного каталога равно faDirectory (16),
для Program Files — faDirectory+faReadOnly (1 7) ,
а для каталога Windows — faDirectory+faSysFile (20) }
if FindFirst С*1, faAnyFile, SearchRec) = 0 then
repeat
if (SearchRec.Attr and faDirectory) = faDirectory
then
// каталоги '.. ' и '. ' тоже каталоги,
// но в них входить не надо !!!
if SearchRec.Name[i] о '.' then
begin
ChDir(SearchRec.Name); // войти в каталог
Find; // выполнить поиск в подкаталоге
ChDir('..');// выйти из каталога
end;
until FindNext(SearchRec) О 0;
end;
// щелчок на кнопке Поиск
procedure TForml.ButtonlClick(Sender: TObject);
begin
if not DirectoryExists(Edit2.Text) then
begin
ShowMessage('Каталог указан неверно.');
Edit2.SetFocus;
exit;
end;
Buttonl.Enabled := False;
Label4.Caption := '';
Label4.Repaint;
Memol.Clear; // очистить поле Memol
Label4.Caption := '';
FileName := Edit1.Text; // что искать
cDir := Edit2.Text; // где искать
n:=0; // кол-во найденных файлов
ChDir(cDir); // войти в каталог начала поиска
Find; // начать поиск
if n = 0 then
ShowMessage('Файлов, удовлетворяющих критерию ' +
'поиска нет.')
else Label4.Caption := 'Найдено файлов:' + IntToStr(n);
Buttonl.Enabled := True;
end;
/У возвращает каталог, выбранный пользователем
function GetPath(mes: string):string;
var
Root: string; // корневой каталог
pwRoot : PWideChar;
Dir: string;
begin
Root : = ''; // корневой каталог — папка Рабочий стол
GetMemfpwRoot, (Length(Root)+1) * 2);
pwRoot := StringToWideChar(Root,pwRoot,MAX_PATH*2);
if SelectDirectory(mes, pwRoot, Dir)
then
if length(Dir) =2 // выбран корневой каталог
then GetPath := Dir+'V
else GetPath := Dir
else
GetPath :=
end;
// щелчок на кнопке Папка
procedure TForral.Button2Click(Sender: TObject);
var
Path: string;
begin
Path := GetPath('Выберите папку1);
if Path О "
then Edit2.Text := Path;
end;end.