Запись в текстовой файл delphi. Создание и работа с текстовыми файлами в Delphi

Файл – это именованная структура данных, представляющая собой последовательность элементов данных одного типа расположенных на диске или любом другом внешнем носителе.

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

В зависимости от типа элементов различают три вида файла:

– файл из элементов определенного типа (типизированные файлы);

– файл из элементов, тип которых не указан (нетипизированный файл);

– текстовый файл, т.е. элементами являются текстовые строки.

Для работы с файлом в программе объявляется файловая переменная (логический файл) в разделе описания переменных:

имя_файла: file of тип_элементов_файлов;

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

имя_файла: TextFile;

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

AssignFile(var f, имя_файла: String);

Функции и процедуры для работы с файлами:

1. Открытие файла для записи

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

rewrite (файловая_переменная)

– добавление в конец файла – используется процедура

append (файловая_переменная)

1. Запись в файл

Write

Writeln (файловая_переменная, список_переменных)

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

2. Закрытие файла. Перед завершением работы все открытые файлы необходимо закрыть с помощью процедуры

CloseFile (файловая_переменная)

3. Открытие файла для чтения. Используется процедура Reset(файловая_переменная)

4. Чтение данных из файла

read (файловая_переменная, список_переменных)

readln (файловая_переменная, список_переменных)

Отличие между этими процедурами в том, что при вызове инструкции readln указатель чтения из файла автоматически перемещается в начало следующей строки файла.

5. Определение конца файла. Используется функция EOF (файловая_переменная). Значение функции равно false, если прочитанный элемент данных не является последним в файле, т.е. возможно дальнейшее чтение. Если прочитанный элемент файла является последним, то значение EOF равно true.

While not eof(f) do begin … end;

6. Rename (var F; NewName: string) – переименовывает неоткрытый файл F любого типа. Новое имя задается в NewName.

7. Seek ( var F; NumRec: Longint) – устанавливает позицию чтения-записи на элемент с номером NumRec; F – типизированный или нетипизированный файл.

8. IOResult : Integ er – возвращает код, характеризующий результат (была ошибка или нет) последней операции ввода-вывода.

9. FilePos (var F): Longint – возвращает для файла F текущую файловую позицию (номер элемента, на которую она установлена, считая от нуля). Не используется с текстовыми файлами.

10. FileSize (var F): Longint – возвращает число компонент в файле F. Не используется с текстовыми файлами.

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

– {SITELINK-S102}OpenDialog{/SITELINK};

– {SITELINK-S103}SaveDialog{/SITELINK} и др, которые находятся на вкладке Dialogs.


1) Направление выходного потока вашей программы в файл.
2) Направление выходного потока вашей программы на принтер.
3) Чтение из входного файла.

Направление выходного потока вашей программы в файл

Часто мои профессора, чтобы убедиться в моей честности и поверить в то, что программа создана моими руками, требуют ее полный листинг или упоминания обо мне в качестве одного из авторов. Далее они хотят, чтобы все генерируемые программой данные выводились в файл. Но как это сделать на Delphi или на простом Паскале???

Просто в Delphi ....


Направление выходного потока вашей программы на принтер

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


Чтение из входного файла

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


В Паскале...


{НАЧАЛО INFILE.TXT} 2 Здравствуй, мир Моя программа работает, и этот текст доказательство этому. {КОНЕЦ INFILE.TXT} Для получения дополнительной информации обратитесь к Руководству Разработчика. Ознакомьтесь с описанием функций AssignFile, Assign, Reset, Rewrite, readln, writeln, Close, CloseFile.

Урок 15. Работа с файлами

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

Как известно, файлы имеют различные форматы и к ним применяются различные программы для обработки. Например, файлы рисунков BMP, текстовые файлы TXT и т.п. Файлы имеют различные имена и определенное расширение, имеющее в среде MS-DOS максимально три символа. Если у файла расширение RAR, то пользователь и операционная система знает, что это архиватор, причем windosw для обработки этого файла применяет средства, указанные в специальном разделе реестра.

Копирование файлов

Для копирования файлов применяется функция CopyFile. Формат ее такой:

CopyFile(Исходный_файл,Записуемый_файл,Флаг_перезаписи);

где: Исходный_файл – полный путь и название файла, который копируется;

Записуемый_файл – полный путь и название файла, куда копируется исходный файл;

Флаг_перезаписи – будет или нет перезаписан файл, если таковой уже существует (true - не будет, false - будет перезаписан).

CopyFile является функцией, которая возвращает флаг успешной или нет операции копирования.

Например, следующая строка:

if not CopyFile("c:\command.com","c:\1.com",true) then ShowMessage("Ошибка копирования");

скопирует файл command.com в файл 1.com только в том случае, если последнего нет, в противном случае будет выдаваться сообщение об ошибке копирования.

Перемещение файлов

Для перемещения файлов применяется функция MoveFile. Она имеет следующий формат:

MoveFile(Исходный_файл,Записуемый_файл);

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

if not MoveFile("c:\1.com","c:\2.com") then ShowMessage("Ошибка перемещения");

Переименование файлов

Функция RenameFile

if not RenameFile("c:\2.com","c:\3.com") then ShowMessage("Ошибка переименования");

У всех вышесказанных командах параметры исходного и конечного файла имеет тип PChar. Это строковый тип с завершающимся нулем. Возможно, вы раньше слышали о таком формате строковых данных. В такую переменную можно занести строку очень большой длины. Ее размер ограничивается наличием нулевого байта в конце. Теоретически такая переменная может иметь бесконечный размер. На практике она ограничивается размерами выделяемой памяти для программы (2Гб).

Преобразование обычной строковой переменной, типа String в PChar производится функцией:

PChar(Строковая_переменная).

При этом, для команд файловых операций возможны объединение строк. Например:

procedure TForm1.Button1Click(Sender: TObject);

Var InDir,OutDir:String; // объявление строковых переменных

begin

InDir:="c:\1\"; // каталог исходных файлов

OutDir:="c:\2\"; // каталог записуемых файлов

CopyFile(PChar(InDir+"1.txt"),PChar(OutDir+"1.txt"),false);

CopyFile(PChar(InDir+"2.txt"),PChar(OutDir+"2.txt"),false);

end;

Здесь налицо операция соединения двух строковых переменных.

В итоге этой процедуры будет копирование файлов c:\1\1.txt и c:\1\2.txt в каталог c:\2. Файлы копируются под теми же именами.

Удаление файлов

Функция DeleteFile

if not DeleteFile("c:\3.com") then ShowMessage("Ошибка удаления");

Работа с текстовыми файлами. Чтение из текстового файла

На прошлых уроках мы как, в компоненте Memo процесс загрузки и записи текстового файла делался следующим образом:

Memo1.Lines.SaveToFile(Имя_файла); // сохранение

Все это благодаря свойству Lines, в котором хранятся строки.

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

procedureTForm1.Button1Click(Sender: TObject);

Varf:TextFile; // объявление файловой переменной

st:String ; // строковая переменная

begin

AssignFile(f,"c:\1.txt"); // привязка названия файла к файловой переменной

{$I-} // отключение контроля ошибок ввода-вывода

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

{$I+} // включение контроля ошибок ввода-вывода

ifIOResult<>0 then // если есть ошибка открытия, то

begin

ShowMessage("Ошибка открытия файла C:\1.TXT");

Exit; // выход из процедуры при ошибке открытия файла

end ;

While not EOF(f) do // пока не конец файла делать цикл:

begin

ShowMessage(st); // выводить строку пользователю

end ;

CloseFile(f); // закрыть файл

end;

Прокомментирую некоторые строки этого примера.

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

{$I-} и {$I+} являются директивами компилятору, что в этом месту соответственно следует отключить и включить контроль ошибок ввода-вывода. В данном случае при неудачной попытке открытия файла c:\1.txt (файл отсутствует или открыт для записи другой программой) наша программа не выдаст аварийной ошибки и продолжит выполнение данной процедуры. Это свойство полезно для обработки всех возможных случаев в работе программы.

IOResult – переменная, которая хранит в себе код ошибки последней операции ввода-вывода. Если она равна нулю, то последняя операция была успешно выполнена.

EOF(Файл) – функция, возвращающая признак конца файла. Т.е. она показывает, достигнут или нет конец открытого файла.

ReadLn(Файл,Переменная) – процедура считывания переменной из файла. В отличие от команды Read производит считывание строки с завершающимся символом перевода строки под кодами 13 и 10 (клавиша Enter).

CloseFile(Файл) – процедура закрытия ранее открытого файла.

Работа с текстовыми файлами. Запись в текстовый файл

Рассмотрим пример:

procedure TForm1.Button1Click(Sender: TObject);

Var f:TextFile; // указатель на текстовый файл

AssignFile(f,"c:\1.txt"); // привязка названия к переменной

Append(f); // открыть файл для добавления

if IOResult<>0 then // если ошибка открытия (напр. файла нет)

Rewrite(f); // создать новый файл

if IOResult<>0 then // ошибка создания файла

ShowMessage("Ошибка создания файла C:\1.TXT");

WriteLn(f,"Привет"); // запись в файл строки с символами перевода строки

CloseFile(f); // закрыть файл

Процедура Append(Файл) открывает файл для записи и устанавливает указатель записи в конец файла, т.е. все добавляемые к файлу строки будут записаны в конец файла.

В нашем случае в самом начале файла 1.txt может не оказаться на диске, поэтому команда открытия файла для добавления вызовет ошибку. В этом случае срабатывает наш собственный контроль ошибок и выполняется команда создания файла.

Запись и чтение из файла не текстовых данных

Рассмотрим пример, в котором программа при выходе сохраняет свои размеры и положение окна на экране в файл и при последующем запуске восстанавливает состояние, которое было при выходе. Программа состоит из двух процедур OnShow и OnClose для окна Form1 программы.

procedure TForm1.FormShow(Sender: TObject);

Var f:file of Integer; // файловая переменная, тип integer

I:Integer; // целочистенная переменная

begin

AssignFile(f,"pos.ini");

{$I-}

Reset(f);

{$I+}

if IOResult<>0 then Exit;

Form1.Top:=i; // верхнее положение окна

Read(f,i);

Form1.Left:=i; // левое положение окна

Read(f,i);

Form1.Width:=i; // ширина окна

Read(f,i);

Form1.Height:=i; // высота окна

CloseFile(f);

end ;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

Var f:file of Integer;

Тема : « Работа с типизированным файлом в Delphi »

Разработайте приложение, позволяющее работать с типизированным файлом путём выбора соответствующего пункта меню:

Файл

Просмотр

Редактирование

Печать

Справочники

Выход

Всех данных

Добавление

По условию

По условию

Корректировка

Документа

Поставщики

Удаление

Требования к приложению:

    Все глобальные типы данных, константы и переменные разместите в отдельном модуле (Unit2), который необходимо подключить к другим модулям проекта через пункт меню File / Use Unit.

    Для ввода исходных данных в файл (пункты меню «Корректировка» и «Добавление») разработайте экранную форму ввода. Предусмотрите проверку корректности ввода исходных данных используя событие OnKeyPress.

    Просмотр данных из файла надо реализовать выводом в таблицу StringGrid.

    При реализации пункта меню «Корректировка» на форму ввода должны быть выведены «старые» значения полей корректируемой записи.

    Пункт меню «Удаление» должен обеспечивать удаление одной записи из файла по выбору пользователя.

    Печать по условию реализуйте с помощью компонента QuickRep и дополнительного текстового файла.

    Печать документа можно реализовать с помощью метода Form10.Print, разместив предварительно на форму необходимую информацию.

    На форме, помимо главного меню, разместите:
    - картинку, соответствующую предметной области задачи;
    - инструментальную панель (компонент ToolBar) и вынесите не неё несколько кнопок SpeedButton, дублирующих некоторые пункты главного меню.

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

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

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

    При желании разместите слева от названия некоторых пунктов меню подходящее по смыслу изображение, используя свойство Bitmap (Program Files \ Common Files \ Borland Shared \ Images \ Buttons)

    На форме «Просмотр всех записей файла» организуйте поиск записи и обеспечьте вывод найденной записи на отдельной форме.

Информация о поступлении товара на склад: дата поступления, поставщик, название товара, цена, количество - должна сохраняться в типизированный файл. Условие для просмотра – товар от выбранного поставщика. Условие для печати – поступление товара за определённую дату. Документ – товарная карточка.

ПОРЯДОК ВЫПОЛНЕНИЯ ЗАДАНИЯ:

    Создайте новое приложение

    На Form1 создайте главное меню, согласно условию задачи.

    Вынесите на Form1 компонент Image1. В Инспекторе объектов компоненту Image1 назначьте свойства:
    Align = alClient

Stretch = true
Picture - файл с картинкой

    Добавьте к проекту новый модуль File / New / Unit и в разделе Interface пропишите

Ttov = record //структура записи, содержащая сведения о товаре для
// типизированного файла

DateP: TdateTime; //дата поставки

Postav: string ; // фирма-поставщик товара

Tovar: string; //название товара

Cena: real; //цена товара

Kol: integer; //количество товара

Var Tov: Ttov; //запись содержащая сведения о товаре

F1, F3: file of Ttov; // типизированный файл для хранения сведений о товаре

F2: textFile ; // текстовый файл для реализации печати по условию

Name_F: string; // имя файла

. . . // другие переменные, которые понадобятся для решения задачи

    Справочник Товаров » (File / New / Form). Форма «Справочник Товаров» должна содержать компоненты ListBox, Edit, Label и две кнопки BitBtn, позволяющие сохранить содержимое Edit в список ListBox и всё содержимое ListBox в текстовый файл. Компоненту ListBox в Инспекторе объектов назначьте свойству Sorted значение True, тогда элементы будут отсортированы в алфавитном порядке.

    В Инспекторе объектов для формы «Справочник Товаров» выберите событие OnActivate. Напишите в процедуре программный код:

If FileExists(‘tovar.txt’) = true then ListBox1.items.LoadFromFile(‘tovar.txt’);

    В Инспекторе объектов для кнопки «Добавить в список» выберите событие OnClick. Напишите в процедуре программный код:

Listbox1.Items.Append(Edit1.text);

Edit1.Text:= "";

    В Инспекторе объектов для кнопки «Удалить из списка» выберите событие OnClick. Напишите в процедуре программный код:

If MessageDlg ("Удалить запись? ", mtConfirmation, , 0) = mrYes

then ListBox1.items.Delete (ListBox1.itemindex);

    В Инспекторе объектов для кнопки «Закрыть» выберите событие OnClick. Напишите в процедуре программный код:

ListBox1.items.SaveToFile(‘tovar.txt’);

    В Инспекторе объектов для кнопки «Закрыть» выберите событие OnClick. Напишите в процедуре программный код: Form3.Close ;

    Аналогично выполните работу с формой «Справочник фирм-поставщиков ».

    В процедуре вызова пункта меню «Товары» пропишите программный код:
    Form3.Show;

    В процедуре вызова пункта меню «Поставщики» пропишите программный код:
    Form4.Show;

    Вынесите на Form1 компонент SaveDialog1. Напишите программный код процедуры пункта меню «Создать »:

If SaveDialog1.Execute = true then

Name_F:= SaveDialog1.FileName ;

AssignFile(F1, Name_F) ;

Rewrite(F1); // файл будет создан и открыт для записи

CloseFile(F1); // закрытие файла

N1.Enabled:= true; // пункт меню Файл

N2.Enabled:= true; // пункт меню Просмотр

N3.Enabled:= true; // пункт меню Редактирование

N4.Enabled:= true; // пункт меню Печать

N5.Enabled:= true; // пункт меню Справочники

N6.Enabled:= true; // пункт меню Выход

    Вынесите на Form1 компонент OpenDialog1. Напишите программные код процедуры пункта меню «Открыть »:

if OpenDialog1.Execute = true then

Name_F:= OpenDialog1.FileName ;

AssignFile(F1, Name_F);

N1.Enabled:= true; // пункт меню Файл

N2.Enabled:= true; // пункт меню Просмотр

N3.Enabled:= true; // пункт меню Редактирование

N4.Enabled:= true; // пункт меню Печать

N5.Enabled:= true; // пункт меню Справочники

N6.Enabled:= true; // пункт меню Выход

    В Инспекторе объектов для формы Form1 выберите событие OnCreate. Напишите в процедуре программный код:

N1.Enabled:= true; // пункт меню Файл

N2.Enabled:= false; // пункт меню Просмотр

N3.Enabled:= false; // пункт меню Редактирование

N4.Enabled:= false; // пункт меню Печать

N5.Enabled:= false; // пункт меню Справочники

N6.Enabled:= true; // пункт меню Выход

    Добавьте к приложению новую форму «Добавление » для ввода исходных данных в файл. Разместите на форме компоненты dateTimePicker1, Combobox1, Combobox2, edit1, edit2, Button1. Обеспечьте проверку корректности ввода данных в компоненты edit1, edit2 используя событие OnKeyPress.

    Для компонентов Combobox запретите ввод данных с клавиатуры (т.к. данные должны выбираться только из справочников). Для этого в процедуре события OnKeyPress пропишите программный код: If not (key in ) then key:= #0;

    В Инспекторе объектов для формы «Добавление» свойству Caption введите значение «Добавление записи» и выберите событие OnActivate. Напишите в процедуре программный код:

Exit ; //

Tov.Tovar:= Combobox1.text;

Tov.Postav:= Combobox2.text ;

Reset (f1); // открыли файл для записи

Seek (F1, Filesize (F1)); // переход на последнюю запись файла

Write (F1,Tov); // записываем в файл запись

Edit1.text:= ‘’; // очистка

Edit2.text:= ’’;

ComboBox1.text:= ‘’;

ComboBox2.text:= ‘’;

    Добавьте к приложению новую форму «Просмотр всех данных » для вывода данных из файла. Разместите на форме компонент StringGrid1. В Инспекторе объектов для формы «Просмотр всех данных» выберите событие OnActivate. Напишите в процедуре программный код:

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

StringGrid1.RowCount: = FileSize(F1)+1 ; //

ширина первого поля таблицы

ширина второго поля таблицы

Stringgrid1.ColWidths := 100; //

Stringgrid1.ColWidths := 100; // ширина пятого поля таблицы

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

WhiLe not eof(F1) do

Read(F1,tov) ; // считали запись из файла

    Добавьте к приложению новую форму «Просмотр по условию » для вывода данных из файла. Разместите на форме компоненты Label, ComboBox1, BitBtn1 и StringGrid1. В Инспекторе объектов для формы «Просмотр по условию» выберите событие OnActivate. Напишите в процедуре программный код:

If FileExists(‘postav.txt’) = true then ComboBox1.items.LoadFromFile(‘postav.txt’);
StringGrid1.visible:= false ;

    В Инспекторе объектов для компонента BitBtn1назначьте свойству Caption значение ‘Просмотр’ и выберите событие OnClick. Напишите в процедуре программный код:

If ComboBox1.text = ‘’ Then // если не выбран Поставщик тогда …

ShowMessage(‘Заполните все поля!’);

Exit ; // принудительный выход из процедуры

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

WhiLe not eof(F1) do

Read(F1,tov) ; // считали запись из файла

If tov.Postav = ComboBox1.text then K: = K + 1 ;

If k = 0 Then // если нет товара от выбранного Поставщика тогда …

ShowMessage (‘Нет товара от выбранного поставщика!’);

Exit ; // принудительный выход из процедуры

StringGrid1.RowCount: = k+1 ; // установили количество строк в таблице

StringGrid1.CoLCount: = 5 ; // установили количество столбцов в таблице

StringGrid1. FixedCols:= 0 ; // количество фиксированных столбцов

StringGrid1. FixedRows:= 1; // количество фиксированных строк

Stringgrid1.ColWidths := 100; // ширина первого поля таблицы

Stringgrid1.ColWidths := 120; // ширина второго поля таблицы

Stringgrid1.ColWidths := 130; // ширина третьего поля таблицы

Stringgrid1.ColWidths := 100; // ширина четвертого поля таблицы

Stringgrid1.ColWidths := 100; // ширина пятого поля таблицы

StringGrid1.CeLLs := ‘Дата поставки’ ;

StringGrid1.CeLLs := ‘Название товара’ ;

StringGrid1.CeLLs := ‘Поставщик’ ;

StringGrid1.CeLLs := ‘Цена за единицу’ ;

StringGrid1.CeLLs := ‘Количество’ ;

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

i:= 1; // i – номер строки таблицы для вывода данных из файла

WhiLe not eof(F1) do

Read(F1,tov) ; // считали запись из файла

If tov.Postav = ComboBox1.text then

StringGrid1.CeLLs := DateToStr(tov.DateP) ;

StringGrid1.CeLLs := tov.Tovar ;

StringGrid1.CeLLs := tov.Postav ;

StringGrid1.CeLLs := FloatToStr(tov.cena) ;

StringGrid1.CeLLs := intToStr(tov.kol) ;

i:= i + 1 ; // переход на следующую строку

StringGrid1.visible:= true ;

    Добавьте к приложению новую форму «Корректировка данных » для изменения записи файла (например, Form8). Разместите на форме компоненты такие же как на форме «Добавление». Обеспечьте проверку корректности ввода данных в компоненты edit1, edit2 используя событие OnKeyPress.
    В Инспекторе объектов для формы «Корректировка данных» выберите событие OnActivate. Напишите в процедуре программный код:

If FileExists(‘tovar.txt’) = true then ComboBox1.items.LoadFromFile(‘tovar.txt’);

If FileExists(‘postav.txt’) = true then ComboBox2.items.LoadFromFile(‘postav.txt’);

    В процедуру пункта меню «Корректировка» напишите программный код:

Form6.Show ; //
Z:= 44; //
// «Корректировка»

В Инспекторе объектов для компонента StringGrid1 формы «Просмотр всех данных» выберите событие OnDbLClick. Напишите в процедуре программный код:

If z = 44 then

Y:= StringGrid1.Row ; //

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

Seek (F1, y – 1) ; //

Read(F1, Tov) ; // считали из файла запись

Form8.dateTimePicker1.Date:= Tov.DateP ;

Form8.Combobox1.text:= Tov.Tovar ;

Form8.Combobox2.text:= Tov.Postav ;

Form8.edit1.text:= FLoatToStr (Tov.Cena) ;

Form8.edit2.text:= intToStr (Tov.Kol) ;

If (Edit1.tetx = ‘’) or (Edit2.text = ‘’) or (ComboBox1.text = ‘’) or (ComboBox2.text = ‘’) Then Begin

ShowMessage(‘Заполните все поля!’);

Exit ; // принудительный выход из процедуры

Reset (F1) ; // открыли файл для записи

Seek (F1, y – 1) ; // переместились в файле на запись с номером у-1

Tov.DateP:= dateTimePicker1.Date;

Tov.Tovar:= Combobox1.text;

Tov.Postav:= Combobox2.text ;

Tov.Cena:= StrToFloat (edit1.text);

Tov.Kol:= StrToInt (edit2.text);

Write (F1,Tov); // записываем в файл запись

Edit1.text:= ‘’; // очистка

Edit2.text:= ’’;

ComboBox1.text:= ‘’;

ComboBox2.text:= ‘’;

    В процедуру пункта меню «Удаление » напишите программный код:

Form6.Show ; // вызов формы «Просмотр всех данных»
Z:= 55; // признак того, что мы открыли форму «Просмотр» из пункта меню
// «Удаление»

В Инспекторе объектов для компонента StringGrid1 формы «Просмотр всех данных» выберите событие OnDblClick. Дополните процедуру программным кодом:

If z = 55 then

Otv:= MessageDlg ("Удалить запись? ", mtConfirmation, , 0) ;

if Otv = mrYes then

Y1:= StringGrid1.Row ; // определили номер текущей строки таблицы

Y2:= Y1 -1 ; // номер записи в файле, которую надо удалить

AssignFile(F3, ‘result.dat’);

Rewrite(F3); //

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

While not eof(F1) do

If FilePos(F1) Y2 then

Read(F1, tov) ; // считали запись из файла F 1

Write(F3, tov) ; // записали запись в файл F 3

ELSE Read(F1,tov);

Deletefile(Name_F) ; // удалили исходный файл

RenameFile(‘result.dat’, Name_F); // переименовали файл result.dat

    Добавьте к приложению новую форму «Печать по условию ». Разместите на форме компоненты Label, DateTimePicker, BitBtn.

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

AssignFile(F2, ‘pechat.txt’);

Rewrite(F2); // создали и открыли файл для записи

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

K1:= 0; //первоначальное значение для подсчёта количества записей за указанную дату

While not eof(F1) do

Read(F1, tov) ; //

If DateToStr(tov.DateP) = DateToStr (DateTimePicker1.date) then

D:= DateToStr(DateTimePicker1.date) ;

K1:= K1 + 1; // подсчёт количества записей за указанную дату

WriteLN (F2, tov.Tovar: 20, tov.Postav: 20, tov.Cena: 20: 2, tov.Kol: 15) ; // записали в
текстовый файл

    Добавьте к приложению новую форму (Form10).

    установите на Form10 компонент QuickRep1, который находится на странице QREPORT палитры компонентов;

    в Инспекторе объектов выберите в свойстве Bands подсвойство HasPageHeader и установите ему значение True, что обеспечит наличие верхнего колонтитула в
    выходном документе;

    в Инспекторе объектов выберите в свойстве Bands подсвойство HasTitle и установите ему значение True, что обеспечит наличие заголовочной полосы в выходном документе;

    установите на компонент QuickRep1 компонент QRStringsBand, который находится на странице QREPORT палитры компонентов;

    в Инспекторе объектов для компонента QuickRep1 выберите в свойстве Bands подсвойство HasPageFooter и установите ему значение True, что обеспечит наличие нижнего колонтитула в выходном документе;

    установите на полосу отчёта HasPageHeader компонента QuickRep1 компонент QRMemo1, который находится на странице QREPORT палитры компонентов. В Инспекторе объектов в свойстве Lines запишите информацию об организации на чей склад поступают товары;

    установите на полосу отчёта HasTitle компонента QuickRep1 компонент QRLabel1, который находится на странице QREPORT палитры компонентов. В Инспекторе объектов свойству Caption назначьте значение "Информация о поступлении товаров за ". В Инспекторе объектов измените значения свойства Font, чтобы заголовок документа выделялся от основной информации;

    установите на полосу отчёта HasTitle компонента QuickRep1 компонент QRLabel2, который находится на странице QREPORT палитры компонентов. Дополните программный код кнопки «Печать» строчкой:
    Form10.QRLabel2.Caption:= D ;

    установите на компонент QRStringsBand компонент QRExpr1, который находится на странице QREPORT палитры компонентов. В Инспекторе объектов свойству Expression назначьте значение QRStringsBand1;

    установите на полосу отчёта HasPageFooter компонента QuickRep1 компонент QRLabel3, который находится на странице QREPORT палитры компонентов. В Инспекторе объектов свойству Caption назначьте значение "Дата и время формирования документа";

    установите на полосу отчёта HasPageFooter компонента QuickRep1 компонент QRSysData1, который находится на странице QREPORT палитры компонентов. В Инспекторе объектов свойству Data назначьте значение qrsDateTime;

    установите на полосу отчёта HasPageFooter компонента QuickRep1 компонент QRLabel4, который находится на странице QREPORT палитры компонентов. В Инспекторе объектов свойству Caption назначьте значение "Общее количество товаров:";

    установите на полосу отчёта HasPageFooter компонента QuickRep1 компонент QRLabel5, который находится на странице QREPORT палитры компонентов. В программный код кнопки "ПЕЧАТЬ" допишите строку:
    Form10.QRLabel5.Caption:= intToStr (k1);

    тело процедуры-обработчик события "Нажатие кнопки ПЕЧАТЬ" дополните следующим программным кодом:

ShowMessage (‘Поставки за выбранную дату отсутствуют!’);

Exit ; // принудительный выход из процедуры

form10.QRStringsBand1.Items.Clear;

form10.QRStringsBand1.Items.LoadFromFile("pechat.txt");

form10.QRExpr1.AutoSize:=false;

form10.QRExpr1.AutoStretch:=true;

form10.QRExpr1.Left:=0;

form10.QRExpr1.Width:=form10.QRStringsBand1.Width;

form10.QuickRep1.Preview;

    Добавьте к приложению новую форму (Form11). В Инспекторе объектов свойству Caption назначьте значение "Товарная карточка". Разместите на форме компоненты такие же как на форме «Добавление», но вместо компонентов dateTimePicker1, Combobox1 и Combobox2 используйте компоненты Edit3, Edit4 и Edit5, а кнопку «Сохранить» переименуйте в «Печать»

    В процедуру пункта меню «Печать документа » напишите программный код:

Form6.Show ; // вызов формы «Просмотр всех данных»
Z:= 66; // признак того, что мы открыли форму «Просмотр» из пункта меню
// «Печать документа»

В Инспекторе объектов для компонента StringGrid1 формы «Просмотр всех данных» выберите событие OnDbLClick. Дополните процедуру программным кодом:

If z = 66 then

Y:= StringGrid1.Row ; // определили номер текущей строки таблицы

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

Seek (F1, y – 1) ; // переместились в файле на запись с номером у-1

Read(F1, Tov) ; // считали из файла запись

CloseFile (F1) ;

Form11.Edit5.text:= DateToStr(Tov.DateP) ;

Form11.Edit4.text:= Tov.Tovar ;

Form11.Edit3.text:= Tov.Postav ;

Form11.Edit1.text:= FLoatToStr (Tov.Cena) ;

Form11.Edit2.text:= intToStr (Tov.Kol) ;

    В Инспекторе объектов для кнопки «Печать» на Form11 выберите событие OnClick. Напишите в процедуре программный код: Form11.Print ;

If Edit1.text = … then

End ELSE ShowMessage (‘Пароль неверный ’) ;


В Инспекторе объектов для кнопки «Найти» выберите событие OnClick. Напишите в процедуре программный код:

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

While not eof(F1) do

Read(F1, tov) ; // считали запись из типизированного файла

If (DateToStr (tov.DateP) = DateToStr (DateTimePicker1.date)) and (tov.Postav = Combobox1.text) then

Form13. Label6. caption:= DateToStr (Tov.DateP) ;

Form13. Label7. caption:= Tov.Tovar ;

Form13. Label8. caption:= Tov.Postav ;

Form13. Label9. caption:= FloatToStr (Tov.Cena) ;

Form13. Label10. caption:= IntToStr (Tov.Kol) ;

CloseFile (F1) ;

If XX = 0 then ShowMessage (‘Данные отсутствуют… ‘) ;

Поименованная область памяти на внешнем носителе (диске) называется файлом . У любого файла есть имя . Информация , которая хранится в файле, представляет собой множество элементов одного типа. Размер файла, как правило, ограничен только емкостью устройства, на котором он хранится, что позволяет обрабатывать большие объемы информации.

Способ объявления файла зависит от его типа. Различают три типа файлов:

текстовые ;

типизированные ;

нетипизированные .

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

Описание текстового файла :

var имя_переменной: TextFile;

Типизированный файл состоит из элементов одного типа, число которых заранее не определено и может быть любым. Он так же заканчивается символом «конец файла». Данные в типизированном файле хранятся в двоичных кодах и не просматриваются текстовыми редакторами. Объявление таких файлов имеет вид:

имя_переменной: file of тип;

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

var имя_переменной: file;

Для доступа к файлам используют специальную файловую переменную .

Например:

c:file of integer;

Для связи файловой переменной с файлом на диске примняют процедуру:

AssignFile(переменная, имя_файла);

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

Например:

S:=’text.txt’;

assign (f,’d:\tp\tmp\abc.dat’);

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

Reset(файловая_переменная);

После открытия файла доступен его первый компонент.

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

Rewrite(файловая_переменная);

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

CloseFile(файловая_переменная);

Запись данных в текстовый файл осуществляется процедурами

Write(переменная, список_выражений);

Writeln(переменная,список_выражений);

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

Процедура Writeln в конце каждой строки добавляет символ «окончание строки».

ПРИМЕР. Подпрограмма, которая создает на диске D файл abc.txt и записывает в него таблицу умножения.

var f:TextFile; i,j:byte;

assignFile(f,"d:\abc.txt");

for i:=2 to 9 do

for j:= 2 to 9 do

write(f,i,"*",j,"=",i*j," ");

Чтение данных из файла осуществляется последовательно от начала файла процедурой

Readln(переменная,список_переменных);

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

Процедура Readln после чтения из файла очередного элемента переходит к следующей строке.

Обращение к следующей подпрограмме приведет к тому, что на форме в окне редактирования появится текст из файла D:\abc.txt :

procedure TForm1.Button1Click(Sender: TObject);

a:string; i:integer;

AssignFile(f1,"D:\abc.txt");

for i:=1 to 8 do

Memo1.Lines.Add(a);

Для типизированных файлов так же применимы процедуры чтения и записи

Read(переменная,список_переменных);

Write(переменная,список_выражений);

только типы выражений при записи и чтении должны соответствовать объявленному типу файла. Процедуры Writeln и Readln к типизированным файлам не применяют.

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

Seek(переменная, номер);

Эта процедура позволяет перейти к элементу с указанным номером, то есть осуществляет прямой доступ к компонентам файла . При прямом доступе компоненты файла нумеруются от 0 до n-1, где n – число компонентов в файле.

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

filesize(переменная) – возвращает число реальных компонентов в открытом файле, связанном с файловой_переменной (для пустого файла функция вернет 0);

filepos(переменная) – возвращает значение текущей позиции в открытом файле, связанном с файловой переменной (если файл только что открылся, то функция вернет ноль, после прочтения последнего компонента из файла значение функции совпадает со значением filesize, что указывает на достижение конца файла).

Процедура Seek и функции filesize и filepos с текстовыми файлами не работают. Следующие подпрограммы работают как с типизированными, так и с текстовыми файлами:

Rename(переменная,имя_файла)

переименовывает закрытый файл, связанный с файловой переменной, в соответствии с именем указанным в строке имя файла;

Erase(переменная) – удаляет закрытый файла, связанный с файловой переменной;

Eof(переменная) принимает значение истина (true), если достигнут конец файла, связанного с файловой_переменной, и ложь (false) в противном случае;

ПРИМЕР. Подпрограмма, приведенная ниже, работает так. Открывается вещественный файл d:\abc.dat и в него записывается определенное количество вещественных чисел, вычисленных по формуле. Просмотреть созданный файл не возможно, так как информация в нем представлена в двоичных кодах.

procedure TForm1.Button1Click(Sender: TObject);

AssignFile(f,"d:\abc.dat");

n:=StrToInt(Edit1.Text);

for i:=1 to n do

a:= sqr(i)/sqrt(i);

Чтобы убедиться, что запись в файл d:\abc.dat произошла успешно, выведем его значения в окно редактирования:

procedure TForm1.Button1Click(Sender: TObject);

f1:file of real;

AssignFile(f1,"D:\abc.dat");

while not eof (f1) do

Memo1.Lines.Add(FloatToStr(a));

ЗАДАЧА. На диске Е есть файл целых чисел аbc.int , поменять местами его максимальный и минимальный элементы.

Приведенная далее программа работает так. Компоненты файла считываются в массив. Элементы массива выводятся в поле Memo1. Затем происходит поиск минимального и максимального элементов массива и их индексов. Максимальный и минимальный компоненты перезаписываются в файл на соответствующие позиции.

В заключении элементы преобразованного файла выводятся в поле Memo2.

procedure TForm1.Button1Click(Sender: TObject);

f:file of integer;

a:array of integer;

i,nmax,nmin:byte; max,min:integer;

AssignFile(f,"e:\abc.int");

for i:=0 to filesize(f)-1 do

Memo1.Lines.Add(FloatToStr(a[i]));

max:=a; nmax:=0;

min:=a; nmin:=0;

for i:=1 to filesize(f)-1 do

if a[i]>max then

if a[i]

for i:=0 to filesize(f)-1 do

Memo2.Lines.Add(FloatToStr(a[i]));




Top