现在有一个自创建的Docuemnt对象,里面包含很多Page,并且每个Page的容量都很大,不可能一次全部加载进入内存。我的思路是在Document里面建立一个Page列表缓存,只缓存每个Page的基本信息,当访问到具体的每个Page对象时才从文件中加载Page的全部数据。问题就在这里了,我怎么控制访问该对象时才加载全部信息?我的对象模型是:
Document
--PageCollecion
----Page

解决方案 »

  1.   

    Page类只存放最基础信息,如数据放在何处
    每次调用Page类的方法取得数据时,在从文件中加载为了速度,可以考虑缓存机制,即:每次从文件中加载数据后就缓存数据,下次读取就可读缓存了
      

  2.   

    我在Document对象的开头建立了一个索引区,用于存储每个对象的引导区位置
    如果Page只保存基础信息,那么我本来考虑过下列方法:Page类包含一个属性HasInited=false
    初始化是只初始化基本信息,调用Page.LoadData(dp as DataPos)是加载全部信息
    DataPos是Page的引导区位置,这些信息存储在Document对象中,我怎么样在Page中访问到Document中的DataPos对象注意Document中的DataPos是不允许public的,因为这些属于机密东东,也不需要公开!!
      

  3.   

    //我怎么样在Page中访问到Document中的DataPos对象
    Friend啊
    友元方法只能在工程内的访问
      

  4.   

    MSDN:
    对象之间的私有通信
    有时,部件的对象需要不受部件用户干涉地完成对象之间的通信。例如,Widgets 集合类可能要为新创建的 Widget 设置 Parent 属性,并将其设为只读。类的公共方法可以被其它对象调用,也可以被客户端调用。私有方法则不能从部件外调用,且它对于部件内的其它对象也是不可见的。解决办法是使用 Friend 方法。下面的代码段中,假想的 Widget 对象显露一个公共的只读 Parent 属性,以及一个 Widgets 集合用来为新创建的 Widget 设置其 Parent 属性的 Friend 方法(称为 SetParent)。'Widget 总是 mechanism 的组成部分。
    Private mmchParent As MechanismPublic Property Get Parent() As Mechanism
       Set Parent = mmchParent
    End PropertyFriend Sub SetParent(ByVal NewParent As Mechanism)
       Set mmchParent = NewParent
    End Sub如果一个方法用 Friend 关键字声明,则它对部件中的其它对象是可见的,但该方法不会添加到类型库或公共接口。图 6.4 说明了这一点。图 6.4   Friend 方法的工程范围运行时,从 Widgets 集合类(工程内)见到的接口与从客户端见到的接口是不同的。工程内(以及编译好的 DLL )Widget 接口包括 Widgets 集合可调用的 Friend 方法 SetParent。因为 Friend 方法没有被添加到类型库,所以客户端只能见到 Widget 的接口中的公共属性和方法。对属性使用 Friend 关键字
    也可以使用 Friend 关键字声明属性过程。事实上,组成同一属性的不同的属性过程其范围也不同。前面的代码示例可以用一对属性过程重写:'Widget 是 mechanism 的组成部分。
    Private mmchParent As MechanismPublic Property Get Parent() As Mechanism
       Set Parent = mmchParent
    End PropertyFriend Property Set Parent(ByVal NewParent As _
          Mechanism)
       Set mmchParent = NewParent
    End Sub在部件内,Parent 是一个可读/写的属性。对于客户端,它是只读属性,这是因为部件的类型库中只出现 Property Get。可以认为 Friend 具有介于 Public 和 Private 之间的范围。重点   要调用 Friend 方法和属性,必须使用严格定义类型的对象变量。在上面的示例中,Widgets 集合为能够访问 SetParent 方法或 Property Set Parent,必须使用声明为 As Widget 的变量。不能从声明为 As Object 的变量中调用 Friend 方法。隐藏返回私有对象的对象属性
    “使用属性和集合创建对象模型”描述了对象模型中私有对象的使用方法。在对象模型中,这种对象与公共对象链接时,可以使用 Friend 关键字来声明属性过程的所有部分。例如,每一个 Widget 对象都可能具有 Socket 对象,而该 Socket 对象出于某种原因不能显露给部件的用户。可以把下面的对象属性添加到该 Widget 对象。这样,不必将该属性添加到类型库或公共接口,就可以在部件内访问该 Socket:'创建所需 Socket 对象 (As New)。
    Private msoc As New SocketFriend Property Get Socket() As Socket
       Set Socket = msoc
    End Property详细信息   Friend 方法在《Visual Basic 程序员指南》“用对象编程”中介绍。
      

  5.   

    MSDN:友元属性和方法
    除了将属性和方法声明为 Public 和 Private 以外,也可以将它们声明为 Friend。Friend 成员对于工程中其它对象来说,看起来就象 Public 成员。也就是说,它们以类的接口部分的形式出现。但它们并不是类接口的一部分。在用 Visual Basic 的专业版和企业版可以创建的 ActiveX 部件中,Friend 成员起了重要作用。因为它们并非某个对象的接口的一部分,所以不能被使用该部件对象的程序所访问。不过,对于该部件内所有其它对象来说,它们都是可见的,因此它们允许在该部件内进行安全的内部通信。重点   因为 Friend 成员并非某个对象公用接口的一部分,它们不能被后期绑定访问—也就是说,通过 As Object 声明为对象的变量不能访问。为了使用 Friend 成员,必须用前期绑定声明的变量—也就是说,As classname。“标准 EXE”工程不可能是 ActiveX 部件,因为它们的类模块不可能是 Public,所以不能被其它应用程序使用。因此在一个“标准 EXE”工程中,对象间所有通信都是私有的,并不需要 Friend 成员。不过,Friend 成员有个特别有用的特点。因为它们不是某个 ActiveX 接口的一部分,它们不能用来在对象间传递用户定义类型。例如,在下面的标准模块中,假设有用户定义类型:Public Type udtDemo
       intA As Integer
       lngB As Long
       strC As String
    End Type可以在 Class1 中定义下面的私有变量和 Friend 成员:Private mDemo As udtDemoFriend Property Get Demo() As udtDemo
       Demo = mDemo
    End Property' 注意 udtDemo 必须通过引用来传递。
    Friend Property Let Demo(NewDemo As udtDemo)
       mDemo = NewDemo
    End PropertyFriend Sub SetDemoParts(ByVal A As Integer, _
          ByVal B As Long, ByVal C As String)
       mDemo.intA = A
       mDemo.lngB = B
       mDemo.strC = C
    End SubPublic Sub ShowDemo()
       MsgBox mDemo.intA & vbCrLf _
       & mDemo.lngB & vbCrLf & mDemo.strC
    End Sub注意   当传递 Sub、Function,或属性过程参数这样的用户定义类型时,必须通过引用来传递它们。(ByRef 是过程参数的缺省值。)然后可以写出下列代码使用 Class1:Private Sub Command1_Click()
       Dim c1A As New Class1
       Dim c1B As New Class1
       c1A.SetDemoParts 42, 1138, "Howdy"
       c1B.Demo = c1A.Demo
       c1B.ShowDemo
    End Sub信息框将显示 42、1138 和 "Howdy"。注意   因为 Friend 过程并非类接口的一部分,所以当使用 Implements 语句来实现多接口时,它们并不包括在里面,如下面“多态”中所描述的。详细信息   关于 Friend 成员在部件中的使用,在《部件工具指南》的“部件设计的一般准则”中的“对象之间的私有通信”中作了讨论。
      

  6.   

    KAO,原来这么复杂的问题就是因为我没有用过friend关键字……这50分给得可真怨………………不过还是要给!!!!