流操作的语法(2)

2008-04-10 02:57:55来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

─────────────────────────────────

 SoFromBeginning 0  流的开头 正 数

 SoFromCurrent 1 流的当前位置 正数或负数

 SoFromEnd 2 流的结尾 负 数

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

  10. Write方法

  在Delphi对象式管理的对象中有两类对象的方法都有称为Write的:Stream对象和Filer对象。Stream对象的Write方法将数据写进流中。Filer对象通过相关的流传递数据,在后文中会介绍这类方法。

  Stream对象的Write方法声明如下:

 

function Write(const Buffer; Count: Longint): Longint; virtual; abstract;

 

Write方法将Buffer中的Count个字节写入流中,并将当前位置指针向流的尾部移动Count个字节,函数返回写入的字节数。

  TStream的Write方法是抽象的,每个继承的Stream对象都要通过覆盖该方法来提供向特定存储媒介(内存、磁盘文件等)写数据的特定方法。流的其它所有写数据的方法(如WriteBuffer、WriteComponent)都调用Write担当实际的写操作。

  11. WriteBuffer方法

  声明:procedure WriteBuffer(const Buffer; Count: Longint);

  WriteBuffer的功能与Write相似。WriteBuffer方法调用Write来执行实际的写操作,如果流没能写所有字节,WriteBuffer会触发一个EWriteError异常事件。

  12. WriteComponent方法

  在Stream对象和Filer对象都有被称为WriteComponent的方法。Stream对象的WriteComponent方法将Instance所指定的部件和它所包含的所有部件都写入流中;Writer对象的WriteComponent将指定部件的属性值写入Writer对象的流中。

  Stream对象的WriteComponent方法声明是这样的:

procedure WriteComponent(Instance: Tcomponent);

 

  WriteComponent创建一个Writer对象,并调用Writer的WriteRootComponent方法将Instance及其拥有的对象写入流。

  13. WriteComponentRes方法

  声明:WriteComponentRes(const ResName: String; Instance: TComponent);

  WriteComponentRes方法首先往流中写入标准Windows 资源文件头,然后将Instance指定的部件写入流中。要读由WriteComponentRes写入的部件,必须调用ReadComponentRes方法。

  WriteComponentRes使用ResName传入的字符串作为资源文件头的资源名,然后调用WriteComponent方法将Instance和它拥有的部件写入流。

  14. WriteDescendant方法

  声明:procedure WriteDescendant(Instance Ancestor: TComponent);

  Stream对象的WriteDescendant方法创建一个Writer对象,然后调入该对象的WriteDescendant方法将Instance部件写入流中。Instance可以是从Ancestor部件继承的窗体,也可以是在从祖先窗体中继承的窗体中相应于祖先窗体中Ancestor部件的部件。

  15. WriteDescendantRes方法

  声明:procedure WriteDescendantRes(const ResName: String;

Instance, Ancestor: TComponent);

  WriteDescendantRes方法将Windows资源文件头写入流,并使用ResName作用资源名,然后调用WriteDescendant方法,将Instance写入流。

 

20.1.1.2 TStream的实现原理

 

  TStream对象是Stream对象的基础类,这是Stream对象的基础。为了能在不同媒介上的存储数据对象,后继的Stream对象主要是在Read和Write方法上做了改进,。因此,了解TStream是掌握Stream对象管理的核心。Borland公司虽然提供了Stream对象的接口说明文档,但对于其实现和应用方法却没有提及,笔者是从Borland Delphi 2.0 Client/Server Suite 提供的源代码和部分例子程序中掌握了流式对象技术。

  下面就从TStream的属性和方法的实现开始。

  1. TStream属性的实现

  前面介绍过,TStream具有Position和Size两个属性,作为抽象数据类型,它抽象了在各种存储媒介中读写数据所需要经常访问的域。那么它们是怎样实现的呢?

  在自定义部件编写这一章中介绍过部件属性定义中的读写控制。Position和Size也作了读写控制。定义如下:

 

property Position: Longint read GetPosition write SetPosition;

property Size: Longint read GetSize;

 

  由上可知,Position是可读写属性,而Size是只读的。

  Position属性的实现就体现在GetPosition和SetPosition。当在程序运行过程中,任何读取Position的值和给Position赋值的操作都会自动触发私有方法GetPosition和SetPosition。两个方法的声明如下:

 

function TStream.GetPosition: Longint;

begin

Result := Seek(0, 1);

end;

 

procedure TStream.SetPosition(Pos: Longint);

begin

Seek(Pos, 0);

end;

 

在设置位置时,Delphi编译机制会自动将Position传为Pos。

  前面介绍过Seek的使用方法,第一参数是移动偏移量,第二个参数是移动的起点,返回值是移动后的指针位置。

  Size属性的实现只有读控制,完全屏蔽了写操作。读控制方法GetSize实现如下:

 

function TStream.GetSize: Longint;

var

Pos: Longint;

begin

Pos := Seek(0, 1);

Result := Seek(0, 2);

Seek(Pos, 0);

end;

 

2. TStream方法的实现

  ⑴ CopyFrom方法

  CopyFrom是Stream对象中很有用的方法,它用于在不同存储媒介中拷贝数据。例如,内存与外部文件之间、内存与数据库字段之间等。它简化了许多内存分配、文件打开和读写等的细节,将所有拷贝操作都统一到Stream对象上。

  前面曾介绍:CopyFrom方法带Source和Count两个参数并返回长整型。该方法将Count个字节的内容从Source拷贝到当前流中,如果Count值为0则拷贝所有数据。

 

function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;

const

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:算术编码算法

下一篇:Web Services 平台