保持 ActiveX 文档数据

数据持久性是部件存储和获取数据的能力。ActiveX 文档怎样保持数据,很大程度上依赖于显示文档的容器应用程序。某些应用程序允许把数据写到它的一个接口中来保持数据。例如,Internet Explorer 3.0(和更高的版本)和 Microsoft Office Binder 允许使用 PropertyBag 把数据写到一个文件中。但是,其它应用程序并不提供类似的存储数据的内部方法,在那些情况下,必须使用其它方法,如把数据写到文件中。首先介绍 PropertyBag。

PropertyBag

PropertyBag 对象允许把数据保存到文件中。该文件可以是 .vbd、.obd,或其它类型的文件─ 这取决于应用程序。PropertyBag 有两个方法:WriteProperty 方法和 ReadProperty 方法。PropertyBag 对象出现在 WriteProperties 和 ReadProperties 事件的声明部分。

用 WriteProperty 方法保存数据

保存数据的过程如下:

  1. 属性改变而引发的事件中调用 PropertyChanged 方法。该方法通知容器某一属性已经发生了改变。

  2. 由于 PropertyChanged 方法,容器被“弄乱”。在容器终止以前,将发生 WriteProperties 事件。

  3. 在 WriteProperties 事件中,用 WriteProperty 方法保存属性到 .vbd 文件。

下列代码给出了该过程的一个简单实例:

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 读取二进制数据。如果要以二进制形式存储数据,那么这很有帮助。例如,以自定义格式存储的图形文件。

保存二进制数据的过程与保存控件属性的过程稍有不同:

  1. 声明模块级字节数组。

  2. 在相应的事件中,使用 ReDim 语句,并在该数组中存储二进制数据。

  3. 调用 PropertyChanged 方法。

  4. 在 WriteProperties 事件中,用 WriteProperty 方法保存字节数组。

下面的简单实现显示了这些步骤:

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

用 Open 语句保持数据

如果正使用的容器不支持 PropertyBag,或者正在保存 User Designed Type (UDT) 数据,使用 Open 语句来从磁盘读取数据和写数据到磁盘。关于使用 Open 语句的介绍,可以在《Visual Basic 程序员指南》的“处理驱动器、文件夹和文件”中的“使用顺序文件访问”中找到。

详细信息 要获得添加属性到部件应遵循的行为规范,请参阅“部件设计的一般准则”中的“给类添加属性和方法”。