Класс TStream не нов для библиотек фирмы Borland; он и его потомки называются потоками. Со времен появления в библиотеке Turbo Vision он не претерпел существенных изменений, но теперь потоки стали обязательными составными частями там, где нужно прочитать или передать во внешний источник какую-либо информацию.
TStream "является абстрактной моделью совокупности данных, обладающей двумя свойствами — длиной Size и положением текущего элемента Position:
property Position: Longint;
property Size: Longint;
От TStream порождены дочерние объекты, позволяющие пользоваться метафорой потока при работе с файлами, блоками памяти и т. п. Так, в модуле CLASSES описаны классы TMemoryStream и TFileStream.
Данные потока можно читать или записывать, используя предоставляемый буфер, или копировать из другого потока. Эта возможность реализована методами:
function Read(var Buffer; Count: Longint): Longint;virtual; abstract;
function Writetconst Buffer; Count: Longint): Longint;virtual; abstract;
Метод
function Seek(0ffset: Longint; Origin: Word): Longint;virtual; abstract;
позиционирует поток. В зависимости от значения параметра Origin новая позиция выбирается так:
О — новая позиция равна Offset;
1 —текущая позиция смещается на Offset байт;
2 — новая позиция находится на Offset байт от конца потока.
Методы
procedure ReadBuffer(var Buffer; Count: Longint);
procedure WriteBuffer(const Buffer; Count: Longint);
представляют собой оболочки над Read/Write, вызывающие в случае неудачи операции исключительные ситуации EReadError/EWriteError.
Метод
function CopyFromfSource: TStream; Count: Longint): Longint;
дописывает к потоку Count байт из потока Source, начиная с его текущей позиции. Если значение Count равно нулю, то дописывается весь поток Source с его начала.
Основным отличием реализации TStream в VCL является введение ряда методов, обеспечивающих чтение и запись компонентов в потоки. Они полезны на уровне разработчика новых компонентов и здесь подробно не рассматриваются:
function ReadComponent(Instance: TComponent): TComponent;
function ReadComponentRes(Instance: TComponent): TComponent;
procedure WriteComponent(Instance: TComponent);
procedure WriteComponentRes (const ResName: string;Instance: TComponent);
procedure ReadResHeader;
Code: |
{These are three utility functions to write strings to a TStream. Nothing fancy, but I just ended up coding this repeatedly so I made these functions. } В unit ClassUtils; В interface В uses SysUtils, Classes; В {: Write a string to the stream @param Stream is the TStream to write to. @param s is the string to write @returns the number of bytes written. } function Writestring(_Stream: TStream; const _s: string): Integer; В {: Write a string to the stream appending CRLF @param Stream is the TStream to write to. @param s is the string to write @returns the number of bytes written. } function WritestringLn(_Stream: TStream; const _s: string): Integer; В {: Write formatted data to the stream appending CRLF @param Stream is the TStream to write to. @param Format is a format string as used in sysutils.format @param Args is an array of const as used in sysutils.format @returns the number of bytes written. } function WriteFmtLn(_Stream: TStream; const _Format: string; _Args: array of const): Integer; В implementation В function Writestring(_Stream: TStream; const _s: string): Integer; begin Result := _Stream.Write(PChar(_s)^, Length(_s)); end; В function WritestringLn(_Stream: TStream; const _s: string): Integer; begin Result := Writestring(_Stream, _s); Result := Result + Writestring(_Stream, #13#10); end; В function WriteFmtLn(_Stream: TStream; const _Format: string; _Args: array of const): Integer; begin Result := WritestringLn(_Stream, Format(_Format, _Args)); end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!