Pregunta

En VB6, estoy tratando de pasar un objeto tardío a otra forma.

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

El contenido de y es una cadena que contiene el nombre de tipo del objeto de límite tardío, "miown.object". Byval y Byref no marcan la diferencia. ¿Alguna pista? Tener problemas para recordar.

¿Fue útil?

Solución

Usé Vartype (y). El resultado es 8, para VBString. Debe ser 9 para el objeto. - Ssorrrell hace 1 hora

Use impresión y en la ventana inmediata para encontrar el contenido de y. - Ssorrrell hace 55 minutos

Esto parece confirmar mis sospechas. los MyOwn.Object La clase debe tener una propiedad o método predeterminado que devuelva una cadena.

Por lo tanto, cuando intentas Debug.Print Es, devolverá el valor de la propiedad/método predeterminado. Cuando pase la variable en el IDE, VB6 mostrará el valor de la propiedad/método predeterminado. Cuando haces un VarType recurrir y Devolverá el tipo variable de la propiedad o método predeterminado.

La razón es que cuando tienes una variable de tipo Variant que almacena un Object, y la clase del objeto define un método o propiedad predeterminada, la variable evaluará el valor de retorno del método o propiedad predeterminada en la mayoría de las situaciones.

Puede verificar rápidamente para ver si el MyOwn.Object La clase tiene un miembro predeterminado al abrir el Navegador de objetos hacia MyOwn.Object clase y observar la lista de propiedades y métodos. Si ve un método o propiedad que tiene un icono con un pequeño círculo azul en la esquina, eso indica que el método o propiedad es el miembro predeterminado de la clase. Si encuentra uno, estoy dispuesto a apostar que se declara para devolver una cadena.

Tenga en cuenta que incluso si cambió todo su VariantS para ObjectS, aún encontrarías este comportamiento en varios lugares. Por ejemplo, incluso si y se declara As Object, haciendo un Debug.Print y todavía imprimirá el valor de la propiedad o método predeterminado, y haciendo un VarType(y) todavía devolverá 8 (cadena).

Saber exactamente cuándo VB6 usará el miembro predeterminado y cuándo no puede ser confuso. Por ejemplo, si declara y como Object, luego haciendo TypeName(y) Volverá MyOwn.Class, pero VarType(y) todavía devolverá 8 (cadena). Sin embargo, si declaras y como Variant, después TypeName(y) devoluciones String.

Si está utilizando la unión tardía, es difícil evitar este efecto secundario, ya que solo podrá declarar su variable de objeto como Object o Variant.

Otros consejos

No tengo una copia de VB6 Handy, pero recuerdo haber hecho lo mismo con más o menos bastante o menos frecuencia, y creo que usamos objeto en lugar de variante en la firma del método. La variante generalmente es mucho menos predecible en términos de qué tipo de conversiones puede ejecutarse en una variable, mientras que con el objeto estoy bastante seguro de que VB no intentará ningún tipo de conversión.

¿Estás seguro de que no has omitido la palabra clave establecida, por ejemplo?

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

Si este fuera el caso, entonces el valor de y sería el valor predeterminado del objeto. ¿Su clase miown.object tiene una propiedad que devuelve una descripción de su tipo y se ha definido como el miembro predeterminado para la clase (marcado con un punto azul en el navegador de objetos 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

Cuando usa CreateObject, está creando un objeto, no una variante. Cuando pasa un objeto en general, usa Byref.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top