Pregunta

Realmente estoy luchando con algo aquí. Tengo un módulo de clase, vamos a llamarlo FormMan que tiene un montón de métodos relacionados con el gran número de formularios de usuario que tengo en mi proyecto. Un método particular es que se llamará a partir de una gran cantidad de diferentes lugares y es bastante simple -. Simplemente añade un número definido por el usuario de los controles a un formulario y se extiende la altura formas para dar cabida a estos nuevos controles

El usuario pasa el número de controles y el formulario de usuario.

oF.AddControlsToForm iNumberOfControls,frmTest

En el módulo de clase FormMan:

Public Sub Addcontrols(iNum as integer, oForm as userform)

//stuff happens here, oForm is used extensively

oForm.Height = i  //object does not support this property or method
frmTest.Height = i //works

oForm.Show //object does not...
frmTest.show  //works

end sub

En la ventana locales, oForm no tiene una propiedad de altura, por lo que es justo. Pero oForm se ha definido como frmTest. Puedo decir oForm.BackColor = vbred, y puedo establecer ctl = oform.TextBox1 por ejemplo

Esto está destinado a ser un procedimiento genérico que se puede añadir un montón de controles para cualquiera de sus formas. He intentado cargar y mostrar el formulario antes de asignarlo a oForm.

¿Por qué son la altura y muestran propiedades y métodos de userforms pero no de los objetos declarados como userforms? ¿Qué estoy haciendo mal?

Realmente aprecio cualquier ayuda.

¿Fue útil?

Solución

El problema aquí es que los objetos de UserForm y frmTest no son del mismo tipo. De hecho, frmTest es un subtipo de formulario de usuario que se extiende mediante la adición de la propiedad Height, entre otros miembros.

Es probable que tenga que recurrir a declarar su parámetro de función como objeto.

Public Sub Addcontrols(iNum as integer, oForm as Object)

Esto debería funcionar como se desee, aunque por desgracia se le sacrificar la seguridad de tipos. La mayoría de los conceptos orientados a objetos tienden a desmoronarse en el contexto de VBA.

Otros consejos

Lo primero y más importante que debe recordar acerca de VBA es que es cuasi-OO, no está lleno-OO. Me he encontrado con muchos problemas extravagantes en todo este asunto y por lo que ahora tienden a evitar depender totalmente de la consistencia de VBA.

Una vez dicho esto, pruebe esto:

Dim fname = oForm.Name (or whatever the property is for this subobject)
With VBA.UserForms.Add(fname)
   .Height = x
   .Show
End With

No es tan gratamente extraño?!?! No tengo un ejemplo de código listo y en espera, así que no puedo garantizar el éxito, pero esto se siente como el enfoque correcto.

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