📄 051.htm
字号:
face="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">覆盖了构造函数</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">,该函数带有</font><fontface="Arial">Handle </font><font face="宋体" lang="ZH-CN">参数,该参数指定与</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">对象相关的文件句柄。</p><p> </font><font face="Arial"></p><p>20.1.2.1 THandleStream</font><font face="宋体" lang="ZH-CN">的属性的方法:</p><p> </p><p> </font><font face="Arial">1. Handle</font><font face="宋体" lang="ZH-CN">属性</p><p> 声明:</font><font face="Arial">property Handle: Integer; </p><p>Handle</font><font face="宋体" lang="ZH-CN">属性提供了对文件句柄的只读访问,该句柄由</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">的构造方法</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">传入。因此除了用</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">提供的方法外,也可以用文件管理函数对句柄进行操作。实际上,</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">的方法在实现上也是运用文件管理函数进行实际的读写操作。</p><p> </font><font face="Arial">2. Create</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">constructor Create(AHandle: Integer); </font><fontface="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">Create</font><font face="宋体" lang="ZH-CN">方法使用传入的</font><fontface="Arial">Handle</font><font face="宋体" lang="ZH-CN">参数创建一个与特定文件句柄相联的</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">对象,并且将</font><fontface="Arial">AHandle</font><font face="宋体" lang="ZH-CN">赋给流的</font><fontface="Arial">Handle</font><font face="宋体" lang="ZH-CN">属性。</p><p> </p><p> </font><font face="Arial">3. Read</font><font face="宋体" lang="ZH-CN">、</font><fontface="Arial">Write</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">Seek</font><fontface="宋体" lang="ZH-CN">方法</p><p> 这三个方法是</font><font face="Arial">TStream</font><font face="宋体"lang="ZH-CN">的虚方法,只是在</font><font face="Arial">THandleStream </font><fontface="宋体" lang="ZH-CN">中覆盖了这三个方法,以实现特定媒介──文件的数据存取。后面会详细介绍这三个方法的实现。</p><p> </font><font face="Arial"></p><p>20.1.2.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">TStream</font><font face="宋体" lang="ZH-CN">继承来的,因此可以共用</font><fontface="Arial">TStream</font><font face="宋体" lang="ZH-CN">中的属性和大多数方法。</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">在实现上主要是增加了一个属性</font><fontface="Arial">Handle</font><font face="宋体" lang="ZH-CN">和覆盖了</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">、</font><font face="Arial">Read</font><fontface="宋体" lang="ZH-CN">、</font><font face="Arial">Write</font><font face="宋体"lang="ZH-CN">和</font><font face="Arial">Seek</font><font face="宋体" lang="ZH-CN">四个方法。</p><p> </font><font face="Arial">1. </font><font face="宋体" lang="ZH-CN">属性的实现</p><p> </font><font face="Arial">Handle</font><font face="宋体" lang="ZH-CN">属性的实现正如</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">大多数属性的实现那样,先在对象定义的</font><fontface="Arial">private</font><font face="宋体" lang="ZH-CN">部分声明一个存放数据的变量</font><fontface="Arial">FHandle</font><font face="宋体" lang="ZH-CN">,然后在定义的</font><fontface="Arial">public</font><font face="宋体" lang="ZH-CN">部分声明属性</font><fontface="Arial">Handle</font><font face="宋体" lang="ZH-CN">,其中属性定义的读写控制部分加上只读控制,读控制只是直接读取</font><fontface="Arial">FHandle</font><font face="宋体" lang="ZH-CN">变量的值,其实现如下:</p><p> </font><font face="Arial"></p><p>THandleStream = class(TStream)</p><p>private</p><p>FHandle: Integer;</p><p>public</p><p></font><font face="宋体" lang="ZH-CN">…</font><font face="Arial"></p><p>property Handle: Integer read FHandle;</p><p>end;</p><p></font> <font face="Arial"></p><p>2. </font><font face="宋体" lang="ZH-CN">方法的实现</p><p> </font><font face="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">的</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">方法,以</font><fontface="Arial">AHandle</font><font face="宋体" lang="ZH-CN">作为参数,在方法里面只是简单的将</font><fontface="Arial">AHandle</font><font face="宋体" lang="ZH-CN">的值赋给</font><fontface="Arial">FHandle</font><font face="宋体" lang="ZH-CN">,其实现如下:</p><p> </font><font face="Arial"></p><p>constructor THandleStream.Create(AHandle: Integer);</p><p>begin</p><p>FHandle := AHandle;</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p> 为实现针对文件的数据对象存储,</font><font face="Arial">THandleStream</font><fontface="宋体" lang="ZH-CN">的</font><font face="Arial">Read</font><font face="宋体"lang="ZH-CN">、</font><font face="Arial">Write</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">Seek</font><font face="宋体" lang="ZH-CN">方法覆盖了</font><fontface="Arial">TStream</font><font face="宋体" lang="ZH-CN">中的相应方法。它们的实现都调用了</font><fontface="Arial">Windows</font><font face="宋体" lang="ZH-CN">的文件管理函数。</p><p> </font><font face="Arial">Read</font><font face="宋体" lang="ZH-CN">方法调用</font><fontface="Arial">FileRead</font><font face="宋体" lang="ZH-CN">函数实现文件读操作,其实现如下:</p><p> </font><font face="Arial"></p><p>function THandleStream.Read(var Buffer; Count: Longint): Longint;</p><p>begin</p><p>Result := FileRead(FHandle, Buffer, Count);</p><p>if Result = -1 then Result := 0;</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">Write</font><font face="宋体" lang="ZH-CN">方法调用</font><fontface="Arial">FileWrite</font><font face="宋体" lang="ZH-CN">函数实现文件写操作,其实现如下:</p><p> </font><font face="Arial"></p><p>function THandleStream.Write(const Buffer; Count: Longint): Longint;</p><p>begin</p><p>Result := FileWrite(FHandle, Buffer, Count);</p><p>if Result = -1 then Result := 0;</p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">Seek</font><font face="宋体" lang="ZH-CN">方法调用</font><fontface="Arial">FileSeek</font><font face="宋体" lang="ZH-CN">函数实现文件指针的移动,其实现如下:</p><p> </font><font face="Arial"></p><p>function THandleStream.Seek(Offset: Longint; Origin: Word): Longint;</p><p>begin</p><p>Result := FileSeek(FHandle, Offset, Origin);</p><p>end;</p><p></font> <font face="Arial"></p><p>20.1.3 TFileStream</font><font face="宋体" lang="ZH-CN">对象</p><p> </p><p> </font><font face="Arial">TFileStream</font><font face="宋体" lang="ZH-CN">对象是在磁盘文件上存储数据的</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象。</font><fontface="Arial">TFileStream</font><font face="宋体" lang="ZH-CN">是从</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">继承下来的,它和</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">一样都是实现文件的存取操作。不同之处在于</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">用句柄访问文件,而</font><fontface="Arial">TFileStream</font><font face="宋体" lang="ZH-CN">用文件名访问文件。实际上</font><fontface="Arial">TFileStream</font><font face="宋体" lang="ZH-CN">是</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">上的一层包装,其内核是</font><fontface="Arial">THandleStream</font><font face="宋体" lang="ZH-CN">的属性和方法。</p><p> </font><font face="Arial">TFileStream</font><font face="宋体" lang="ZH-CN">中没有增加新的属性和方法。它只是覆盖了的构造方法</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">和析构方法</font><fontface="Arial">Destory</font><font face="宋体" lang="ZH-CN">。在</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">方法中带两个参数</font><fontface="Arial">FileName</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">Mode</font><fontface="宋体" lang="ZH-CN">。</font><font face="Arial">FileName</font><font face="宋体"lang="ZH-CN">描述要创建或打开的文件名,而</font><font face="Arial">Mode</font><fontface="宋体" lang="ZH-CN">描述文件模式如</font><font face="Arial">fmCreate</font><fontface="宋体" lang="ZH-CN">、</font><font face="Arial">fmOpenRead</font><fontface="宋体" lang="ZH-CN">和</font><font face="Arial">fmOpenWrite</font><fontface="宋体" lang="ZH-CN">等。</font><font face="Arial">Create</font><fontface="宋体" lang="ZH-CN">方法首先使用</font><font face="Arial">FileCreate</font><fontface="宋体" lang="ZH-CN">或</font><font face="Arial">FileOpen</font><font face="宋体"lang="ZH-CN">函数创建或打开名为</font><font face="Arial">FileName</font><fontface="宋体" lang="ZH-CN">的文件,再将得到的文件句柄赋给</font><fontface="Arial">FHandle</font><font face="宋体" lang="ZH-CN">。</font><font face="Arial">TFileStream</font><fontface="宋体" lang="ZH-CN">的文件读写操作都是由从</font><font face="Arial">THandleStream</font><fontface="宋体" lang="ZH-CN">继承的</font><font face="Arial">Read</font><FONT< P> </p><p>var</p><p>Stream: TStream;</p><p>begin</p><p>Stream := TFileStream.Create(FileName, fmCreate);</p><p>try</p><p>SaveToStream(Stream);</p><p>finally</p><p>Stream.Free;</p><p>end;</p><p>end;</p><p> <font face="宋体" lang="ZH-CN"></p><p> 在</font><font face="Arial">Delphi </font><font face="宋体" lang="ZH-CN">的许多对象的</font><fontface="Arial">SaveToStream </font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">SaveToFile</font><font face="宋体" lang="ZH-CN">、</font><fontface="Arial">LoadFromStream</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">LoadFromFile</font><font face="宋体" lang="ZH-CN">方法的实现都有类似的嵌套结构。</p><p> </font><font face="Arial"></p><p>20.1.5 TMemoryStream</font><font face="宋体" lang="ZH-CN">对象</p><p> </p><p> </font> <font face="Arial">TMemoryStream</font><font face="宋体" lang="ZH-CN">对象是一个管理动态内存中的数据的</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象,它是从</font><fontface="Arial">TCustomMemoryStream</font><font face="宋体" lang="ZH-CN">中继承下来的,除了从</font><fontface="Arial">TCustomMemoryStream</font><font face="宋体" lang="ZH-CN">中继承的属性和方法外,它还增加和覆盖了一些用于从磁盘文件和其它注台读数据的方法。它还提供了写入、消除内存内容的动态内存管理方法。下面介绍它的这些属性和方法。</p><p> </font><font face="Arial"></p><p>20.1.5.1 TMemoryStream</font><font face="宋体" lang="ZH-CN">的属性和方法</p><p> </p><p> </font><font face="Arial">1. Capacity</font><font face="宋体" lang="ZH-CN">属性</p><p> 声明:</font><font face="Arial">property Copacity: Longint; </p><p>Capacity</font><font face="宋体" lang="ZH-CN">属性决定了分配给内存流的内存池的大小。这与</font><fontface="Arial">Size</font><font face="宋体" lang="ZH-CN">属性有些不同。</font><fontface="Arial">Size</font><font face="宋体" lang="ZH-CN">属性是描述流中数据的大小。在程序中可以将</font><fontface="Arial">Capacity </font><font face="宋体" lang="ZH-CN">的值设置的比数据所需最大内存大一些,这样可以避免频繁地重新分配。</p><p> </font><font face="Arial">2. Realloc</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function Realloc(var NewCapacity: Longint):Pointer; virtual; </p><p>Realloc</font><font face="宋体" lang="ZH-CN">方法,以</font><font face="Arial">8K</font><fontface="宋体" lang="ZH-CN">为单位分配动态内存,内存的大小由</font><fontface="Arial">NewCapacity</font><font face="宋体" lang="ZH-CN">指定,函数返回指向所分配内存的指针。</p><p> </font><font face="Arial">3. SetSize</font><font face="宋体" lang="ZH-CN">方法</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -