2016-05-03 18 views
1

私はVB6で再帰的な関数を持っています。関数をフレンド関数にしてどこからでも手に入れることはできませんが、機能しません。関数をpublic関数に変更すると、オブジェクトは存在しないとしか言​​いません。どうして?友人機能がどのように働いているのか誤解していませんか?私の再帰的な友人機能がVB6で動作しないのはなぜですか?

コードは次のようになります。私はちょうどそれが動作する公衆に機能を変更した場合は

Friend Function TestFunction() As Boolean 
On Error GoTo ErrHandler 

    TestFunction= False 

    If Me.Works Then 
    TestFunction= True 
    End If 

    If TestFunction = False And Me.HaveChild = True Then 
    Dim objClass 
    For Each objClass In Me.colChild 
     If objClass.TestFunction = True Then 'I get the break here, due to missing object 
     TestFunction = True 
     Exit For 
     End If 
    Next 
    End If 

    Exit Function 

ErrHandler: 
    Call LogError() 
End Function 

、誰かが理由を説明できますか?

+0

colChildとは何ですか? TestFunctionが定義されている型のオブジェクトの集合ですか? – djv

+0

はい、クラスオブジェクトのコレクションです。 –

答えて

4

再帰に限定されません。ここでは再帰なしで同じ動作を示す最小限の例を示します。

Option Explicit 

Private Sub Form_Load() 
    Dim objClass 
    Set objClass = Me 
    ' OK 
    objClass.TestPublicFunction 
    ' Run-time error '438': Object doesn't support this property or method 
    objClass.TestFriendFunction 
    End 
End Sub 

Public Sub TestPublicFunction() 
    MsgBox "In public!" 
End Sub 

Friend Sub TestFriendFunction() 
    MsgBox "In friend!" 
End Sub 

なぜなら、Friendプロパティとメソッドは、同じプロジェクト内であっても、後でバインドされたオブジェクトに対して呼び出すことができないからです。 this MSDN articleを参照してください: - つまり、オブジェクトとして宣言 変数を介し

重要友達メンバーはオブジェクトのパブリック インターフェイスの一部ではないので、それらは遅延バインディングアクセスすることはできません。 Friendメンバーを使用するには、早期バインディングで変数 を宣言する必要があります。つまり、As classnameです。

実際、Variantを暗黙的に使用する代わりに、各ループイテレータを明示的に宣言することでコードを修正できるはずです。

Dim objClass As ClassName 
For Each objClass In Me.colChild 
+1

実際に彼はそこに 'Object'ではなく暗黙的に作成された' Variant'を使用していますが、余分なオーバーヘッド以外の違いはほとんどありません。 – Bob77

+0

そうです、ネットでは長すぎます。一定。 – djv

関連する問題