ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
ИЗУЧЕНИЕ РАБОТЫ С ФАЙЛАМИ В СИСТЕМЕ DELPHIЦелью данного раздела является изучение разновидностей файлов, описания файлов, приемов работы с файлами в системе Delphi, получение навыков программирования с использованием файлов. Виды файлов Под файлом понимается именованная область внешней памяти ПК (жесткого диска, дискеты, диска CD-ROM), способная хранить некоторую совокупность информации. В эту область внешней памяти можно как поместить определенные данные, так и извлечь их из нее. Файл представляет собой последовательность элементов одного типа. Типом элементов может быть любой тип Object Pascal, кроме файлов, то есть нельзя создать «файл файлов». Любой файл имеет имя − выражение строкового типа, которое строится по правилам определения имени. Наличие имени даёт возможность программе работать одновременно с несколькими файлами. Длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти. В зависимости от способа объявления можно выделить три вида файлов: 1. Типизированные файлы (задаются предложением File of...). 2. Текстовые файлы (определяются типом TextFile). 3. Нетипизированные файлы (определяются типом File). Файловый тип или переменную файлового типа можно задать одним из трех способов: var <имя>: File of <тип>; //типизированный файл <имя>: TextFile; //текстовый файл <имя>: File; //нетипизированный файл Здесь <имя> − имя файлового типа (правильный идентификатор); File, of − зарезервированные слова (файл, из); TextFile − имя стандартного типа для текстовых файлов; <тип> − любой тип Object Pascal, кроме файлов. Например: type Product = record Name: String; Code: Word; Cost: Comp; end; Text80 = File of String [80]; var Fl: File of Char; F2: TextFile; F3: File; F4: Text80; F5: File of Product; В данном примере Fl, F4 и F5 − типизированные файлы, F2 − текстовый файл, F3 − нетипизированный файл. Файл можно представить как потенциально бесконечный список значений одного и того же (базового) типа. Все элементы файла считаются пронумерованными, начальный элемент имеет нулевой номер. В любой момент времени программе доступен только один элемент файла, на который ссылается текущий указатель. Как правило, все действия с файлом (чтение, запись) производятся поэлементно, причём в этих действиях участвует тот элемент файла, который обозначается текущим указателем. В результате совершения операций текущий указатель может перемещаться, настраиваясь на тот или иной элемент файла. По способу доступа к элементам различают файлы прямого и последовательного доступа. Файлом последовательного доступа называется файл, к элементам которого обеспечивается доступ в такой же последовательности, в какой они записаны. Файлом прямого доступа называется файл, доступ к элементам которого осуществляется по номеру элемента. Вид файла, вообще говоря, определяет способ хранения в нем информации. Однако в Object Pascal нет средств контроля, вида ранее созданных файлов. При объявлении уже существующих файлов программист должен сам следить за соответствием вида объявления характеру хранящихся в файле данных. Доступ к файлам Файлы становятся доступны программе только после выполнения особой процедуры открытия файла. Эта процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла. Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре AssignFile: AssignFile (<ф.п.>, <имя файла>); Здесь <ф.п.> − файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа); <имя файла> − текстовое выражение, содержащее имя файла. В Object Pascal можно открыть файл для чтения, для записи информации, а также для чтения и записи одновременно. Для чтения файл открывается с помощью стандартной процедуры Reset: Reset (<ф.п.>); Здесь <ф.п.> − файловая переменная, связанная ранее функцией AssignFile с уже существующим файлом. При выполнении этой процедуры файл подготавливается к чтению информации. В результате специальная переменная-указатель, связанная с этим файлом, будет указывать на начало файла, т. е. на элемент с порядковым номером 0. Если делается попытка открытия несуществующего файла, возбуждается исключительная ситуация. Например, следующий фрагмент программы позволяет установить, существует ли требуемый файл на диске: var F: File; IsFile: Boolean; begin AssignFile(F,'myfile.dat'); try Reset(F); IsFile:= True; except IsFile:= False; end; if IsFile then // Файл существует else // Файл не существует end; В этом фрагменте с помощью блока try... except... end реализуется защита программы от краха в случае, если делается попытка открыть несуществующий файл. В случае отсутствия файла при выполнении оператора Reset (F) нормальное выполнение программы прервется, и управление будет передано в секцию except... end для обработки исключения, в которой переменной IsFile будет присвоено значение False. Если файл существует, исключение не возникнет и переменная IsFile получит значение True. Защита программы от краха в случае, если делается попытка открытия несуществующего файла, может быть выполнена с помощью функции lOResult. Функция lOResult досталась Object Pascal в наследство от Турбо Паскаля. Она используется следующим образом: перед фрагментом программы, в котором может возникнуть ошибка ввода-вывода, ставится директива {$I-}, отключающая автоконтроль операций ввода-вывода. После выполнения опасного участка автоконтроль включается вновь директивой {$I+}, и вызывается функция lOResult. Если операция завершилась успешно, функция возвращает ноль. Следует помнить, что lOResult становится доступной только при отключенном автоконтроле ошибок ввода-вывода. Если автоконтроль отключен, а операция ввода-вывода привела к возникновнию ошибки, устанавливается флаг ошибки и все последующие обращения к вводу-выводу блокируются, пока не будет вызвана функция lOResult. Вот как можно проверить существование файла: var F: File; begin AssignFiie(F,'MyFile'); {$I-} // Отключаем автоконтроль Reset(F); // Пытаемся открыть файл {$I+} // Включаем автоконтроль if IOResult=0 then // Файл существует else // Файл не существует end; Стандартная процедура Rewrite (<ф.п.>); открывает новый файл, связанный с файловой переменной <ф.п.>, для записи. Процедурой Rewrite нельзя инициировать запись информации в ранее существовавший дисковый файл: при выполнении этой процедуры старый файл (если он был) уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации и его указатель принимает значение 0. Стандартная процедура Append (<ф.п.>); открывает ранее существовавший текстовый файл для его расширения, при этом указатель файла устанавливается в его конец. Процедура Append применима только к текстовым файлам. Если текстовый файл ранее уже был открыт с помощью Reset или Rewrite, использование процедуры Append приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей. Функции и процедуры для работы с файлами В таблице 10.1 описываются функции, которые можно использовать с файлами любого вида. Специфика работы с типизированными, текстовыми и нетипизированными файлами рассматривается ниже. Таблица 10.1 Функции и процедуры для работы с файлами
Продолжение табл. 10.1
Окончание табл. 10.1
Функции FindFirst, FindNext и FindClose позволяют получить доступ к группе файлов, объединенных общими признаками. Эти признаки указываются маской выбора файлов и их атрибутами при обращении к функции FindFirst. При формировании маски выбора файлов могут использоваться следующие символы-заменители: 1) * − означает, что на месте этого символа может стоять сколько угодно (в том числе ноль) разрешенных символов имени или расширения файла; 2)? − означает, что на месте этого символа может стоять один из разрешенных символов. Например: *. * выбирает все файлы из каталога; с*. * выбирает все файлы с именами, начинающимися на с (c1.pas, сс 12345, c.dat и т.д.); а?. dat выбирает имена файлов типа a0.dat, az.dat и т.д. Маске выбора может предшествовать маршрут поиска файлов. Например, команда C:\Dir\SubDir\*.pas означает, что нужно выбрать все файлы с расширением .pas из каталога SubDir, находящегося на диске С; каталог SubDir зарегистрирован в каталоге верхнего уровня Dir, который в свою очередь входит в корневой каталог. Если маршрут не указан, файлы ищутся в текущем каталоге. Параметр Attr при обращении к FindFirst содержит двоичные разряды (биты), уточняющие, к каким именно файлам разрешен доступ. Вот как объявляются файловые атрибуты в модуле SysUtils: const faReadOnly = $01; // Только чтение faHidden = $02; // Скрытый файл faSysFile = $04; // Системный файл faVolumelD = $08; // Идентификатор тома faDirectory = $10; // Имя подкаталога faArchive = $20; // Архивный файл faAnyFile = $3F; // Любой файл Комбинацией бит в этом байте можно указывать самые разные варианты, например $06 − выбирать все скрытые и/или системные файлы. Результат работы процедуры FindFirst возвращается в переменной типа TSearchRec. Этот тип определяется следующим образом: type TSearchRec = record Time: integer; Size: integer; Attr: Integer; Name: TFileName; ExcludeAttr: integer; FindHadie: THandle; FindDate: Twin32FindDate; end; Здесь Attr − атрибуты файла (см. выше); Time − время создания или последнего обновления файла; Size − длина файла в байтах; Name − имя и расширение файла; FindDate − содержит дополнительную информацию о файле (время создания, время последнего доступа). Результат обращения к процедуре FindFist возвращается в значении типа Integer, которое равно 0, если нет ошибок. Следующий обработчик bbRunClick учебной программы иллюстрирует способ использования функций FindFirst и FindNext. Программа выводит на экран список всех файлов, маска выбора которых (и, возможно, маршрут поиска) указана в окне edInput: function TfmExample.bbRunCiick(Sender: TObject); var Mask: String; SR: TSearchRec; Found: integer; begin Mask:= edInput.Text, if Mask = ' ' then Mask:='*.*'; Found:=FindFirst(Mask,faAnyFile,SR); while Found = 0 do begin mmOutput.Lines.Add(SR.Name); Found:= FindNext(SR) end; FindClose(SR); end; Любое обращение к файлу в Object Pascal осуществляется через некоторый буфер, что необходимо для согласования внутреннего представления файлового компонента (записи) с принятым в ОС форматом хранения данных на диске. В ходе выполнения процедуры Flush все новые записи будут действительно записаны на диск. Процедура игнорируется, если файл был инициирован для чтения процедурой Reset. Текстовые файлы Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу TextFile. Текстовые файлы предназначены для хранения текстовой информации. Именно в таких типах файлов хранятся, например, исходные тексты программ. Текстовый файл трактуется в Object Pascal как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой строки ставится специальный признак EOLN (End Of LiNe − конец строки), а в конце всего файла − признак EOF (End Of File − конец файла). Эти признаки можно протестировать одноименными логическими функциями. При формировании текстовых файлов используются следующие системные соглашения: EOLN − последовательность кодов #13 (CR) и #10(LF), EOF − код #26. Для доступа к записям применяются процедуры Read, ReadLn, Write, WriteLn, описанные ниже (табл. 10.2). Первым параметром в любой из перечисленных процедур должна стоять файловая переменная. Обращение осуществляется к дисковому файлу, связанному с переменной F процедурой AssignFile. Таблица 10.2 Функции и процедуры для работы с текстовыми файлами
Процедура Read предназначена для последовательного чтения из текстового файла символьных представлений переменных Vi. При чтении переменных типа Char выполняется чтение одного символа и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ CR (код #13), а если достиг конца файла, − символ EOF (код #26). Процедуру Read не рекомендуется использовать для ввода переменных типа String, так как она не способна «перепрыгнуть» через разделитель строк EOLN и читает только первую строку текстового файла. Для ввода последовательности строк нужно использовать процедуру ReadLn. Программа, использующая такой обработчик bbRunClick, «зависнет», так как никогда не будет прочитана вторая строка файла: function TfmExample.bbRunClick(Sender: TObject); var F: TextFile; S: String; begin AssignFile(F,'example.pas'); Reset(F); while not EOF(F) do begin Read(F,S); // Ошибка! Бесконечный цикл! mmOutput.Lines.Add(S) end; CloseFile(F) end; В Object Pascal не предусмотрен ввод шестнадцатеричных констант. Процедура Read прекрасно приспособлена к вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура «перескакивает» маркеры конца строк, т.е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовые представления чисел. В сочетании с проверкой конца файла функцией EOF процедура Read позволяет организовать простой ввод массивов данных, например, так: const N = 1000; // Максимальная длина ввода var F: TextFile; М: array [1..N] of Real; i: Integer; begin AssignFile(F,'prog.dat'); Reset (F); i:= 1; while not EOF(f) and (i <= N) do begin Read(F,M[i]); inc (i) end; CloseFile(F); end; Процедура ReadLn идентична процедуре Read за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к ReadLn начинается с первого символа новой строки. Кроме того, эту процедуру можно вызвать без параметров Vi, что приведет к пропуску всех символов текущей строки вплоть до EOLN. Если в обработчике bbRunClick (см. предыдущий пример) заменить Read на ReadLn, программа выведет в окно компонента mmOutput все строки из текстового файла EXAMPLE.PAS. Процедура Write обеспечивает вывод в текстовый файл группы переменных. Любой элемент списка вывода может иметь форму OutExpr [: MinWidth [: DecPlaces ] ] Здесь OutExpr − выводимое выражение; MinWidth, DecPlaces − выражения типа Integer (квадратные скобки означают возможность отсутствия заключенных в них параметров). Параметр MinWidth, если он присутствует, указывает минимальную ширину поля, в которое будет записываться символьное представление значения OutExpr. Если символьное представление имеет меньшую длину, чем MinWidth, оно будет дополнено слева пробелами, если большую длину, то MinWidth игнорируется и в файл помещается необходимое число символов. Параметр DecPlaces задает количество десятичных знаков в дробной части вещественного числа. Он может использоваться только совместно с MinWidth и только по отношению к выводимому выражению одного из вещественных типов. Если ширина поля вывода не указана, соответствующий параметр выводится вслед за предыдущим без какого-либо их разделения. Символы и строки передаются выводимому файлу без изменений, но снабжаются ведущими пробелами, если задана ширина поля вывода и эта ширина больше требуемой для вывода. При выводе логических выражений в зависимости от их значения выводятся слова True или False. (Ввод логических констант процедурами Read или ReadLn не предусмотрен.) Вещественные числа выводятся в экспоненциальном формате, если не указан параметр DecPlaces, в противном случае выбирается формат представления числа с фиксированной точкой. Если подпараметр MinWidth опущен, принимается его значение по умолчанию (23). Если MinWidth меньше 10, считается, что он равен 10. Если подпараметр DecPlaces равен нулю, ни дробная часть числа, ни десятичная точка не выводятся. При отрицательном значении DecPlaces этот параметр игнорируется, и число выводится в экспотенциальном формате с учетом MinWidth. Если значение DecPlaces больше 18, принимается значение 18. Следует учесть, что при указании подпараметра DecPlaces вещественное число всегда будет выводиться в формате с фиксированной точкой и требуемым количеством знаков в дробной части, даже если значение подпараметра MinWidth окажется недостаточным для размещения целой части: в этом случае значение MinWidth автоматически увеличивается. Процедура WriteLn полностью идентична процедуре Write за исключением того, что выводимая последовательность символов автоматически завершается маркером EOLN (свое название процедура получила от Write Line − писать строку). При вызове WriteLn можно опускать параметры Pi − в этом случае в файл передается пустая строка. Типизированные файлы Длина любого компонента типизированного файла строго постоянна, что дает возможность организовать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру). Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом. Функции работы с типизированными файлами представлены ниже (табл. 10.3). Таблица 10.3 Функции и процедуры для работы
Нетипизированные файлы Нетипизированные файлы объявляются как файловые переменные типа File и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой − позволяет организовать высокоскоростной обмен данными между диском и памятью. При открытии нетипизированного файла процедурами Reset или Rewrite можно указать длину записи нетипизированного файла в байтах. Например, так: var F: File; begin AssignFile(F,'myfile.dat'); Reset (F, 512); end; Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам Reset или Rewrite, в качестве которого может использоваться выражение типа LongInt. Если длина записи не указана, она принимается равной 128 байтам. Object Pascal не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требования положительности и ограничения максимальной длины 2 Гбайт. Для обеспечения максимальной скорости обмена данными рекомендуется задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт). Однако операции обмена данными с дисковыми устройствами в среде Windows обычно кэшируются, т.е. осуществляются через промежуточный буфер памяти, поэтому часто задают RecSize = 1, что позволяет обмениваться с файлом блоками любой длины, начиная с одного байта. При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением Read и Write, которые заменяются соответственно высокоскоростными процедурами BlockRead и BlockWrite: procedure BlockRead (var F: File; var Buf; C: Integer [; var AmtTransferred: Integer]); procedure BiockWrite(var F: File; var Buf; C: Integer [; var AmtTransferred: Integer]); Здесь Buf − буфер: имя переменной, которая будет участвовать в обмене данными с дисками; C − количество записей, которые должны быть прочитаны или записаны за одно обращение к диску; AmtTransferred − необязательный параметр, содержащий при выходе из процедуры количество фактически обработанных записей. За одно обращение к процедурам может быть передано до C*RecSize байт, где RecSize − длина записи нетипизированного файла. Передача идет, начиная с первого байта переменной Buf. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной Buf была достаточной для размещения всех C *RecSize байт при чтении информации с диска. Если при чтении указана переменная недостаточной длины или в процессе записи на диск не окажется нужного свободного пространства, возникнет ошибка ввода-вывода, которую можно заблокировать, указав необязательный параметр AmtTransferred. После завершения процедуры указатель смещается на C записей. Процедурами Seek, FilePos и FileSize можно обеспечить доступ к любой записи нетипизированного файла. Средства Windows для работы с файлами Операционная система Windows имеет собственные средства работы с файлами (табл. 10.4), которые становятся доступны программе Delphi после ссылки на модуль Windows. Поскольку файловые средства Object Pascal реализуют подавляющее большинство программных запросов, в таблице 10.4 приводится лишь краткая информация о назначении соответствующих API- функций. За подробной информацией нужно обратиться к справочной службе. Таблица 10.4 Средства Windows для работы с файлами
Продолжение табл. 10.4
Окончание табл 10.4
Пример программирования с использованием файлов Задание. Составить программу для работы с каталогом книг в библиотеке. Для определения каждой книги создается запись TRecord с полями: name – «Имя автора», title − «Название книги», code − «Код по каталогу». Создается также нетипизированный файл, состоящий из записей типа TRecord и переменная vs типа TRecord для промежуточного хранения записей. В этой программе используются две формы − Form 1 и Form 2. Обращение к форме Form 2 происходит при нажатии кнопок «Добавить» и «Заменить». Вид форм представлен ниже (рис. 10.1, 10.2). Рис. 10.1. Вид формы Form1 Рис. 10.2. Вид формы Form2 Текст программы: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls; type TRecord=Record name, title: String[80]; //имя автора, название книги code: string[20]; //код по каталогу end; TForm1 = class(TForm) SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; SpeedButton6: TSpeedButton; Label5: TLabel; SpeedButton7: TSpeedButton; procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton4Click(Sender: TObject); procedure SpeedButton5Click(Sender: TObject); procedure SpeedButton6Click(Sender: TObject); procedure SpeedButton7Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; F1:file of TRecord; vs:TRecord; number:integer; implementation uses Unit2; {$R *.dfm} //---------Нажатие на кнопку «Создать файл»------------------ procedure TForm1.SpeedButton1Click(Sender: TObject); begin if SaveDialog1.Execute then begin AssignFile(F1,SaveDialog1.FileName); //Связываем файловую переменную //F1 со значением SaveDialog1.FileName Rewrite(F1); {Инициируем запись информации в файл, связанный с файловой переменной F1} SpeedButton3.Enabled:=True; //Показать кнопку "Добавить" Form1.SpeedButton7.Enabled:=True; //Показать кнопку "Закрыть файл" Form1.SpeedButton1.Enabled:=False; //Скрыть кнопку "Создать файл" Form1.SpeedButton2.Enabled:=False; //Скрыть кнопку "Открыть файл" end; end; //-------------Нажатие на кнопку «Добавить»------------------ procedure TForm1.SpeedButton3Click(Sender: TObject); begin Form2.Edit1.Text:=''; //Обнуляем строки для ввода значений Form2.Edit2.Text:=''; Form2.Edit3.Text:=''; Form2.ShowModal; if IsYes then //если нажата кнопка «Да» на Form2 begin vs.name:=Form2.Edit1.text; //Присваиваем полям записи vs.title:=Form2.Edit2.text; //введенные значения vs.code:=Form2.Edit3.text; Seek(F1,Filesize(f1)); //Переходим в конец файла Write(F1,vs); //Добавляем новую запись в файл end; Form1.Label5.caption:=IntToStr(Filesize(f1)); //Выводим количество записей end; //-------------Нажатие на кнопку «Открыть файл»------------ procedure TForm1.SpeedButton2Click(Sender: TObject); begin if OpenDialog1.Execute then begin Form1.Label1.Enabled:=True; //Показать надписи с 1 по 5 Form1.Label2.Enabled:=True; Form1.Label3.Enabled:=True; Form1.Label4.Enabled:=True; Form1.Label5.Enabled:=True; Form1.Edit1.Enabled:=True; //Показать окошки для редактирования Form1.Edit2.enabled:=True; //полей записи Form1.Edit3.enabled:=True; Form1.SpeedButton4.Enabled:=True;//Показать кнопку «Вперед» Form1.SpeedButton5.Enabled:=True;//Показать кнопку «Назад» Form1.SpeedButton3.Enabled:=True;//Показать кнопку «Добавить» Form1.SpeedButton6.Enabled:=True;//Показать кнопку «Заменить» //Показать кнопку «Закрыть файл» Form1.SpeedButton7.Enabled:=True; Form1.SpeedButton1.Enabled:=False; {Показать кнопку «Создать файл»} Form1.SpeedButton2.Enabled:=False; //Показать кнопку «Открыть файл» AssignFile(F1,OpenDialog1.FileName);{Связываем файловую переменную F1 со значением OpenDialog1.FileName} Reset(F1); //Инициируем файл для чтения Read(f1,vs); //Считываем запись из файла //Выводим на экран значения полей записи Form1.Edit1.Text:=vs.name; Form1.Edit2.Text:=vs.title; Form1.Edit3.Text:=vs.code; //Выводим количество записей Form1.Label5.caption:=IntToStr(Filesize(F1)); end; end; //---------------Нажатие на кнопку «Вперед»----------------- procedure TForm1.SpeedButton4Click(Sender: TObject); begin If Number+1<FileSize(f1) then //если номер следующего элемента меньше, чем номер последнего begin Number:=Number+1; Seek(F1,Number); //Переводим указатель на следующую запись Read(f1,vs); //Считываем запись из файла Edit1.Text:=vs.name; //Выводим на экран значения полей записи Edit2.Text:=vs.title; Edit3.Text:=vs.code; end; end; //---------------Нажатие на кнопку «Назад»----------------- procedure TForm1.SpeedButton5Click(Sender: TObject); begin If Number>0 then //если номер текущего элемента больше нуля begin Number:=Number-1; //Переводим указатель на предыдущую запись Seek(F1,Number); Read(f1,vs); //Считываем запись из файла Edit1.Text:=vs.name; //Выводим на экран значения полей записи Edit2.Text:=vs.title; Edit3.Text:=vs.code; end; end; //----------------Нажатие на кнопку «Заменить»----------------- procedure TForm1.SpeedButton6Click(Sender: TObject); begin Form2.Edit1.Text:=''; //Обнуляем строки для ввода значений Form2.Edit2.Text:=''; Form2.Edit3.Text:=''; Form2.ShowModal; if IsYes then //если нажата кнопка «Да» на Form2 begin vs.name:=Form2.Edit1.text; //Присваиваем полям записи vs.title:=Form2.Edit2.text; //введенные значения vs.code:=Form2.Edit3.text; //Переводим указатель на предыдущую позицию Seek(f1,FilePos(f1)-1); Write(F1,vs); //Добавляем новую запись в файл end; //Переводим указатель на предыдущую позицию Seek(f1,FilePos(f1)-1); Read(f1,vs); //Считываем запись из файла //Выводим на экран считанные значения записи Form1.Edit1.Text:=vs.name; Form1.Edit2.Text:=vs.title; Form1.Edit3.Text:=vs.code; end; //------------Нажатие на кнопку «Закрыть файл»--------------- procedure TForm1.SpeedButton7Click(Sender: TObject); begin CloseFile(f1); //Закрываем файл, связанный с переменной F1 Form1.Label1.Enabled:=False; //Скрыть надписи с 1 по 5 Form1.Label2.Enabled:=False; Form1.Label3.Enabled:=False; Form1.Label4.Enabled:=False; Form1.Label5.Enabled:=False; //Скрыть окошки для редактирования полей записи Form1.Edit1.Enabled:=False; Form1.Edit2.enabled:=False; Form1.Edit3.enabled:=False; Form1.SpeedButton4.enabled:=False; //Скрыть кнопку «Вперед» Form1.SpeedButton5.enabled:=False; //Скрыть кнопку «Назад» Form1.SpeedButton3.enabled:=False; //Скрыть кнопку «Добавить» Form1.SpeedButton6.enabled:=False; //Скрыть кнопку «Заменить» Form1.SpeedButton7.Enabled:=False; //Скрыть кнопку «Закрыть файл» Form1.SpeedButton1.Enabled:=True; //Показать кнопку «Создать файл» Form1.SpeedButton2.Enabled:=True; //Показать кнопку «Открыть файл» end; end. //Текст модуля Unit2 unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Button2: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; ISYes:Boolean; implementation {$R *.dfm} //-----------------Нажатие на кнопку «Да»---------------------- procedure TForm2.Button1Click(Sender: TObject); begin IsYes:=True; Close; end; //------------------Нажатие на кнопку «Нет»--------------------- procedure TForm2.Button2Click(Sender: TObject); begin IsYes:=False; Close; end; end. Контрольные вопросы к главе 10 1. Какие виды файлов существуют в Delphi? 2. Сформулируйте определение текстового файла. 3. Сформулируйте определение типизированного файла. 4. Сформулируйте определение нетипизированного файла. 5. Чем отличается прямой доступ от последовательного доступа? 6. С помощью каких процедур можно создать файл? 7. Как открыть существующий файл? 8. С помощью какой процедуры закрывают файл? 9. С помощью каких процедур можно добавить информацию в текстовый файл? 10. С помощью каких процедур можно добавить информацию в типизированный файл? 11. С помощью каких процедур можно добавить информацию в нетипизированный файл? 12. Какие основные процедуры и функции обработки файлов Вы знаете? 13. Каким образом проверить наличие файла на диске? 14. С помощью каких процедур и функций можно осуществить просмотр типизированного файла? 15. С помощью каких процедур и функций можно осуществить просмотр нетипизированного файла? 16. С помощью каких процедур можно изменить размер блока в нетипизированном файле? 17. С помощью каких процедур и функций можно осуществить просмотр текстового файла? Не нашли, что искали? Воспользуйтесь поиском:
|