- •3.1. Цель работы.
- •3.2. Задание на подготовку к лабораторной работе.
- •3.3. Порядок выполнения работы.
- •3.4. Варианты заданий и условия задач.
- •3.5. Вопросы для самопроверки.
- •Варианты заданий на разработку приложения с применением диалоговых компонентов.
- •3.6. Методические указания.
- •3.6.1 Общие сведения о работе с файлами в среде Delphi
- •3.6.2 Компонент Memo
- •3.6.3 Основные правила использования диалоговых компонентов
- •3.6.4 Диалоговые окна для работы с файлами.
- •3.6.4.1 Компонент OpenDialog
- •3.6.4.2 Компонент SaveDialog.
- •3.6.4.3 Компоненты tOpenPictureDialog и tSavePictureDialog
- •3.6.5 Пример использования диалогового компонента
- •3.6.6 Пример программирования операций с файлами с применением диалоговых панелей
3.6. Методические указания.
3.6.1 Общие сведения о работе с файлами в среде Delphi
При разработке приложений очень часто приходится решать задачи обмена данными между приложениями или приложением и устройством ввода/вывода. При этом большая часть программы занимается обеспечением работы приложения с файлами. Под файлом понимается именованная область внешней памяти ПК (жесткого диска, гибкой дискеты, диска CD-ROM).
Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Object Pascal, кроме файлового (нельзя создать “файл файлов”). В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти. Для использования файлов в приложении разработчику приходится решать множество задач. Основные из них - это поиск необходимого файла и выполнение с ним операций ввода/вывода.
Основные принципы и структура файловой системы мало изменились со времен MS DOS. Новые файловые системы (FAT32, NTFS) и появившаяся в Windows 2000 служба Active Directory не изменяют главного - понятия файла и способов обращения к нему. Также как и в языке Turbo (Borland) Pascal, в Object Pascal в зависимости от способа объявления можно выделить три вида файлов:
типизированные файлы (задаются предложением File of ...);
текстовые файлы (определяются типом TextFile);
нетипизированные файлы (определяются типом File).
Среда Delphi дает возможность выбрать один из четырех вариантов работы с файлами:
использование традиционного набора функций работы с файлами, унаследованного от Turbo Pascal;
использование функций ввода/вывода Windows API;
использование потоков (TStream и его потомки);
использование отображаемых файлов.
Кроме того, многие компоненты (подобно рассмотренному в п. 3.6.2 компоненту Memo), ориентированные на работу с файлами, содержат методы, обеспечивающие выполнение основных операций над файлами.
Рассмотрим особенности выполнения двух самых распространенных операций, используемых при работе с файлами с использованием традиционного набора функций работы с файлами, унаследованного от Turbo Pascal. Это чтение и запись. Для их выполнения применяются специальные функции файлового ввода/вывода, которые обычно используются в следующем порядке:
1. Объявляется файловая переменная необходимого типа.
2. При помощи функции AssignFile эта переменная связывается с требуемым файлом.
3. Открывается файл при помощи функций Append, Reset, Rewrite.
4. Выполняются операции чтения или записи. При этом в зависимости от сложности задачи и структуры данных может использоваться целый ряд вспомогательных функций.
5. Закрывается файл при помощи функции closeFile.
По сравнению с Turbo Pascal изменились названия только двух функций: Assign стала AssignFile, a close превратилась в closeFile.
Аналогично выполняются и другие операции над файлами.
Ввод/вывод с использованием Windows API. Операционная система Windows имеет собственные средства работы с файлами, которые становятся доступны программе Delphi после ссылки на модуль Windows. Для тех, кто переходит на Delphi не с прежних версий Turbo Pascal, а с других языков программирования или начинает освоение разработки Windows-приложений с нуля, такой подход является более приемлемым. Тем более что возможности ввода/вывода в Windows API-функциях расширены. Каждый файл в этом наборе функций описывается не переменной, а дескриптором (Handle) - 32-разрядной величиной, которая идентифицирует файл в операционной системе.
Использование потоков. Потоки - очень удачное средство для унификации ввода/вывода на различные носители. В Delphi используется абстрактный класс TStream (поток данных), который является основой для работы с файлами как с объектами. Потоки представляют собой специальные объекты-потомки абстрактного класса Tstream. Наиболее часто используются потоки для работы с памятью и файлами на диске. Класс же TStream порожден непосредственно от класса TObject. Сам TStream "умеет" открываться, читать, писать, изменять текущее положение и закрываться. Поскольку для разных носителей эти вещи происходят по-разному, конкретные аспекты реализованы в его потомках. В специализированных потомках TStream определены стандартные методы Read, write и seek, открывающие полный доступ к файловому объекту. В случае объектов совершенно не важно, что именно является носителем информации - дисковый ли файл, ленточный носитель или оперативная память. Сам объект создается конструктором и уничтожается деструктором.
Многие классы VCL имеют унифицированные методы LoadFromStream и SaveToStream, которые обеспечивают обмен данными с потоками. От того, с каким физическим носителем работает поток, зависит место хранения данных. Следует учесть, что поток не, учитывает специфику хранящихся в файле данных, т. е. по существу работает с данными, как если бы они хранились в не типизированном файле.
Отображение файлов в память. В Windows 32 существует механизм обмена данными между несколькими приложениями - это файлы, проецируемые (отображаемые) в память (memory mappedfiles). Идея этого механизма довольно проста. Приложение, которое хочет обменяться данными с другим приложением, резервирует специальный регион памяти, называемый файлом, а другое приложение "открывает" этот файл и считывает из него необходимые данные (на самом деле такой механизм является частным случаем обмена содержимым реальных файлов между двумя и более приложениями).
Соответствующие функции API доступны любой программе и могут применяться к любому файлу (кстати, таким способом загружается в адресное пространство процесса исполняемый файл). В результате отображения программа может работать с файловыми данными как с данными, размещенными в динамической памяти. Такая возможность не только в большинстве случаев повышает скорость работы с данными, но и предоставляет программисту уникальные средства обработки сразу всех записей файла. Например, он может единственным оператором проверить входит ли заданный образец поиска в любую строку текстового файла. Механизм файлов, проецируемых в память, - удобный и безопасный способ обмена данными между несколькими процессами. Ядро Win32 предоставляет возможность обмена данными практически неограниченного объема, что позволяет создавать элегантные программные решения
