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

推荐订阅源

A
Arctic Wolf
博客园 - 聂微东
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
小众软件
小众软件
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
L
LangChain Blog
A
About on SuperTechFans
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
T
The Blog of Author Tim Ferriss
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
Scott Helme
Scott Helme
S
Secure Thoughts
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
Attack and Defense Labs
Attack and Defense Labs
P
Privacy & Cybersecurity Law Blog
O
OpenAI News
H
Heimdal Security Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Help Net Security
Help Net Security
C
Cyber Attacks, Cyber Crime and Cyber Security
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
G
Google Developers Blog
博客园 - Franky
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
Kaspersky official blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives

博客园 - 望天

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值了。