惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
PCI Perspectives
PCI Perspectives
Webroot Blog
Webroot Blog
罗磊的独立博客
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Last Week in AI
Last Week in AI
美团技术团队
Help Net Security
Help Net Security
The Hacker News
The Hacker News
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
The Register - Security
The Register - Security
IT之家
IT之家
WordPress大学
WordPress大学
Jina AI
Jina AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Help Net Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
NISL@THU
NISL@THU
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
B
Blog
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
S
Security Affairs
小众软件
小众软件
Hacker News: Ask HN
Hacker News: Ask HN
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
A
Arctic Wolf
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence

博客园 - 望天

Web 2.0 网站架构不可或缺的图书 值得收藏的146条民间小偏方 回龙观常用电话 AJAX页面呈现模式选择 AJAX富客户端开发 Ajax框架介绍 EBS架构及实现业务特点 ASP.net 大文件上传 实现 架构师要了解那些?? witLuo介绍 网络负载平衡转发技术简介(转载) 双网卡实现负载均衡技术的实现与原理 AOP方法调用消息截获(之realproxy) Server Application Unavailable 事务处理可选方式 C# 注册COM+组件步骤 在分布式事务中登记时出错 由TObject原码对类的内存分配 TOrderedList类
TStream类
望天 · 2006-11-16 · via 博客园 - 望天

一. TStream类

1.1 TStream类概述

     
20.1.1 TStream对象
 
  TStream对象是能在各种媒介中存储二进制数据的对象的抽象对象。从TStream 对象继承的对象用于在内存、Windows资源文件、磁盘文件和数据库字段等媒

介中存储数据。

  TStream中定义了两个属性:Size和Position。它们分别以字节为单位表示的流的大小和当前指针位置。TStream中定义的方法用于在各种流中读、写和相互

拷贝二进制数据。因为所有的Stream对象都是从TStream中继承来的,所以在TStream中定义的域和方法都能被Stream对象调用和访问。此外,又由于面向对象技

术的动态联编功能,TStream为各种流的应用提供了统一的接口,简化了流的使用;不同Stream对象是抽象了对不同存储媒介的数据上的操作,因此,TStream的

需方法为在不同媒介间的数据拷贝提供了最简捷的手段。

1.2 重要方法

1.2.1 Seek方法

   声明:function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract; 

     Seek方法将流的当前指针移动Offset个字节,字节移动的起点由Origin指定。如果Offset是负数,Seek方法将从所描述的起点往

 流的头部移动。下表中列出了Origin的不同取值和它们的含义:
 
                    表1  函数Seek的参数的取值
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  常量       值      Seek的起点        Offset的取值
  ─────────────────────────────────
 SoFromBeginning    0           流的开头             正 数
 SoFromCurrent      1             流的当前位置       正数或负数  
 SoFromEnd         2             流的结尾             负 数
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1.2.2 CopyFrom方法

    声明:function CopyFrom(Source: TStream; Count: Int64): Int64; 

      CopyFrom从Source所指定的流中拷贝Count个字节到当前流中,并将指针从当前位置移动Count个字节数,函数返回值是实际拷贝的字节数。值得注意的是:

  在CopyFrom中定义了常量,const MaxBufSize = $F000;如果参数Count = 0 ,表示按Source流的大小读取流;如果Count < MaxBufSize,则读取Count大小

  的流字节。如果Count > MaxBufSize,则在Buffer中只会保留(Count - MaxBuffSize)的那部分值。如图:

                   

1.2.3 ReadComponent方法

     声明:function ReadComponent(Instance: TComponent): TComponent; 

      ReadComponent方法从当前流中读取由Instance所指定的部件,函数返回所读的部件。ReadComponent在读Instance及其拥有的所有对象时创建了一个

  Reader对象并调用它的ReadRootComponent方法。

    如果Instance为nil,ReadComponent的方法基于流中描述的部件类型信息创建部件,并返回新创建的部件。

1.2.4 ReadComponentRes方法

    声明:function ReadComponentRes(Instance: TComponent): TComponent; 

      ReadComponentRes方法从流中读取Instance指定的部件,但是流的当前位置必须是由WriteComponentRes方法所写入的部件的位置。ReadComponentRes

 首先调用ReadResHeader方法从流中读取资源头,然后调用ReadComponent方法读取Instance。如果流的当前位置不包含一个资源头。ReadResHeader将引发一个

 EInvalidImage异常事件。在Classes库单元中也包含一个名为ReadComponentRes的函数,该函数执行相同的操作,只不过它基于应用程序包含的资源建立自己的

 流。

1.2.5 Read方法

   声明:function Read(var Buffer; Count: Longint): Longint; virtual; abstract; 

     Read方法从当前流中的当前位置起将Count个字节的内容复制到Buffer中,并把当前指针向后移动Count个字节数,函数返回值是实际读的字节数。如果返回值

 小于Count,这意味着读操作在读满所需字节数前指针已经到达了流的尾部。

1.2.6 WriteDescendant方法

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

Stream对象的WriteDescendant方法创建一个Writer对象,然后调入该对象的WriteDescendant方法将Instance部件写入流中。Instance可以是从Ancestor

部件继承的窗体,也可以是在从祖先窗体中继承的窗体中相应于祖先窗体中Ancestor部件的部件。

二. 疑问与解答

2.1 关于类中方法间调用的意图

    如图,在TStream类中为了实现Size特性,竟然有三个相似的SetSize方法;他们其中的调用关系如图所示,现在有个疑团就是在VCL中为什么要这样设计呢?

         

    答:其实由于SetSize方法是虚函数,在派生类中可以覆盖此方法。所以,当派生类对象访问Size特性时,就通过SetSize64过程调用过程procedure

SetSize(const NewSize: Int64); overload; virtual;而大家注意此时的调用的SetSize过程其实是派生类覆盖后的过程了。这样就访问到了当前的Size值了。