第二十章-开发Delphi对象式数据管理功能(四)(6)

7. SetName方法和OnSetName事件

因为在OnSetName事件中,Name参数是var型的,所以可以用OnSetName事件处理过程修改所读部件的名字。而OnSetName事件处理过程是在SetName方法中实现的。

procedure TReader.SetName(Component: TComponent; var Name: string);

begin

if Assigned(FOnSetName) then FOnSetName(Self, Component, Name);

Component.Name := Name;

end;

SetName方法和OnSetName事件在动态DFM文件的编程中有很重要的作用。

8. TReader的错误处理

TReader的错误处理是由Error方法和OnError事件的配合使用完成的。OnError 事件处理过程的Handled参数是var型的布尔变量,通过将Handled设为True或False可影响TReader 的错误处理。OnError事件处理过程是在Error方法中调用的。

function TReader.Error(const Message: string): Boolean;

begin

Result := False;

if Assigned(FOnError) then FOnError(Self, Message, Result);

end;

9. FindMethod和OnFindMethod事件

有时,在程序运行期间,给部件的方法指针(主要是事件处理过程)动态赋值是很有用的,这样就能动态地改变部件响应事件的方式。在流中读取部件捍做到一点就要利用OnFindMehtod事件。OnFIndMethod事件是在FindMethod方法中被调用的。

function TReader.FindMethod(Root: TComponent;

const MethodName: string): Pointer;

var

Error: Boolean;

begin

Result := Root.MethodAddress(MethodName);

Error := Result = nil;

if Assigned(FOnFindMethod) then FOnFindMethod(Self, MethodName, Result,

Error);

if Error then PropValueError;

end;

OnFindMethod 方法除了可以给部件的MethodName所指定的方法指针动态赋值外,还可修改Error参数来决定是否处理Missing Method错误。方法中调用的MehtodAddress 方法定义在TObject中,它是个很有用的方法,它可以得到对象中定义的public方法的地址。FindMethod方法和OnFindMethod事件在动态DFM的编程中有很重要的作用。

20.3 Delphi对象式数据管理应用实例

Delphi 2.0无论是其可视化设计工具,还是可视化部件类库(VCL),都处处渗透了对象存储技术,本节将从Delphi可视化设计内部机制、VCL中的数据存储、BLOB数据操作和动态生成部件的存储几方面介绍对象存储功能的实例应用。

20.3.1 Delphi 动态DFM文件及部件的存取在超媒体系统中的应用

Delphi的可视化设计工具是同其部件类库紧密结合在一起的。

每个部件只有通过一段注册程序并通过Delphi的Install Component功能,才能出现在Component Palette上;部件的属性才有可能出现在Object Inspector窗口中;部件的属性编辑器才能被Delphi环境使用。因为这种浑然天成的关系,DFM文件存取必然得到VCL在程序上的支持。

DFM文件的部件存取是Delphi可视化设计环境中文件存取的中心问题。因为Delphi可视化设计的核心是窗体的设计。每个窗体对应一个库单元,是应用程序的模块,窗体在磁盘上的存储就是DFM文件。

DFM文件结构我们前面介绍过了。它实际上是存储窗体及其拥有的所有部件的属性。这种拥有关系是递归的。问题在于如何将这些属性数据与程序中的变量(属性)代码联系起来。

在Delphi中处理这种联系的过程分为两种情况:设计时和运行时。

在设计时,建立联系表现为读取DFM 文件,建立DFM文件中的部件及其属性与可视化设计工具(Object Inspector、窗体设计窗口和代码编辑器)的联系,也就是说让这些部件及其属性能出现在这些窗口中,并与代码中的属性定义联系起来;分解联系表现为存储DFM文件,将窗体窗口中的部件及其属性写入DFM文件。

在运行时,主要是建立联系的过程,即读取DFM文件。这时,DFM文件不是作为独立的磁盘文件,而是以应用程序资源中的RCDATA类型的二进制数据存在。建立联系的过程表现为将资源中的部件及其属性与应用程序中的对象及其数据域联系起来。其过程为:根据DFM中的部件类名创建对象,再将用DFM中的部件属性值给程序中的部件属性赋值。当然要完成这一过程,还必须在代码中有相应的窗体定义,因为方法等代码是不存入部件的。

VCL对读取DFM文件在代码上的支持是通过Stream对象和Filer对象达到的。在20. 1和20.1节中,我们可以看到Stream对象和Filer对象中有大量的用于存取部件及其属性的方法,尤其在TReader对象中,还有关于错误处理和动态的方法赋值的方法。下面我们就通过程序实例介绍存取DFM文件方法、步骤和注意事项。

时间: 2024-08-03 20:02:11

第二十章-开发Delphi对象式数据管理功能(四)(6)的相关文章

第二十章-开发Delphi对象式数据管理功能(一)-(1)

面向对象技术是九十年代的主流技术,各类应用软件如果以面向对象的方法构造并且渗透面向对象的风格将使软件具有更高的品质.在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特色. Delphi是一个面向对象的可视化设计与面向对象的语言相结合的集成开发环境.Delphi的核心是部件.部件是对象的一种.Delphi应用程序完全是由部件来构造的,因此开发高性能的Delphi应用程序必然会涉及对象式数据管理技术. 对象式数据管理包括两方面的内容: ● 用

第二十章-开发Delphi对象式数据管理功能(一)-(2)

20.1.1.2 TStream的实现原理 TStream对象是Stream对象的基础类,这是Stream对象的基础.为了能在不同媒介上的存储数据对象,后继的Stream对象主要是在Read和Write方法上做了改进,.因此,了解TStream是掌握Stream对象管理的核心.Borland公司虽然提供了Stream对象的接口说明文档,但对于其实现和应用方法却没有提及,笔者是从Borland Delphi 2.0 Client/Server Suite 提供的源代码和部分例子程序中掌握了流式对象

第二十章-开发Delphi对象式数据管理功能(四)(1)

20.2.3 TReader对象 TReader对象是可实例化的用于从相联系的流中读取数据的Filer对象.TReader对象从TFiler继承下来,除了从TFiler继承的属性和方法外,TReader声明了不少属性.方法和事件. Owner和Parent属性用于表示从Reader对象的流中读取的部件的拥有者和双亲结点.OnError,OnFindMethod和OnSetName事件使应用程序在运行中读数据时能定制响应方式.除了覆盖了一些从TFiler对象中继承的方法外,TReader对象还定义

第二十章-开发Delphi对象式数据管理功能(四)(5)

6. 读取部件的方法的实现 Reader对象中用于读取部件的方法有ReadSignature.ReadPrefix.ReadComponent.ReadRootComponent和ReadComponents. ReadSignature方法主要用于读取Delphi Filer对象标签一般在读取部件前,都要用调用ReadSignature方法以指导部件读写过程. procedure TReader.ReadSignature; var Signature: Longint; begin Read

第二十章-开发Delphi对象式数据管理功能(四)(4)

5. 简单数据类型读方法的实现 简单数据类型指的是布尔型.字符型.整型.字符串型.浮点型.集合类型和标识符.将它们放在一起介绍是因为它们的实现方法类似. 因为它们的实现都用到了ReadValue方法,因此先来介绍ReadValue方法的实现: function TReader.ReadValue: TValueType; begin Read(Result, SizeOf(Result)); end; 该方法调用私有方法Read,从Reader对象流中读一个字节,并移动位置指针. ReadVal

第二十章-开发Delphi对象式数据管理功能(四)(3)

2. Defineproperty和DefineBinaryproperty方法的实现 这两个方法是虚方法,在TFiler中是抽象方法,在TReader和TWriter对象中才有具体的实现. 它们在TReader中的实现如下: procedure TReader.DefineProperty(const Name: string; ReadData: TReaderProc; WriteData: TWriterProc; HasData: Boolean); begin if CompareT

第二十章-开发Delphi对象式数据管理功能(四)(2)

14. OnError事件 声明:property OnError: TReaderError; 当Reader对象读取数据出错时将引发OnError事件.通过处理OnError事件,可以有选择地处理或忽略错误. 传给OnError事件处理过程的最后一个参数是名为Handled的var参数.在缺省情况下,Error方法将Handled置为True.这将阻止错误更进一步处理.如果事件处理过程仍旧将Handled置为False,Reader对象将引发一个EReadError异常事件. 15. Set

第二十章-开发Delphi对象式数据管理功能(二)(2)

4. 析构方法Destroy 该方法产生给资源解锁,然后释放该资源,最后调用继承的Destroy方法释放ResourceStream.其实现如下: destructor TResourceStream.Destroy; begin UnlockResource(HGlobal); FreeResource(HResInfo); inherited Destroy; end; 回顾Initialize方法,我们不难发现: ● ResourceStream没有额外地给资源重新分配内存,而是直接使用H

第二十章-开发Delphi对象式数据管理功能(五)(6)

20.3.2.4 BLOB字段与Stream对象 因为Delphi中,BLOB字段是通过BLOB流来访问的,所以可以很容易地在BLOB字段和Stream对象之间传递数据.为此,TBlobField对象提供了LoadFromStream和SaveToStream方法. procedure TBlobField.LoadFromStream(Stream: TStream); var BlobStream: TBlobStream; begin BlobStream := TBlobStream.C