2009-09-01 9 views
1

Visual Basic a des propriétés par défaut qui sont parfois implicitement appelées lors de l'évaluation d'une expression. Cependant, il semble que je rencontre une contradiction avec cette exécution implicite des propriétés par défaut. La mise en page du projet ressemble:Propriété Visual Basic 6 par défaut pour les fonctions intégrées

Class1:

property test -> class2 (default) 

Classe2:

property test -> string "hello world" (default) 

Form1:

Dim x As New Class2 
MsgBox x 
Debug.Print x 

L'instruction MsgBox appellera implicitement la valeur par défaut de x (en cours de test sur class1) et en plus elle appellera la valeur par défaut sur celle-ci (en cours de test sur class2) ce qui fait apparaître "hello world" sur l'écran. L'instruction Debug.Print ne le fait pas cependant, et en suivant le débogueur, on peut voir que seul le premier défaut (sur class1) est appelé.

J'ai vérifié que de nombreuses fonctions intégrées telles que MsgBox/RTrim/LTrim présentent ce comportement, et que les méthodes auto-écrites ou les méthodes de classe ne le font pas; mais je suis incapable de comprendre pourquoi cela se produit?

Répondre

4

Il ne s'agit pas du tout d'un "comportement" des fonctions intégrées, mais de la manière dont COM convertit les références d'objet et les variantes en chaînes. Cela a également une connexion avec les mots-clés de langue Set et Let et l'évaluation de l'expression, en particulier les parenthèses. Considérez cet exemple de code:

Private Sub Form_Load() 
    Dim x As Class1 
    Dim v As Variant 
    Dim s As String 

    Set x = New Class1 
    Set v = x ' None 
    Let v = x ' Once 
    Set v = (x) ' Once 
    Let v = (x) ' Twice 
    's = x  ' Compile error: Type mismatch 
    Set v = x 
    s = v  ' Twice 
    s = CVar(x) ' Twice 
    MsgBox x 
    'Debug.Print CStr(x) ' Compile error: Type mismatch 
    'Debug.Print CVar(x) ' Run-time error: Type mismatch 
    Debug.Print CStr(CVar(x)) ' Twice 
    pvTest1 x 
End Sub 

Private Function pvTest1(ByVal o As Variant) 
    'Debug.Print o  ' Run-time error: Type mismatch 
    Debug.Print CStr(o) ' Twice 
End Function 

Remarquez comment référence d'objet de coulée à une chaîne est une erreur de compilation (CSTR (x) appel) alors qu'une variante contenant une référence (IDispatch un) est moulé très bien (s = v). Cette dernière affectation va "déplier" les propriétés par défaut aussi profondément que cela prend alors que la propriété par défaut évalue à un IDispatch (appel Invoke avec DISPID mis à -1). En bref: si vous avez une référence à un objet et que vous devez évaluer les propriétés par défaut de façon récurrente à une valeur de type "primitif" (par exemple une chaîne), utilisez CStr (CVar (x)) (ou CInt (CVar .. .), etc)

Questions connexes