Top / TIPS / 循環参照の解決(Parent プロパティを実装する)

階層構造(親子)をもつオブジェクトを考えてみます。 Excel を参照設定して、オブジェクトブラウザで、表示してみましょう。

parent.gif

WorkBook オブジェクトは、Application オブジェクトへの参照である、Parent プロパティを持っています。 これを、VB で、通常の方法で実装しようとすると、オブジェクトが廃棄できなくなってしまいます。

というのは、オブジェクトの廃棄のタイミングは、すべての参照がなくなったときなので、親であるオブジェクトを廃棄しようとしても、子オブジェクトからの参照が残っているため、廃棄できないのです。

このようなときは、Parent プロパティに、ひと工夫しましょう。

4 バイトのポインタを保持するための変数を確保します。

Private mlngParent As Long

Property Set プロシージャでは、親オブジェクトが指す、ポインタを確保した変数に代入します。

Friend Property Set Parent(ByVal New_Parent As CParent)
    mlngParent = ObjPtr(New_Parent)
End Property

Property Get プロシージャでは、ポインタを確保した変数から、いったんオブジェクト変数に代入し、値を返してから、代入した変数を元に戻します。

Private Declare Function CopyMemory Lib "Kernel32" _
           Alias "RtlMoveMemory" _
           (lpDest As Any, lpSource As Long, _
            ByVal nLength As Long) As Long

Public Property Get Parent() As CParent
    Dim objParent As CParent
    CopyMemory objParent, mlngParent, Len(mlngParent)
    Set Parent = objParent
    CopyMemory objParent, 0, Len(mlngParent)
End Property



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-10-25 (日) 23:56:02 (2920d)