В Delphi используется абстрактный класс TStream (поток данных), который является основой для работы с файлами как с объектами. В случае объектов совершенно не важно, что именно является носителем информации - дисковый ли файл, ленточный носитель или оперативная память. В специализированных потомках TStream определены стандартные методы Read, write и seek, открывающие полный доступ к файловому объекту. Сам объект создается конструктором и уничтожается деструктором.
Примечание
Поток не, учитывает специфику хранящихся в файле данных, т. е. по существу работает с данными, как если бы хранились в не типизированном файле.
В следующем примере файл с именем, хранящимся в Editl.Text, копируется В файл Edit2 . Text.
procedure TFormI.CopyFileClick(Sender:TObject) ; var Streami, Stream2: TStream; begin Streami:=TFileStream.Create(Editi.Text, fmOpenRead or fmShareDenyWrite) ; try Stream2 :=TFileStream.Create(Edit2.Text, fmOpenCreate or fmShareDenyRead); try Stream2.CopyFrom(Streami, Streami.Size); finally Stream2.Free; finally Stream1.Free end;
Абстрактный класс т Stream лишь декларирует ключевые методы Read и write, которые перекрываются в его наследниках для специализации операций:
TFileStream - обмен данными с файлом;
TStringStream - обмен данными с длинной строкой (в памяти);
TMemoryStream - обмен данными с памятью;
TBLOBStream - чтение/запись полей данных типаBLOB (Binary Large Object - большой двоичный объект;
TWinsocketStream - обмен данными с сокетным подключением;
TOLEStream - обмен данными в формате OLE.
Любой наследник получает в свое распоряжение метод copyFrom, с помощью которого он может прочитать содержимое другого потока. Таким способом можно, например, файловые данные расположить в памяти или наоборот - содержимое памяти записать в дисковый файл.
Точно так же от TStream наследуются множество других полезных методов, в том числе:
Seek - пропускает нужное количество байт от текущей позиции потока;
ReadBuffer - читает из буфера в поток нужное количество байт;
Readcomponent - читает свойства компонента из потока;
WriteBuffer - записывает в поток содержимое буфера заданной длины;
WriteComponent - записывает в поток свойства компонента.
Следующий обработчик bbRunciick выведет в редактор mmOutput свойства кнопки bbRun:
procedure TfmExample.bbRunClick(Sender: TObject);
var MemSourceStream, MemDestStream: TMemoryStream; begin MemSourceStream := TMemoryStream.Create; try MemDestStream := TMemoryStream.Create; try MemSourceStream.WriteComponent(bbRun); MemSourceStream.Seek(0, soFromBeginning) ; ObjectBinaryToText(MemSourceStream, MemDestStream); MemDestStream.Seek(0, soFromBeginning) ; mmOutput.Lines.LoadFromStream(MemDestStream) finally MemDestStream.Free end; finally MemSourceStream.Free end; end;
Комментарий к программе
Вначале свойства компонента записываются в поток MеmSourceStream. Чтобы полученным таким образом двоичным данным придать "читабельный" вид, используется процедура ObjectBinaryToText, которая преобразует данные из MemSourceStream и помещает иx в MemDestStream. Содержимое этого второго потока и выводится
В окне mmOutput. Вид окна работающей программы представлен на рис. 11.2.
Рис. 11.2. Свойства компонента bbRun
8 8 8
| |