with SaveDialog1, Memo1 do if Execute then

begin Lines.SaveToFile(FileName);

OpenDialog1.FileName:=FileName; // Чтобы исправленный текст не затёр источник

end;

Наконец, для кнопки "Сохранить" пишем:

 

Memo1.Lines.SaveToFile(OpenDialog1.FileName); //Сохраняем туда, откуда считали

 

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

 

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

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

 

 

Текстовый файл можно создать в среде Delphi, выбрав в меню команду File –>New –>Other –> OtherFile –>Text.

 

Типизированные файлы

 

Типизированный файл содержит элементы одного типа. Тип элементов может быть любым, кроме файлового типа.


 

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

 

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

 

К типизированным файлам можно с помощью процедуры procedure Seek( var f; n:longint );

организовать прямой доступ. Процедура Seek перемещает файловый указатель в файле, связанном с файловой переменной f, на элемент с номером n. Нумерация элементов файла начитается с нуля.

 

Для определения текущей позиции в файле используется функция function FilePos(var F):longint;

Для определения размера файла используется функция function FileSize(var F):integer;

Например, для установки файлового указателя на последний элемент файла f достаточно записать Seek(f, filesize(f)-1);

на первый элемент Seek(f, 0); вернуться на один элемент назад Seek(f, filepos(f)-1);

 

Процедурой Truncate (var f); можно уменьшить размер файла, удаляя все данные после текущей позиции

 

Нетипизированные файлы

 

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

 

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

 

procedure reset (var f:file {;RecSize:word}); procedure rewrite (var f:file {;RecSize:word});

 

По умолчанию RecSize =128 байтам.

 

За исключением процедур read и write для нетипизированных файлов можно использовать все стандартные процедуры, которые допускаются использовать для типизированных файлов. Вместо процедур read и write используются процедуры

 

procedure blockread (var f:file; var buf; count:integer; {var at:integer}); procedure blockwrite (var f:file; var buf; count:integer; {var at:integer});

здесь f – имя файловой переменной, связанной с нетипизированным файлом, buf – переменная, в которую будут помещаться данные, count – количество записей, которое нужно прочитать или записать за одно обращение к файлу. Переменная buf должна иметь длину не меньшую, чем count*RecSize байт. Необязательный параметр at содержит количество реально прочитанных или записанных записей.


 

Технология работы с файлами в системе Delphi требует определённого порядка действий:

 

 

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

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

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

 

 

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

Для выбора имени файла использовать компоненты OpenDialog, SaveDialog.

 

Текстовые файлы

 

1. Вычислить количество строк из четырех символов данного текстового файла. Выбранный файл отобразить в окне Memo.

 

2. Показать строки файла, начинающиеся с буквы «ф». Для отображения нужных строк использовать компонент Memo.

 

3. Подсчитать число строк файла, оканчивающихся на заданную букву русского алфавита. Выбранный файл отобразить в окне Memo.

 

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

 

5. Дополнить новыми строками уже существующий текстовый файл.

 

6. Найти количество строк данного текстового файла и добавить к нему строку, «Количество строк в файле» и найденное число.

 

7. Дан текстовый файл, содержащий целые числа. Найти количество отрицательных чисел в каждой строке файла.

 

8. Дан текстовый файл, содержащий строки. Найти максимальную длину строки в данном файле. Показать самую длинную строку файла. Если таких строк несколько, показать первую из них.

 

9. Дан текстовый файл, содержащий целые числа. Найти количество чисел в файле. 10.Дан текстовый файл, содержащий целые числа. Найти сумму четных чисел файла.

11.Дан текстовый файл, содержащий целые числа. Найти среднее арифметическое чисел файла.


 

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

 

Типизированные файлы

 

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

 

2. Создать типизированный файл, состоящий из символов, введенных в окно ввода Edit. Заменить в файле все цифры символом ‘?’. (Не использовать вспомогательный файл.)

 

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

 

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

 

5. Создать типизированный файл, состоящий из символов, введенных в окно ввода Edit. Переписать содержимое файла в новый символьный файл, изменяя порядок элементов: сначала все знаки арифметических операций, встречающиеся в файле, а затем все остальные символы.

 

6. Создать типизированный файл, состоящий из символов, введенных в окно ввода Edit. Заменить в файле каждый пробел на ‘_’. (Не использовать вспомогательный файл.)

 

7. Создать типизированный файл, состоящий из целых чисел, введенных в столбик в окно текстового редактора Memo. Вывести содержимое файла в поле метки Label.

 

8. Создать типизированный файл, состоящий из символов, введенных в окно ввода Edit. Заменить в файле каждую латинскую букву ‘e’ пробел на ‘i’.

 

9. Дан типизированный файл целых чисел. Найти сумму элементов файла и записать найденное число после последнего элемента файла.

 

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

 

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

 

12.Дан типизированный файл целых чисел. Заменить каждое число файла, кроме первого, на остаток от деления данного числа на первое число файла. (Не используя вспомогательный файл.)


 

Приложение 1

 

  procedure AssignFile (var F; FileName: String);     Связывает файловую переменную F с именем файла FileName.  
  procedure ChDir (Path: String);     Изменяет текущий каталог. Path - переменная, задающая путь к устанавливаемой по умолчанию папке.  
  procedure CloseFile (var F);     Закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой AssignFile сохраняется. Функции процедуры CloseFile на системном уровне выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Если после применения процедуры CloseFile файл нужно открыть повторно, процедуру AssignFile можно не применять, так как связь файловой переменной с файлом не разрывается.  
  function DateTimeToFileDate (DateTime: TDateTime): Integer;     Преобразует значение переменной DateTime типа TDateTime Delphi в системный формат времени создания (обновления) файла.  
  function FileDateToDateTime (FileDate: Integer): TDateTime;     Преобразует системный формат времени создания (обновления) файла в формат TDateTime Delphi.  
  function DiskFree (D: Byte): LongInt;     Возвращает объём в байтах свободного пространства на указанном диске. Переменная D - номер диска (0 -устройство по умолчанию, текущий диск; 1 - диск А; 2 -диск B; 3 - диск С и т.д.). Функция возвращает значение -1, если указан номер несуществующего диска.  
  function DiskSpace (D: Byte): Integer;     Возвращает объём в байтах полного пространства на указанном диске. Переменная D - номер диска (0 -устройство по умолчанию, текущий диск; 1 - диск А; 2 -диск B; 3 - диск С и т.д.). Функция возвращает значение -1, если указан номер несуществующего диска.  
  function EOF (var F:): Boolean;     Тестирует конец файла и возвращает True, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении - что файл исчерпан.  
  procedure Erase (var F);     Уничтожает файл F. Перед выполнением процедуры файл должен быть закрыт процедурой CloseFile.  
  function FileAge (const FileName: String): Integer;     Для файла FileName возвращает время его последнего обновления (в системном формате) или -1, если такого файла не существует.  
  function FileExists (const FileName: String): Boolean;     Возвращает True, если файл FileName существует, и False в противном случае.  

  function FileGetDate (Handle: Integer): Integer;     По заданному дескриптору файла Handle возвращает время и дату его создания (в системном формате). Если дескриптор не существует, возвращает -1.  
  function FileSetDate (Handle: Integer; Age: Integer): Integer;     Для файла с дескриптором Handle устанавливает новое время и дату его создания Age (в системном формате). В случае удачи возвращает 0 или код ошибки в противном случае.  
  function FindFirst (const Path: String; Attr: Integer; var F: TSearchRec): Integer;     Возвращает в переменной F типа TSearchRec первый из файлов, зарегистрированных в указанном каталоге. Path: путь поиска с маской выбора файлов; Attr: атрибуты выбираемых файлов.  
  function FindNext (var F: TSearchRec): Integer;     Возвращает в переменной F следующий файл в каталоге. Переменная F должна быть предварительно инициирована обращением к функции FindFirst.  
  procedure FindClose (var F: TSearchRec);     Освобождает память, выделенную для поиска файлов функциями FindNext и FindFirst.  
  procedure Flush(var F);     Очищает внутренний буфер файла, гарантируя тем самым сохранность всех последних изменений файла на диске.  
  procedure GetDir (D: Byte; var S: String);     Возвращает текущий каталог (каталог по умлочанию). D - номер устройства (0: устройство по умолчанию, 1 -диск А, 2 - диск В и т.д.); S - переменная типа String, в которой возвращается путь к текущему каталогу на указанном диске.  
  procedure MkDir (Dir: String);     Создаёт новый каталог на текущем диске. Dir - адрес нового каталога, который не может совпадать с именем уже существующего каталога.  
  procedure Rename (var F; NewName: String);     Переименовывает, т.е. задаёт новые адрес и имя файла F. NewName - строковое выражение, содержащее новые адрес и имя файла. Перед выполнением процедуры необходимо закрыть файл.  
  procedure Reset (var F: File[; RecSize: Word]);     Открывает существующий файл. Переменная RecSize имеет смысл только для нетипизированных файлов и указывает размер блока данных.  
  procedure Rewrite (var F: File[; RecSize: Word]);     Создаёт новый файл. Переменная RecSize имеет смысл только для нетипизированных файлов и указывает размер блока данных.  
  procedure RmDir (Dir: String);     Удаляет каталог Dir. Удаляемый каталог должен быть пустым, т.е. не содержать файлов или вложенных каталогов.  
  function CopyFile (OldName, NewName: AnsiChar; FileExists: Boolean): Boolean;     Копирует файл. Эта функция - не встроенная функция Delphi, а одна из API функций ОС Windows. Возможность работать с ними программа получает  

 

    после добавления в секцию uses модуля Windows. Параметры функции: OldName - старые адрес и имя файла; NewName - новые адрес и имя файла; FileExists - переменная, определяющая реакцию на существование файла по новому адресу. При FileExists=False файл будет перезаписан. При FileExists=True функция завершится ошибкой.  
  function GetLogicalDrives: Cardinal;     Эта функция - также из состава WinAPI функций. Как и следует из её названия, позволяет получить структуру логических дисков компьютера.