Question

Dans VB6, j'essaie de passer un objet lié tardif à une autre forme.

frmmain.vb

Dim x
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

frmdialog

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  Set y = paramX
End Sub

Le contenu de Y est une chaîne contenant le nom de type de l'objet lié tardif, "Myown.Object". Byval et Byref ne font pas de différence. Des indices? Avoir du mal à se souvenir.

Était-ce utile?

La solution

J'ai utilisé du vartype (y). Le résultat est 8, pour VBSTring. Il devrait être 9 pour l'objet. - ssorrell il y a 1 heure

Utilisez l'impression y dans la fenêtre immédiate pour trouver le contenu de y. - ssorrell il y a 55 minutes

Cela semble confirmer mes soupçons. La MyOwn.Object La classe doit avoir une propriété ou une méthode par défaut qui renvoie une chaîne.

Par conséquent, lorsque vous essayez de Debug.Print Il renvoie la valeur de la propriété / méthode par défaut. Lorsque vous survolez la variable dans l'IDE, VB6 affichera la valeur de la propriété / méthode par défaut. Quand tu fais un VarType demander y Il renverra le type de variable de la propriété ou de la méthode par défaut.

La raison en est que lorsque vous avez une variable de type Variant qui stocke un Object, et la classe de l'objet définit une méthode ou une propriété par défaut, la variable évaluera la valeur de retour de la méthode ou de la propriété par défaut dans la plupart des situations.

Vous pouvez rapidement vérifier si le MyOwn.Object La classe a un membre par défaut en ouvrant le Navigateur d'objet au MyOwn.Object classe et en regardant sa liste de propriétés et de méthodes. Si vous voyez une méthode ou une propriété qui a une icône avec un petit cercle bleu dans le coin, qui indique que la méthode ou la propriété est le membre par défaut de la classe. Si vous en trouvez un, je suis prêt à parier qu'il est déclaré pour renvoyer une chaîne.

Notez que même si vous avez changé tout votre VariantS à ObjectS, vous rencontreriez toujours ce comportement dans un certain nombre d'endroits. Par exemple, même si y est déclaré As Object, faisant un Debug.Print y Imprimera toujours la valeur de la propriété ou de la méthode par défaut, et en faisant un VarType(y) reviendra toujours 8 (chaîne).

Savoir exactement quand VB6 utilisera le membre par défaut et quand il ne peut pas être déroutant. Par exemple, si vous déclarez y comme Object, alors faisant TypeName(y) reviendra MyOwn.Class, mais VarType(y) reviendra toujours 8 (chaîne). Cependant, si vous déclarez y comme Variant, alors TypeName(y) Retour String.

Si vous utilisez la liaison tardive, il est difficile d'éviter cet effet secondaire, car vous ne pourrez que déclarer votre variable d'objet comme Object ou Variant.

Autres conseils

Je n'ai pas de copie de VB6 Handy, mais je me souviens avoir fait la même chose plus ou moins assez souvent, et je crois que nous avons utilisé un objet plutôt que une variante dans la signature de la méthode. La variante est généralement beaucoup moins prévisible en termes de types de conversions qu'il peut exécuter sur une variable, tandis qu'avec l'objet, je suis assez sûr que VB n'essaiera aucune sorte de conversion.

Êtes-vous sûr de ne pas avoir omis le mot-clé SET, par exemple

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  ' Set y = paramX  ' thought you had this...
  y = paramX        ' ...actually have this
End Sub

Si tel était le cas, la valeur de Y serait la valeur par défaut de l'objet. Votre classe Myown.Object a-t-elle une propriété qui renvoie une description de son type et a été définie comme le membre par défaut de la classe (marqué d'un point bleu dans le navigateur d'objet VB)?

frmmain.vb

Dim x As Object
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

frmdialog

Dim y As Object
Public Sub SetMyOwnObject(ByRef paramX As Object)
  Set y = paramX
End Sub

Lorsque vous utilisez CreateObject, vous créez un objet et non une variante. Lorsque vous passez un objet, vous utilisez généralement Byref.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top