📄 053.htm
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>—DELPHI基础教程—第二十章 开发Delphi对象式数据管理功能(三)</TITLE><META NAME="keywords" CONTENT=" DELPHI基础教程 第二十章 开发Delphi对象式数据管理功能(三)"><META NAME="description" CONTENT=" - DELPHI基础教程 - 第二十章 开发Delphi对象式数据管理功能(三)"><style><!--#page {position:absolute; z-index:0; left:0px; top:0px}.tt3 {font: 9pt/12pt "宋体"}.tt2 {font: 12pt/15pt "宋体"}a {text-decoration:none}a:hover {color: blue;text-decoration:underline}--></style></HEAD><body text="#000000" bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3"><TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0><TR><TD CLASS="tt3" VALIGN="top" width="8%" ><strong><A HREF="054.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR><A HREF="052.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR><A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR></strong></TD><TD class="tt2" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="隶书">第二十章 开发Delphi对象式数据管理功能(三)</FONT></B></center><hr width="94%"><font face="Arial"><p>20.2.1.1 TFiler</font><font face="宋体" lang="ZH-CN">对象的属性和方法 </p><p> </font><font face="Arial">1. Root</font><font face="宋体" lang="ZH-CN">属性</p><p> 声明:</font><font face="Arial">property Root: TComponent; </p><p>Root </font><font face="宋体" lang="ZH-CN">属性给</font><font face="Arial">Filer</font><fontface="宋体" lang="ZH-CN">对象指出被读写的对象中哪一个对象是根或主要拥有者。</font><fontface="Arial">RootComponent</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">WriteRootComponent</font><font face="宋体" lang="ZH-CN">方法在读和写部件及其拥有的部件前先设置</font><fontface="Arial">Root</font><font face="宋体" lang="ZH-CN">的值。</p><p> </font><font face="Arial">2. Ancestor</font><font face="宋体" lang="ZH-CN">属性</p><p> 声明:</font><font face="Arial">property Ancestor: TPersistent; </p><p>Ancestor</font><font face="宋体" lang="ZH-CN">属性用于往继承下来的窗体中写部件,因为当写部件时,</font><fontface="Arial">Write</font><font face="宋体" lang="ZH-CN">对象只需要写入与所继承的部件不同的属性,所以在写之前要跟踪每个继承的部件,并且比较它们的属性。</p><p> 如果</font><font face="Arial">Ancestor</font><font face="宋体" lang="ZH-CN">为</font><fontface="Arial">nil</font><font face="宋体" lang="ZH-CN">,就表示没有相应的继承的部件,</font><fontface="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象应当将部件完全写入流。</font><fontface="Arial">Ancestor</font><font face="宋体" lang="ZH-CN">一般为</font><fontface="Arial">nil</font><font face="宋体" lang="ZH-CN">,只有当调用</font><fontface="Arial">WriteDescendant</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">WriteDescendantRes</font><font face="宋体" lang="ZH-CN">时,才给赋值。当编写和覆盖</font><fontface="Arial">DefineProperties</font><font face="宋体" lang="ZH-CN">时,必须设置</font><fontface="Arial">Ancestor</font><font face="宋体" lang="ZH-CN">的值。</p><p> </font><font face="Arial">3. IgnoreChildren</font><font face="宋体"lang="ZH-CN">属性</p><p> 声明:</font><font face="Arial">property Ignorechildren: Boolean;</p><p>IgnoreChildren</font><font face="宋体" lang="ZH-CN">属性使一个</font><fontface="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象存储部件时可以不存储该部件拥有的部件。如果</font><fontface="Arial">IgnoreChildren</font><font face="宋体" lang="ZH-CN">属性为</font><fontface="Arial">True</font><font face="宋体" lang="ZH-CN">,则</font><font face="Arial">Writer</font><fontface="宋体" lang="ZH-CN">对象存储部件不存它拥有的子部件。否则,</font><fontface="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象将所有其拥有的对象写入流。</p><p> </font><font face="Arial">4. Create</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">constructor Create(Stream: TStream; BufSize:Cardinal); </p><p></font><font face="宋体" lang="ZH-CN"> </font><font face="Arial">Create</font><fontface="宋体" lang="ZH-CN">方法创建一个新的</font><font face="Arial">Filer</font><fontface="宋体" lang="ZH-CN">对象,建立它和流</font><font face="Arial">Stream</font><fontface="宋体" lang="ZH-CN">的联系;并且给它分配一个缓冲区</font><fontface="Arial">Buffer</font><font face="宋体" lang="ZH-CN">。</font><font face="Arial">Buffer</font><fontface="宋体" lang="ZH-CN">的大小由</font><font face="Arial">BufSize</font><fontface="宋体" lang="ZH-CN">指定。</p><p> </font><font face="Arial">5. Defineproperty</font><font face="宋体"lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">procedure Defineproperty(const Name: String;ReadData: TReaderProc; </p><p>WriteData: TWriterProc; HasData: Boolean); virtual; abstract; </p><p>Defineproperty</font><font face="宋体" lang="ZH-CN">方法定义</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象将作为属性存储的数据。</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">参数描述接受的属性名,该属性不在</font><fontface="Arial">published</font><font face="宋体" lang="ZH-CN">部分定义。</font><fontface="Arial">ReadData</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">WriteData</font><fontface="宋体" lang="ZH-CN">参数指定在存取对象时读和写所需数据的方法。</font><fontface="Arial">HasData</font><font face="宋体" lang="ZH-CN">参数在运行时决定了属性是否有数据要存储。</p><p> 只有当对象有数据要存储时,才在该对象的</font><fontface="Arial">DefineProperties</font><font face="宋体" lang="ZH-CN">中调用</font><fontface="Arial">DefineProperty</font><font face="宋体" lang="ZH-CN">。</font><fontface="Arial">DefineProperties</font><font face="宋体" lang="ZH-CN">有一个</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象作为它的参数,调用的就是该</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象的</font><fontface="Arial">DefineProperty</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">DefineBinaryProperty</font><font face="宋体" lang="ZH-CN">方法。当定义属性时,</font><fontface="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象应当引用</font><fontface="Arial">Ancestor</font><font face="宋体" lang="ZH-CN">属性,如果该属性非空,</font><fontface="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象应当只写入与从</font><fontface="Arial">Ancestor</font><font face="宋体" lang="ZH-CN">继承的不同的属性的值。</p><p> 一个最简单的例子是</font><font face="Arial">TComponent</font><fontface="宋体" lang="ZH-CN">的</font><font face="Arial">DefineProperties</font><fontface="宋体" lang="ZH-CN">方法。尽管</font><font face="Arial">TComponent </font><fontface="宋体" lang="ZH-CN">没有在</font><font face="Arial">published</font><fontface="宋体" lang="ZH-CN">中定义</font><font face="Arial">Left</font><fontface="宋体" lang="ZH-CN">、</font><font face="Arial">Top</font><font face="宋体"lang="ZH-CN">属性,但该方法存储了部件的位置信息。</p><p> </p><p></font><font face="Arial">procedure TComponent.DefineProperties(Filer: TFiler);</p><p>begin</p><p>Filer.DefineProperty('Left', ReadLeft, WriteLeft, LongRec(FDesignInfo).Lo <> 0);</p><p>Filer.DefineProperty('Top', ReadTop, WriteTop, LongRec(FDesignInfo).Hi <> 0);</p><p>end;</p><p></font> <font face="Arial"></p><p>6. DefineBinaryproperty</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">procedure DefineBinaryproperty(const Name:String; </p><p>ReadData, WriteData: TStreamProc; </p><p>HisData: Boolean); virtual; abstract; </p><p>DefineBinaryProperty</font><font face="宋体" lang="ZH-CN">方法定义</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象作为属性存储的二进制数据。</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">参数描述属性名。</font><fontface="Arial">ReadData</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">WriteData</font><fontface="宋体" lang="ZH-CN">参数描述所存储的对象中读写所需数据的方法。</font><fontface="Arial">HasData</font><font face="宋体" lang="ZH-CN">参数在运行时决定属性是否有数据要存。</p><p> </font><font face="Arial">DefineBinaryProperty</font><font face="宋体"lang="ZH-CN">和</font><font face="Arial">DefineProperty</font><font face="宋体"lang="ZH-CN">方法的不同之处在于,二进制型的属性直接用</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象读写,而不是通过</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象。通过</font><fontface="Arial">ReadData</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">WriteData</font><fontface="宋体" lang="ZH-CN">传入的方法,直接将对象数据写入流或从流读出。</p><p> </font><font face="Arial">DefineBinaryProperty</font><font face="宋体"lang="ZH-CN">属性用得较少。只有标准的</font><font face="Arial">VCL</font><fontface="宋体" lang="ZH-CN">对象定义了象图形、图像之类的二进制属性的部件中才用它。</p><p> </font><font face="Arial">7. FlushBuffer</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">procedure FlushBuffer; virtual: abstract; </p><p>FlushBuffer</font><font face="宋体" lang="ZH-CN">方法用于使</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象的缓冲区与相联的</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象同步。对</font><fontface="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象来说,是通过重新分配缓冲区;对于</font><fontface="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象是通过写入当前缓冲区。</p><p> </font><font face="Arial">FlushBuffer</font><font face="宋体" lang="ZH-CN">是一个抽象方法,</font><fontface="Arial">TReader</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">TWriter</font><fontface="宋体" lang="ZH-CN">都覆盖了它,提供了具体实现。</p><p> </font><font face="Arial"></p><p>20.2.1.2 TFiler</font><font face="宋体" lang="ZH-CN">对象的实现原理</p><p> </p><p> </font><font face="Arial">TFiler</font><font face="宋体" lang="ZH-CN">对象是</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象的基础类,它定义的大多数方法都是抽象类型的,没有具体实现它,这些方法要在</font><fontface="Arial">TReader</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">TWrite</font><fontface="宋体" lang="ZH-CN">中覆盖。但它们提供了</font><font face="Arial">Filer</font><fontface="宋体" lang="ZH-CN">对象的框架,了解它无疑是很重要的。</p><p> </font><font face="Arial">1. TFiler</font><font face="宋体" lang="ZH-CN">对象属性的实现</p><p> </font><font face="Arial">TFiler</font><font face="宋体" lang="ZH-CN">对象定义了三个属性:</font><fontface="Arial">Root</font><font face="宋体" lang="ZH-CN">、</font><font face="Arial">Ancestor</font><fontface="宋体" lang="ZH-CN">和</font><font face="Arial">IgnoreChildren</font><fontface="宋体" lang="ZH-CN">。正如定义对象属性通常所采用的方法那样,要在</font><fontface="Arial">private</font><font face="宋体" lang="ZH-CN">部分定义存储属性值的数据域,然后在</font><fontface="Arial">public</font><font face="宋体" lang="ZH-CN">或</font><font face="Arial">Published</font><fontface="宋体" lang="ZH-CN">部分定义该属性,并按需要增加读写控制。它们的定义如下:</p><p> </p><p></font><font face="Arial">TFiler = class(TObject)</p><p>private</p><p></font><font face="宋体" lang="ZH-CN">…</font><font face="Arial"> </p><p>FRoot: TComponent;</p><p>FAncestor: TPersistent;</p><p>FIgnoreChildren: Boolean;</p><p>public</p><p></font><font face="宋体" lang="ZH-CN">…</p><p></font><font face="Arial">property Root: TComponent read FRoot write FRoot;</p><p>property Ancestor: TPersistent read FAncestor write FAncestor;</p><p>property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;</p><p>end;</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -