📄 051.htm
字号:
face="Arial">SetPosition</font><font face="宋体" lang="ZH-CN">。两个方法的声明如下:</p><p> </font><font face="Arial"></p><p>function TStream.GetPosition: Longint;</p><p>begin</p><p>Result := Seek(0, 1);</p><p>end;</p><p></font> <font face="Arial"></p><p>procedure TStream.SetPosition(Pos: Longint);</p><p>begin</p><p>Seek(Pos, 0);</p><p>end;</p><p></font> <font face="Arial"></p><p></font><font face="宋体" lang="ZH-CN">在设置位置时,</font><font face="Arial">Delphi</font><fontface="宋体" lang="ZH-CN">编译机制会自动将</font><font face="Arial">Position</font><fontface="宋体" lang="ZH-CN">传为</font><font face="Arial">Pos</font><font face="宋体"lang="ZH-CN">。</p><p> 前面介绍过</font><font face="Arial">Seek</font><font face="宋体"lang="ZH-CN">的使用方法,第一参数是移动偏移量,第二个参数是移动的起点,返回值是移动后的指针位置。</p><p> </font><font face="Arial">Size</font><font face="宋体" lang="ZH-CN">属性的实现只有读控制,完全屏蔽了写操作。读控制方法</font><fontface="Arial">GetSize</font><font face="宋体" lang="ZH-CN">实现如下:</p><p> </font><font face="Arial"></p><p>function TStream.GetSize: Longint;</p><p>var</p><p>Pos: Longint;</p><p>begin</p><p>Pos := Seek(0, 1);</p><p>Result := Seek(0, 2);</p><p>Seek(Pos, 0);</p><p>end;</p><p></font> <font face="Arial"></p><p>2. TStream</font><font face="宋体" lang="ZH-CN">方法的实现</p><p> ⑴</font><font face="Arial"> CopyFrom</font><font face="宋体" lang="ZH-CN">方法</p><p> </font><font face="Arial">CopyFrom</font><font face="宋体" lang="ZH-CN">是</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象中很有用的方法,它用于在不同存储媒介中拷贝数据。例如,内存与外部文件之间、内存与数据库字段之间等。它简化了许多内存分配、文件打开和读写等的细节,将所有拷贝操作都统一到</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象上。</p><p> 前面曾介绍:</font><font face="Arial">CopyFrom</font><font face="宋体"lang="ZH-CN">方法带</font><font face="Arial">Source</font><font face="宋体"lang="ZH-CN">和</font><font face="Arial">Count</font><font face="宋体" lang="ZH-CN">两个参数并返回长整型。该方法将</font><fontface="Arial">Count</font><font face="宋体" lang="ZH-CN">个字节的内容从</font><fontface="Arial">Source</font><font face="宋体" lang="ZH-CN">拷贝到当前流中,如果</font><fontface="Arial">Count</font><font face="宋体" lang="ZH-CN">值为</font><font face="Arial">0</font><fontface="宋体" lang="ZH-CN">则拷贝所有数据。</p><p> </font><font face="Arial"></p><p>function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;</p><p>const</p><p>MaxBufSize = $F000;</p><p>var</p><p>BufSize, N: Integer;</p><p>Buffer: PChar;</p><p>begin</p><p>if Count = 0 then</p><p>begin</p><p>Source.Position := 0;</p><p>CouNG="ZH-CN"></font>资源文件中的部件时调用,通常程序员不需自己调用。如果读取的不是资源文件<fontface="Arial">ReadResHeader</font><font face="宋体" lang="ZH-CN">,将触发异常事件。</p><p> </font><font face="Arial"></p><p>procedure TStream.ReadResHeader;</p><p>var</p><p>ReadCount: Longint;</p><p>Header: array[0..79] of Char;</p><p>begin</p><p>FillChar(Header, SizeOf(Header), 0);</p><p>ReadCount := Read(Header, SizeOf(Header) - 1);</p><p>if (Byte((@Header[0])^) = $FF) and (Word((@Header[1])^) = 10) then</p><p>Seek(StrLen(Header + 3) + 10 - ReadCount, 1)</p><p>else</p><p>raise EInvalidImage.CreateRes(SInvalidImage);</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">ReadComponentRes</font><font face="宋体" lang="ZH-CN">在</font><fontface="Arial">Windows</font><font face="宋体" lang="ZH-CN">资源文件中读取部件,为了判断是否是资源文件,它首先调用</font><fontface="Arial">ReadResHeader</font><font face="宋体" lang="ZH-CN">方法,然后调用</font><fontface="Arial">ReadComponent</font><font face="宋体" lang="ZH-CN">方法读取</font><fontface="Arial">Instance</font><font face="宋体" lang="ZH-CN">指定的部件。下面是它的实现:</p><p> </font><font face="Arial"></p><p>function TStream.ReadComponentRes(Instance: TComponent): TComponent;</p><p>begin</p><p>ReadResHeader;</p><p>Result := ReadComponent(Instance);</p><p>end;</p><p></font> <font face="Arial"></p><p></font><font face="宋体" lang="ZH-CN"> 与</font><font face="Arial">ReadComponentRes</font><fontface="宋体" lang="ZH-CN">相应的写方法是</font><font face="Arial">WriteComponentRes</font><fontface="宋体" lang="ZH-CN">,</font><font face="Arial">Delphi </font><font face="宋体"lang="ZH-CN">调用这两个方法读写窗体文件</font><font face="Arial">(DFM</font><fontface="宋体" lang="ZH-CN">文件</font><font face="Arial">)</font><font face="宋体"lang="ZH-CN">,在后面书中会举用这两个方法读取</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件的例子。</p><p> ⑷</font><font face="Arial"> WriteComponent</font><font face="宋体"lang="ZH-CN">和</font><font face="Arial">WriteDescendant</font><font face="宋体"lang="ZH-CN">方法</p><p> </font><font face="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象的</font><fontface="Arial">WriteDescendant</font><font face="宋体" lang="ZH-CN">方法在实现过程中,创建了</font><fontface="Arial">TWriter</font><font face="宋体" lang="ZH-CN">对象,然后利用</font><fontface="Arial">TWriter</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">WriteDescendant</font><fontface="宋体" lang="ZH-CN">方法将</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">写入流。而</font><font face="Arial">WriteComponent</font><fontface="宋体" lang="ZH-CN">方法只是简单地调用</font><font face="Arial">WriteDescendant</font><fontface="宋体" lang="ZH-CN">方法将</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">写入流。它们的实现如下:</p><p> </font><font face="Arial"></p><p>procedure TStream.WriteComponent(Instance: TComponent);</p><p>begin</p><p>WriteDescendent(Instance, nil);</p><p>end;</p><p></font> <font face="Arial"></p><p>procedure TStream.WriteDescendent(Instance, Ancestor: TComponent);</p><p>var</p><p>Writer: TWriter;</p><p>begin</p><p>Writer := TWriter.Create(Self, 4096);</p><p>try</p><p>Writer.WriteDescendent(Instance, Ancestor);</p><p>finally</p><p>Writer.Free;</p><p>end;</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p> ⑸</font><font face="Arial"> WriteDescendantRes</font><font face="宋体"lang="ZH-CN">和</font><font face="Arial">WriteComponentRes</font><font face="宋体"lang="ZH-CN">方法</p><p> </font><font face="Arial">WriteDescendantRes</font><font face="宋体"lang="ZH-CN">方法用于将部件写入</font><font face="Arial">Windows</font><fontface="宋体" lang="ZH-CN">资源文件;而</font><font face="Arial">WriteComponentRes </font><fontface="宋体" lang="ZH-CN">方法只是简单地调用</font><font face="Arial">WriteDescendantRes</font><fontface="宋体" lang="ZH-CN">方法,它们的实现如下:</p><p> </font><font face="Arial"></p><p>procedure TStream.WriteComponentRes(const ResName: string; Instance: </p><p>TComponent);</p><p>begin</p><p>WriteDescendentRes(ResName, Instance, nil);</p><p>end;</p><p></font> <font face="Arial"></p><p>procedure TStream.WriteDescendentRes(const ResName: string; Instance,</p><p>Ancestor: TComponent);</p><p>var</p><p>HeaderSize: Integer;</p><p>Origin, ImageSize: Longint;</p><p>Header: array[0..79] of Char;</p><p>begin</p><p>Byte((@Header[0])^) := $FF;</p><p>Word((@Header[1])^) := 10;</p><p>HeaderSize := StrLen(StrUpper(StrPLCopy(@Header[3], ResName, 63))) + 10;</p><p>Word((@Header[HeaderSize - 6])^) := $1030;</p><p>Longint((@Header[HeaderSize - 4])^) := 0;</p><p>WriteBuffer(Header, HeaderSize);</p><p>Origin := Position;</p><p>WriteDescendent(Instance, Ancestor);</p><p>ImageSize := Position - Origin;</p><p>Position := Origin - 4;</p><p>WriteBuffer(ImageSize, SizeOf(Longint));</font><font face="宋体" lang="ZH-CN"></p><p></font><font face="Arial">Position := Origin + ImageSize;</font><font face="宋体"lang="ZH-CN"></p><p></font><font face="Arial">end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">WriteCompnentRes</font><font face="宋体" lang="ZH-CN">是与</font><fontface="Arial">ReadComponentRes</font><font face="宋体" lang="ZH-CN">相应的对象写方法,这两个方法相互配合可读取</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件,从而利用</font><font face="Arial">Delphi</font><fontface="宋体" lang="ZH-CN">系统的功能。</p><p> </font><font face="Arial"></p><p>20.1.2 THandleStream</font><font face="宋体" lang="ZH-CN">对象</p><p> </p><p> </font><font face="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">对象的行为特别象</font><fontface="Arial">FileStream</font><font face="宋体" lang="ZH-CN">对象,所不同的是它通过已创建的文件句柄而不是文件名来存储流中的数据。</p><p> </font><font face="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">对象定义了</font><fontface="Arial">Handle</font><font face="宋体" lang="ZH-CN">属性,该属性提供了对文件句柄的只读访问,并且</font><fontface="Arial">Handle</font><font face="宋体" lang="ZH-CN">属性可以作为</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">RTL</font><fontface="宋体" lang="ZH-CN">文件管理函数的参数,利用文件类函数来读写数据。</font><font
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -