Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП / ООП_Лекции.doc
Скачиваний:
50
Добавлен:
08.06.2015
Размер:
1.03 Mб
Скачать

Файловые потоки

Как мы уже упоминали ранее, VCL определяет два класса потоков, которые можно исполь­зовать для управления файлами — TFileStream и THandleStream. Если известно имя файла, которым нужно управлять, но не известен дескриптор файла (дескриптор файла Windows), можно использовать TFileStream. Например, если запросить пользователя ввести имя файла, используя одно из общих диалоговых окон, имя файла вводится пользователем. С другой стороны, если необходимо открывать и закрывать файл функциями API Windows, для манипу­ляций с файлом используется THandleStream.

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

constructor TFileStream.Create(const FileName: string; Mode: Word);

constructor THandleStream.Create(AHandle: Integer);

Так как конструктор TFileStream будет пытаться открыть файл, необходимо определить, будет ли содержимое файла использоваться в режиме разделения (share) совместно с другим пользователем. Различные режимы (появляющиеся в интерактивной помощи) связаны со значениями режима OF_XXX функции OpenFile в API Windows.

Примечание

Из различных режимов наиболее важны fmShareDenyWrite, используемый для простого чтения данных из разделяемого файла, и fmShareExclusive, используемый для записи данных в разделяемый файл.

Как можно предположить, создание и использование файлового потока может быть достаточно простым. Действительно, в большинстве случаев можно просто создать поток, а затем вызвать соответствующий компонентный метод, чтобы читать или записывать данные потока. Например, методы LoadFromStream или SaveToStream определены в следующих классах: TBlobField, TGraphicField, TMemoField, TOutline, TStrings, TStringList, TMetafile, TIcon и TBitmap.

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

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

Методы потоков в действии: программаMemoStr

Чтобы увидеть некоторые из методов, упомянутых в последнем абзаце, в действии, давайте рассмотрим программу MemoStr.

В данном примере мы использовали объект TFileStream для следующих задач:

• загрузки данных в компонент Memo из файла;

• сохранения данных из компонента Memo в файл;

• копирования в файл.

Для обработки каждой задачи предоставляются компонент Button и соответствующий обработчик события (event handler).

procedure TForml.ButtonSaveMemoClick(Sender: TObject);

var

MyStream: TFileStream;

begin

if SaveDialogl.Execute then begin

if FileExists(SaveDialogl.FileName) then

MyStream:= TFileStream.Create(

SaveDialogl.FileName, fmOpenWrite)

else

MyStream:= TFileStream.Create(SaveDialogl.FileName, fmOpenWrite or fmCreate);

try

Memol.Lines.SaveToStreas(MyStream);

finally

MyStream.Free;

end;

end;

end;

procedure TForml.ButtonLoadMemoClick(Sender: TObject);

var

MyStream: TFileStream;

begin

if OpenDialogl.Execute then begin

MyStream:= TFileStream.Create(OpenDialogl.FileName, fmOpenRead);

try

Memol.Lines.LoadFromStream(MyStream);

finally

MyStream.Free;

end;

end;

end;

procedure TForml.ButtonCopyFileClick(Sender: TObject);

var

Streaml, Stream2: TFileStream;

begin

if OpenDialogl.Execute and SaveDialogl.Execute then begin

Streaml := TFileStream.Create(OpenDialogl.FileName, fmOpenRead);

try

Stream2 := TFileStream.Create(SaveDialogl.FileName, fmOpenWrite or fmCreate);

try

Stream2.CopyFrom(Streaml, Streaml.Size);

finally

Stream2.Free;

end;

finally

Streaml.Free;

end;

end;

end;

Теперь, после знакомства с некоторыми базисными примерами использования объектов файловых потоков, можно перейти к примеру использования объекта потока памяти, а затем заняться более сложными темами.

Соседние файлы в папке ООП