收藏 分享(赏)

Delphi TStream 详细介绍.txt

上传人:eukav 文档编号:6213125 上传时间:2019-04-02 格式:TXT 页数:9 大小:19.41KB
下载 相关 举报
Delphi TStream 详细介绍.txt_第1页
第1页 / 共9页
Delphi TStream 详细介绍.txt_第2页
第2页 / 共9页
Delphi TStream 详细介绍.txt_第3页
第3页 / 共9页
Delphi TStream 详细介绍.txt_第4页
第4页 / 共9页
Delphi TStream 详细介绍.txt_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、Delphi TStream 详细介绍Stream对象,又称流式对象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的统称。它们分别代表了在各种媒介上存储数据的能力,它们将各种数据类型(包括对象和部件) 在内存、外存和数据库字段中的管理操作抽象为对象方法,并且充分利用了面向对象技术的优点,应用程序可以相当容易地在各种Stream对象中拷贝数据。 下面介绍各种对象的数据和方法及使用方法。 TStream对象TStream对象是能在各种媒介中存储二进制数据的对象的抽象对象。从TStream

2、对象继承的对象用于在内存、Windows资源文件、磁盘文件和数据库字段等媒介中存储数据。 Stream中定义了两个属性:Size和Position。它们分别以字节为单位表示的流的大小和当前指针位置。TStream中定义的方法用于在各种流中读、写和相互拷贝二进制数据。因为所有的Stream对象都是从TStream中继承来的,所以在TStream中定义的域和方法都能被Stream对象调用和访 问。 外,又 于面向对象技术的 能,TStream为各种流的应用 了统 的 , 了流的使用 Stream对象是抽象了对 存储媒介的数据上的操作,因 ,TStream的 方法为在 媒介的数据拷贝 了 的 段。T

3、Stream的属性和方法1. Position属性 :property Position: Longint; Position属性指 流中读写的当前 。 2. Size属性 :property Size: Longint; Size属性指 了以字节为单位的流的的大小,它是 读的。 3. CopyFrom方法 :function CopyFrom(Source: TStream; Count: Longint): Longint; CopyFrom从Source所指定的流中拷贝Count个字节 当前流中, 并将指针从当前位置 Count个字节数, 数 是拷贝的字节数。 4. Read方法 :fu

4、nction Read(var Buffer; Count: Longint): Longint; virtual; abstract; Read方法从当前流中的当前位置将Count个字节的内容制 Buffer中,并当前指针向 Count个字节数, 数 是读的字节数。currency1 小于Count,“读操作在读所 字节数前指针fifl 了流的部。 Read方法是抽象方法。个继Stream对象都据 有的有定存储媒介的读操作”方法。且流的所有它的读数据的方法 :ReadBuffer,ReadComponent等在 的读操作都调用了Read方法。面向对象的 的优点在。因为继Stream对 象 ”

5、Read方法,它读操作(ReadBuffer、ReadComponent等)都 定义,且TStream 了统 的 。 5. ReadBuffer方法 :procedure ReadBuffer(var Buffer; Count: Longint); ReadBuffer方法从流中将Count个字节制 Buffer 中, 并将流的当前指针向 Count个字节。读操作流的部,ReadBuffer方法 EReadError件。 6. ReadComponent方法 :function ReadComponent(Instance: TComponent): TComponent; ReadComp

6、onent方法从当前流中读 Instance所指定的部件, 数 所读的部件。ReadComponent在读Instance及 有的所有对象 了 个Reader对象并调用它的ReadRootComponent方法。 currency1Instance为nil,ReadComponent的方法 于流中 的部件类型 部件,并 的部件。 7. ReadComponentRes方法 :function ReadComponentRes(Instance: TComponent): TComponent; ReadComponentRes方法从流中读Instance指定的部件, 是流的当前位置 是 Wri

7、teComponentRes方法所写 的部件的位置。 ReadComponentRes 调用ReadResHeader方法从流中读资源 , 调用ReadComponent方法读Instance。currency1流的当前位置 包 个资源 。ReadResHeader将 个EInvalidImage件。在Classes库单中 包 个 为ReadComponentRes的 数, 数 相 的操作, 它 于应 用程序包的资源 的流。 8. ReadResHeader方法 :procedure ReadResHeader; ReadResHeader方法从流的当前位置读Windows资源文件 ,并将流的

8、当前位置指针 文件 的部。currency1流 包 个有的资源文件 ,ReadResHeader将 个EInvalidImage件。 流的ReadComponentRes方法在从资源文件中读部件前, 调用ReadResHeader方法,因, 程序 调用它。 9. Seek方法 :function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract; Seek方法将流的当前指针 Offset个字节,字节 的点 Origin指定。currency1Offset是 数,Seek方法将从所 的点 流的 部 。下表中 了Orig

9、in的 和它们的义:数Seek的 数的 Seek的点 Offset的 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; abst

10、ract; Write方法将Buffer中的Count个字节写 流中,并将当前位置指针向流的部 Count个字节, 数写 的字节数。 TStream的Write方法是抽象的,个继承的Stream对象都 ”方法来 向定存储媒介(内存、磁盘文件等)写数据的定方法。流的它所有写数据的方法(WriteBuffer、WriteComponent)都调用Write当的写操作。 11. WriteBuffer方法 :procedure WriteBuffer(const Buffer; Count: Longint); WriteBuffer的 能 Write相 。WriteBuffer方法调用Write来

11、 的写操作,currency1流 能写所有字节,WriteBuffer 个EWriteError件。 12. WriteComponent方法 在Stream对象和Filer对象都有被称为WriteComponent的方法。Stream对象的WriteComponent方法将Instance所指定的部件和它所包的所有部件都写 流中 Writer对象的WriteComponent将指定部件的属性 写 Writer对象的流中。 Stream对象的WriteComponent方法 是样的: procedure WriteComponent(Instance: Tcomponent); WriteCo

12、mponent 个Writer对象,并调用Writer的WriteRootComponent方法将Instance及 有的对象写 流。 13. WriteComponentRes方法 :WriteComponentRes(const ResName: String; Instance: TComponent); WriteComponentRes方法 流中写 标准Windows 资源文件 , 将Instance指定的部件写 流中。读 WriteComponentRes写 的部件, 调用ReadComponentRes方法。 WriteComponentRes使用ResName 的字符串作为资源

13、文件 的资源 , 调用WriteComponent方法将Instance和它 有的部件写 流。 14. WriteDescendant方法 :procedure WriteDescendant(Instance Ancestor: TComponent); Stream对象的WriteDescendant方法 个Writer对象, 调 对象的WriteDescendant方法将Instance部件写 流中。Instance可以是从Ancestor部件继承的窗, 可以是在从祖 窗中继承的窗中相应于祖 窗中Ancestor部件的部件。 15. WriteDescendantRes方法 :proce

14、dure WriteDescendantRes(const ResName: String; Instance, Ancestor: TComponent); WriteDescendantRes方法将Windows资源文件 写 流,并使用ResName作用资源 , 调用WriteDescendant方法,将Instance写 流。TStream的原理TStream对象是Stream对象的 础类,是Stream对象的 础。为了能在 媒介上的存储数据对象,继的Stream对象主是在Read和Write方法上做了改进,。因 ,了解TStream是掌握Stream对象管理的核心。Borland公司虽

15、 了Stream对象的 说 文档, 对于和应 用方法却 有 及,笔者是从Borland Delphi 2.0 Client/Server Suite 的源代码和部分例子程序中掌握了流式对象技术。 下面从TStream的属性和方法的始。 1. TStream属性的 前面介绍,TStream具有Position和Size两个属性,作为抽象数据类型,它抽象了在各种存储媒介中读写数据所 fl访问的域。那么它们是怎样的呢? 在 定义部件 写 章中介绍部件属性定义中的读写控制。Position和Size 作了读写控制。定义下:property Position: Longint read GetPosit

16、ion 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(

17、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是S

18、tream对象中很有用的方法,它用于在 存储媒介中拷贝数据。例,内存 外部文件 、内存 数据库字段 等。它 了许多内存分配、文件打和读写等的细节,将所有拷贝操作都统 Stream对象上。 前面曾介绍:CopyFrom方法带Source和Count两个 数并 长整型。方法将Count个字节的内容从Source拷贝 当前流中,currency1Count 为0则拷贝所有数据。function TStream.CopyFrom(Source: TStream; Count: Longint): Longint; const MaxBufSize = $F000; var BufSize, N: In

19、teger; Buffer: PChar; begin if Count = 0 then begin Source.Position := 0; Count := Source.Size; end; Result := Count; if Count MaxBufSize then BufSize := MaxBufSize else BufSize := Count; GetMem(Buffer, BufSize); try while Count BufSize then N := BufSize else N := Count; Source.ReadBuffer(Buffer, N)

20、; WriteBuffer(Buffer, N); Dec(Count, N); end; finally FreeMem(Buffer, BufSize); end; end; ReadBuffer方法和WriteBuffer方法 ReadBuffer方法和WriteBuffer方法 单地调用虚拟 数Read、Write来读写流中数据,它比Read和Write增加了读写数据错的处理。procedure TStream.ReadBuffer(var Buffer; Count: Longint); begin if (Count Count) then raise EReadError.Cre

21、ateRes(SReadError); end;procedure TStream.WriteBuffer(const Buffer; Count: Longint); begin if (Count Count) then raise EWriteError.CreateRes(SWriteError); end; ReadComponent、ReadResHeader和ReadComponentRes方法 ReadComponent方法从当前流中读部件。在上ReadComponent方法 了 个TStream对象,并用TReader的ReadRootComponent方法读部件。在Delp

22、hi对象式管理中,Stream对象和Filer对象合很紧密。Stream对象的许多方法的 Filer对象的支持,Filer对象的构造 数 直 以Stream对象为 数。在ReadComponent方法的中可清楚地看 点:function TStream.ReadComponent(Instance: TComponent): TComponent; var Reader: TReader; begin Reader := TReader.Create(Self, 4096); try Result := Reader.ReadRootComponent(Instance); finally R

23、eader.Free; end; end;ReadResHeader方法用于读Windows资源文件的文件 , ReadComponentRes方法在读Windows资源文件中的部件调用, 程序 调用。currency1读的 是资源文件ReadResH := FSize + Offset; end; Result := FPosition; end;Offse代表 的 。Origin代表 的点, 为0表示从文件 始, 为1表示从当前位置始, 为2表示从文件 前,OffSet 般为 数。Seek的 有越界的判断。 3. SaveToStream和SaveToFile方法 SaveToStream

24、方法是将MemoryStream对象中的内容写 Stream所指定的流。下:procedure TCustomMemoryStream.SaveToStream(Stream: TStream); begin if FSize nil then FreeMem(FBuffer, FDataSet.RecordSize); if FModified then try FField.DataChanged; except Application.HandleException(Self); end; end;currency1BLOB流中的数据作了修改,将FField的FModified置为Tru

25、e currency1FField的Modified为False释放BLOB字段,currency1FBuffer 为 ,则释放 内存。 据FModified的 来决定是否 FField的件处理程DataChanged。 难看,currency1BLOB字段作了修改 释放BLOB字段,并且对BLOB 字段的修改 有 Destroy,是因为读写BLOB字段都避了FField,直 调用BDE API 数。 点是在应用BDE API 程中很, 定修改相应数据库部件的状 。 2. Read和Write方法的 Read和Write方法都调用BDE API 数 数据库BLOB字段的读写,下: functi

26、on TBlobStream.Read(var Buffer; Count: Longint): Longint; var Status: DBIResult; begin Result := 0; if FOpened then begin Status := DbiGetBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition, Count, Buffer, Result); case Status of DBIERR_NONE, DBIERR_ENDOFBLOB: begin if FField.FTransliterate then Nati

27、veToAnsiBuf(FDataSet.Locale, Buffer, Buffer, Result); Inc(FPosition, Result); end; DBIERR_INVALIDBLOBOFFSET: Nothing; else DbiError(Status); end; end; end;Read方法使用了BDE API的DbiGetBlob 数从FDataSet中读数据,在 数中,各 数的义是样的:FDataSet.Handle代表DataSet的BDE ,FReacord表示BLOB字段所在记录,FFieldNo表示BLOB字段 ,FPosition表示读的的数据的始位

28、置,Count表示读的字节数,Buffer是读数据所 的内存, Result是读的字节数。BDE 数 数调用的错 状 。 Read方法 调用了NativeToAnsiBuf进 字符 的 。function TBlobStream.Write(const Buffer; Count: Longint): Longint; var Temp: Pointer; begin Result := 0; if FOpened then begin if FField.FTransliterate then begin GetMem(Temp, Count); try AnsiToNativeBuf(FD

29、ataSet.Locale, Buffer, Temp, Count); Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition, Count, Temp); finally FreeMem(Temp, Count); end; end else Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition, Count, Buffer); Inc(FPosition, Count); Result := Count; FModified := True; en

30、d; end;Write方法调用了BDE API的DbiPutBlob 数 数据库BLOB字段存储数据。 数的各 数义下:调用 数DbiPutBlob的各 数的义 数 义 FDataSetHandle 写 的数据库的BDE FRecord 写 数据的BLOB字段所在的记录 FFieldNo BLOB字段 FPosition 写 的始位置 Count 写 的数据的字节数 Buffer 所写 的数据 有的内存地 标 ,标 “面存储有 串的 。Reader对象,在读 串 调用ReadListBegin方法读标 位, 用EndOfList判断是否 表 ,并用 读 。在调用WriteListBegin方

31、法的面 调用WriteListEnd方法写 表 标 ,相应的在Reader对象中 有ReadListEnd方法读 标 。 5. WriteListEnd方法 :procedure WriteListEnd; WriteListEnd方法在流中,写 表 标 ,它是 WriteListBegin相 配的方法。 6. WriteBoolean方法 :procedure WriteBoolean(Value: Boolean); WriteBoolean方法将Value 的 写 流中。 7. WriteChar方法 :procedure WriteChar(Value: char); WriteCha

32、r方法将Value中的字符写 流中。 8. WriteFloat方法 :procedure WriteFloat(Value: Extended); WriteFloat方法将Value 的 点数写 流中。 9. WriteInteger方法 :procedure WriteInteger(Value: Longint); WriteInteger方法将Value中的整数写 流中。 10. WriteString方法 :procedure WriteString(const Value: string); WriteString方法将Value中的字符串写 流中。 11. WriteIdent

33、方法 :procedure WriteIdent(const Ident: string); WriteIdent方法将Ident 的标 符写 流中。 12. WriteSignature方法 :procedure WriteSignature; WriteSignature方法将Delphi Filer对象标写 流中。WriteRootComponent方法在将部件写 流前 调用WriteSignature方法写 Filer标。Reader对象在读部件前调用ReadSignature方法读标以指读操作。 13. WritComponent方法 :procedure WriteComponen

34、t(Component: TComponent); WriteComponent方法调用 数Component的WriteState方法将部件写 流中。在调用WriteState前,WriteComponent 将Component的ComponetnState属性置为csWriting。当WriteState 清除csWriting. 14. WriteRootComponent方法 :procedure WriteRootComponent(Root: TComponent); WriteRootComponent方法将Writer对象Root属性设为 数Root带的 , 调用WriteSignature方法 流中写 Filer对象标, 调用WriteComponent方法在流中存储Root部件。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Delphi/Perl

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报