数据持久性是部件存储和获取数据的能力。ActiveX 文档怎样保持数据,很大程度上依赖于显示文档的容器应用程序。某些应用程序允许把数据写到它的一个接口中来保持数据。例如,Internet Explorer 3.0(和更高的版本)和 Microsoft Office Binder 允许使用 PropertyBag 把数据写到一个文件中。但是,其它应用程序并不提供类似的存储数据的内部方法,在那些情况下,必须使用其它方法,如把数据写到文件中。首先介绍 PropertyBag。
PropertyBag 对象允许把数据保存到文件中。该文件可以是 .vbd、.obd,或其它类型的文件─ 这取决于应用程序。PropertyBag 有两个方法:WriteProperty 方法和 ReadProperty 方法。PropertyBag 对象出现在 WriteProperties 和 ReadProperties 事件的声明部分。
保存数据的过程如下:
下列代码给出了该过程的一个简单实例:
Private Sub Text1_Change() PropertyChanged "Text" '
通知容器某一属性已经改变。End Sub
Private Sub UserDocument_WriteProperties _
(PropBag As VB.PropertyBag)
'
把属性写到属性包中。UserDocument.WriteProperty "Text1", Text1.Text, _
"Hello"
End Sub
下次打开 ActiveX 文档,将发生 ReadProperties 事件。在该事件中,PropertyBag 可用,可使用 ReadProperty 方法检索保持的数据。下面的代码检索前面的代码存储的数据:
Private Sub UserDocument_ReadProperties _ (PropBag As VB.PropertyBag) '
把属性读回到TextBox
控件中。Text1.Text = ReadProperty("Text1", "Hello")
End Sub
可能会注意到在两段代码中,ReadProperty 都包含了一个额外的参数:缺省值 "Hello"。为何在保存属性值时要提供一个缺省值呢?保存之前,WriteProperty 方法把属性值与缺省值比较。如果相同,则没有必要保存该属性值,因为在重新加载控件时缺省值将被自动设置。这样就可避免许多的缺省项把数据文件弄得杂乱无章。
也可以将二进制数据写到 PropertyBag 或从 PropertyBag 读取二进制数据。如果要以二进制形式存储数据,那么这很有帮助。例如,以自定义格式存储的图形文件。
保存二进制数据的过程与保存控件属性的过程稍有不同:
下面的简单实现显示了这些步骤:
Private mbytMyData() As Byte '
声明字节数组。Private Sub cmdSavePic_Click()
ReDim mbytMyData(1 to 5000)
'
移动数据到字节数组的代码没有给出。PropertyChanged
End Sub
Private Sub UserDocument_WriteProperties(PropBag As _
VB.PropertyBag)
PropBag.WriteProperties "myPic", mbytMyData
End Sub
如果正使用的容器不支持 PropertyBag,或者正在保存 User Designed Type (UDT) 数据,使用 Open 语句来从磁盘读取数据和写数据到磁盘。关于使用 Open 语句的介绍,可以在《Visual Basic 程序员指南》的“处理驱动器、文件夹和文件”中的“使用顺序文件访问”中找到。
详细信息 要获得添加属性到部件应遵循的行为规范,请参阅“部件设计的一般准则”中的“给类添加属性和方法”。