streamWord格式.docx
- 文档编号:21722275
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:11
- 大小:23.41KB
streamWord格式.docx
《streamWord格式.docx》由会员分享,可在线阅读,更多相关《streamWord格式.docx(11页珍藏版)》请在冰豆网上搜索。
3.CopyFrom方法
functionCopyFrom(Source:
TStream;
Count:
Longint):
CopyFrom从Source所指定的流中拷贝Count个字节到当前流中,并将指针从当前位置移动Count个字节数,函数返回值是实际拷贝的字节数。
4.Read方法
functionRead(varBuffer;
virtual;
abstract;
Read方法从当前流中的当前位置起将Count个字节的内容复制到Buffer中,并把当前指针向后移动Count个字节数,函数返回值是实际读的字节数。
如果返回值小于Count,这意味着读操作在读满所需字节数前指针已经到达了流的尾部。
Read方法是抽象方法。
每个后继Stream对象都要根据自己特有的有关特定存储媒介的读操作覆盖该方法。
而且流的所有其它的读数据的方法(如:
ReadBuffer,ReadComponent等)在完成实际的读操作时都调用了Read方法。
面向对象的动态联编的优点就体现在这儿。
因为后继Stream对
象只需覆盖Read方法,而其它读操作(如ReadBuffer、ReadComponent等)都不需要重新定义,而且TStream还提供了统一的接口。
5.ReadBuffer方法
procedureReadBuffer(varBuffer;
Longint);
ReadBuffer方法从流中将Count个字节复制到Buffer中,并将流的当前指针向后移动Count个字节。
如读操作超过流的尾部,ReadBuffer方法引起EReadError异常事件。
6.ReadComponent方法
声明:
functionReadComponent(Instance:
TComponent):
TComponent;
ReadComponent方法从当前流中读取由Instance所指定的部件,函数返回所读的部件。
ReadComponent在读Instance及其拥有的所有对象时创建了一个Reader对象并调用它的ReadRootComponent方法。
如果Instance为nil,ReadComponent的方法基于流中描述的部件类型信息创建部件,并返回新创建的部件。
7.ReadComponentRes方法
functionReadComponentRes(Instance:
ReadComponentRes方法从流中读取Instance指定的部件,但是流的当前位置必须是由WriteComponentRes方法所写入的部件的位置。
ReadComponentRes
首先调用ReadResHeader方法从流中读取资源头,然后调用ReadComponent方法读取Instance。
如果流的当前位置不包含一个资源头。
ReadResHeader将引发一个EInvalidImage异常事件。
在Classes库单元中也包含一个名为ReadComponentRes的函数,该函数执行相同的操作,只不过它基于应
用程序包含的资源建立自己的流。
8.ReadResHeader方法
procedureReadResHeader;
ReadResHeader方法从流的当前位置读取Windows资源文件头,并将流的当前位置指针移到该文件头的尾部。
如果流不包含一个有效的资源文件头,ReadResHeader将引发一个EInvalidImage异常事件。
流的ReadComponentRes方法在从资源文件中读取部件之前,会自动调用ReadResHeader方法,因此,通常程序员通常不需要自己调用它。
9.Seek方法
functionSeek(Offset:
Origin:
Word):
Seek方法将流的当前指针移动Offset个字节,字节移动的起点由Origin指定。
如果Offset是负数,Seek方法将从所描述的起点往流的头部移动。
下表中列出了Origin的不同取值和它们的含义:
函数Seek的参数的取值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
常量 值 Seek的起点Offset的取值
─────────────────────────────────
SoFromBeginning0 流的开头正数
SoFromCurrent1流的当前位置正数或负数
SoFromEnd2流的结尾负数
10.Write方法
在Delphi对象式管理的对象中有两类对象的方法都有称为Write的:
Stream对象和Filer对象。
Stream对象的Write方法将数据写进流中。
Filer对象通过相关的流传递数据,在后文中会介绍这类方法。
Stream对象的Write方法声明如下:
functionWrite(constBuffer;
Write方法将Buffer中的Count个字节写入流中,并将当前位置指针向流的尾部移动Count个字节,函数返回写入的字节数。
TStream的Write方法是抽象的,每个继承的Stream对象都要通过覆盖该方法来提供向特定存储媒介(内存、磁盘文件等)写数据的特定方法。
流的其它所有写数据的方法(如WriteBuffer、WriteComponent)都调用Write担当实际的写操作。
11.WriteBuffer方法
procedureWriteBuffer(constBuffer;
WriteBuffer的功能与Write相似。
WriteBuffer方法调用Write来执行实际的写操作,如果流没能写所有字节,WriteBuffer会触发一个EWriteError异常事件。
12.WriteComponent方法
在Stream对象和Filer对象都有被称为WriteComponent的方法。
Stream对象的WriteComponent方法将Instance所指定的部件和它所包含的所有部件都写入流中;
Writer对象的WriteComponent将指定部件的属性值写入Writer对象的流中。
Stream对象的WriteComponent方法声明是这样的:
procedureWriteComponent(Instance:
Tcomponent);
WriteComponent创建一个Writer对象,并调用Writer的WriteRootComponent方法将Instance及其拥有的对象写入流。
13.WriteComponentRes方法
WriteComponentRes(constResName:
String;
Instance:
TComponent);
WriteComponentRes方法首先往流中写入标准Windows资源文件头,然后将Instance指定的部件写入流中。
要读由WriteComponentRes写入的部件,必须调用ReadComponentRes方法。
WriteComponentRes使用ResName传入的字符串作为资源文件头的资源名,然后调用WriteComponent方法将Instance和它拥有的部件写入流。
14.WriteDescendant方法
procedureWriteDescendant(InstanceAncestor:
Stream对象的WriteDescendant方法创建一个Writer对象,然后调入该对象的WriteDescendant方法将Instance部件写入流中。
Instance可以是从Ancestor部件继承的窗体,也可以是在从祖先窗体中继承的窗体中相应于祖先窗体中Ancestor部件的部件。
15.WriteDescendantRes方法
procedureWriteDescendantRes(constResName:
Instance,Ancestor:
WriteDescendantRes方法将Windows资源文件头写入流,并使用ResName作用资源名,然后调用WriteDescendant方法,将Instance写入流。
TStream的实现原理
TStream对象是Stream对象的基础类,这是Stream对象的基础。
为了能在不同媒介上的存储数据对象,后继的Stream对象主要是在Read和Write方法上做了改进,。
因此,了解TStream是掌握Stream对象管理的核心。
Borland公司虽然提供了Stream对象的接口说明文档,但对于其实现和应
用方法却没有提及,笔者是从BorlandDelphi2.0Client/ServerSuite提供的源代码和部分例子程序中掌握了流式对象技术。
下面就从TStream的属性和方法的实现开始。
1.TStream属性的实现
前面介绍过,TStream具有Position和Size两个属性,作为抽象数据类型,它抽象了在各种存储媒介中读写数据所需要经常访问的域。
那么它们是怎样实现的呢?
在自定义部件编写这一章中介绍过部件属性定义中的读写控制。
Position和Size也作了读写控制。
定义如下:
LongintreadGetPositionwriteSetPosition;
LongintreadGetSize;
由上可知,Position是可读写属性,而Size是只读的。
Position属性的实现就体现在GetPosition和SetPosition。
当在程序运行过程中,任何读取Position的值和给Position赋值的操作都会自动触发私有方法GetPosition和SetPosition。
两个方法的声明如下:
functionTStream.GetPosition:
begin
Result:
=Seek(0,1);
end;
procedureTStream.SetPosition(Pos:
Seek(Pos,0);
在设置位置时,Delphi编译机制会自动将Position传为Pos。
前面介绍过Seek的使用方法,第一参数是移动偏移量,第二个参数是移动的起点,返回值是移动后的指针位置。
Size属性的实现只有读控制,完全屏蔽了写操作。
读控制方法GetSize实现如下:
functionTStream.GetSize:
var
Pos:
Pos:
=Seek(0,2);
2.TStream方法的实现
⑴CopyFrom方法
CopyFrom是Stream对象中很有用的方法,它用于在不同存储媒介中拷贝数据。
例如,内存与外部文件之间、内存与数据库字段之间等。
它简化了许多内存分配、文件打开和读写等的细节,将所有拷贝操作都统一到Stream对象上。
前面曾介绍:
CopyFrom方法带Source和Count两个参数并返回长整型。
该方法将Count个字节的内容从Source拷贝到当前流中,如果Count值为0则拷贝所有数据。
functionTStream.CopyFrom(Source:
const
MaxBufSize=$F000;
BufSize,N:
Integer;
Buffer:
PChar;
ifCount=0then
Source.Position:
=0;
Count:
=Source.Size;
=Count;
ifCount>
MaxBufSizethenBufSize:
=MaxBufSizeelseBufSize:
GetMem(Buffer,BufSize);
try
whileCount<
>
0do
BufSizethen
N:
=BufSize
else
Source.ReadBuffer(Buffer^,N);
WriteBuffer(Buffer^,N);
Dec(Count,N);
finally
FreeMem(Buffer,BufSize);
⑵ReadBuffer方法和WriteBuffer方法
ReadBuffer方法和WriteBuffer方法简单地调用虚拟函数Read、Write来读写流中数据,它比Read和Write增加了读写数据出错时的异常处理。
procedureTStream.ReadBuffer(varBuffer;
if(Count<
0)and(Read(Buffer,Count)<
Count)then
raiseEReadError.CreateRes(SReadError);
procedureTStream.WriteBuffer(constBuffer;
0)and(Write(Buffer,Count)<
raiseEWriteError.CreateRes(SWriteError);
⑶ReadComponent、ReadResHeader和ReadComponentRes方法
ReadComponent方法从当前流中读取部件。
在实现上ReadComponent方法创建了一个TStream对象,并用TReader的ReadRootComponent方法读部件。
在Delphi对象式管理中,Stream对象和Filer对象结合很紧密。
Stream对象的许多方法的实现需要Filer对象的支持,而Filer对象的构造函数
直接就以Stream对象为参数。
在ReadComponent方法的实现中就可清楚地看到这一点:
functionTStream.ReadComponent(Instance:
Reader:
TReader;
Reader:
=TReader.Create(Self,4096);
=Reader.ReadRootComponent(Instance);
Reader.Free;
ReadResHeader方法用于读取Windows资源文件的文件头,由ReadComponentRes方法在读取Windows资源文件中的部件时调用,通常程序员不需自己调用。
如果读取的不是资源文件ReadResH:
=FSize+Offset;
=FPosition;
Offse代表移动的偏移量。
Origin代表移动的起点,值为0表示从文件头开始,值为1表示从当前位置开始,值为2表示从文件尾往前,这时OffSet一般为负数。
Seek的实现没有越界的判断。
3.SaveToStream和SaveToFile方法
SaveToStream方法是将MemoryStream对象中的内容写入Stream所指定的流。
其实现如下:
procedureTCustomMemoryStream.SaveToStream(Stream:
TStream);
ifFSize<
0thenStream.WriteBuffer(FMemory^,FSize);
SaveToStream方法调用了Stream的WriteBuffer方法,直接将FMemory中的内容按FSize字节长度写入流中。
SaveToFile方法是与SaveToStream方法相关的。
SaveToFile方法首先创建了一个FileStream对象,然后把该文件Stream对象作为SaveToStream的参数,由SaveToStream方法执行写操作,其实现如下:
procedureTCustomMemoryStream.SaveToFile(constFileName:
string);
Stream:
Stream:
=TFileStream.Create(FileName,fmCreate);
SaveToStream(Stream);
Stream.Free;
在Delphi的许多对象的SaveToStream和SaveToFile、LoadFromStream和LoadFromFile方法的实现都有类似的嵌套结构。
TMemoryStream对象
TMemoryStream对象是一个管理动态内存中的数据的Stream对象,它是从TCustomMemoryStream中继承下来的,除了从TCustomMemoryStream中继承的属性和方法外,它还增加和覆盖了一些用于从磁盘文件和其它注台读数据的方法。
它还提供了写入、消除内存内容的动态内存管理方法。
下面
介绍它的这些属性和方法。
TMemoryStream的属性和方法
1.Capacity属性
propertyCopacity:
Capacity属性决定了分配给内存流的内存池的大小。
这与Size属性有些不同。
Size属性是描述流中数据的大小。
在程序中可以将Capacity的值设置的比数据所需最大内存大一些,这样可以避免频繁地重新分配。
2.Realloc方法
functionRealloc(varNewCapacity:
Pointer;
Realloc方法,以8K为单位分配动态内存,内存的大小由NewCapacity指定,函数返回指向所分配内存的指针。
3.SetSize方法
SetSize方法消除内存流中包含的数据,并将内存流中内存池的大小设为Size字节。
如果Size为零,是SetSize方法将释放已有的内存池,并将Memory属性置为nil;
否则,SetSize方法将内存池大小调整为Size。
4.Clear方法
procedureClear;
Clear方法释放内存中的内存池,并将Memory属性置为nil。
在调用Clear方法后,Size和Position属性都为0。
5.LoadFromStream方法
procedureLoadFromStream(Stream:
LoadFromStream方法将Stream指定的流中的全部内容复制到MemoryStream中,复制过程将取代已有内容,使MemoryStream成为Stream的一份拷贝。
6.LoadFromFile方法
procedureLoadFromFile(countFileName:
String);
LoadFromFile方法将FileName指定文件的所有内容复制到MemoryStream中,并取代已有内容。
调用LoadFromFile方法后,MemoryStream将成为文件内容在内存中的完整拷贝。
TMemoryStream对象的实现原理
TMemoryStream从TCustomMemoryStream对象直接继承,因此可以享用TCustomMemoryStream的属性和方法。
前面讲过,TCustomMemoryStream是用于内存中数据操作的抽象对象,它为MemoryStream对象的实现提供了框架,框架中的内容还要由具体MemoryStream对象去填充。
TMemoryStrea
m对象就是按动态内存管理的需要填充框架中的具
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stream