2009-09-08 6 views
5

Estoy intentando compilar una aplicación VB6, pero falla con el error "Error en tiempo de ejecución '91': variable de objeto o con variable de bloque no establecida". Resulta que el evento Resize de un control de usuario se activa durante la compilación y el código de llamada que intenta acceder a un objeto que aún no se ha instanciado.¿Por qué se activa un evento durante la compilación de una aplicación VB6?

¿Por qué se activa un evento durante la compilación y hay alguna forma de detenerlo?


Editar: Tenía un cierto código aquí, pero no es relevante. El problema se debe al hecho de que el código UserControl (es decir, los eventos Initialize, ReadProperties, Resize y WriteProperties) se puede ejecutar en momentos inesperados. Si el código en estos eventos se basa en otro código para inicializar cualquiera de sus estructuras de datos, hay una buena probabilidad de que falle porque ese código de inicialización puede no haberse ejecutado. ¡Especialmente durante la compilación cuando se supone que no se debe ejecutar nada! Llamaría a esto un error, pero estoy seguro de que Microsoft puede racionalizarlo de alguna manera.

+1

¿Apunta a un bloque específico de código en su compilación (bajo depuración)? Si es así, ¿puedes pegarlo aquí? Además, ¿estás seguro de que no estás "Construyendo y Funcionando" lo que provocaría su construcción y luego se dispararía cuando intente correr (por lo tanto, el error de tiempo de ejecución)? – JasCav

Respuesta

6

Aquí es un buen artículo sobre el Ciclo de Vida de los eventos de control de usuario

Understanding Control Lifetime and Key Events

He aquí un fragmento de

Compilación del Proyecto

Cuando el proyecto se compila en un aplicación o componente, Visual Basic carga todos los archivos de formulario de forma invisible, uno tras otro, para escribir la información que contienen en el archivo compilado . Una instancia de control obtiene los eventos Initialize, ReadProperties y WriteProperties. La configuración de propiedades del control se compila en el ejecutable terminado.

No menciona el cambio de tamaño (que ocurre durante el tiempo de ejecución o cuando cambia físicamente el tamaño del control de usuario en un contenedor en tiempo de diseño). ¿Tal vez su evento Initialize está redimensionando el control del usuario?

Para evitar el error se puede comprobar si el objeto infractor ha sido creado antes de hacer nada:

If Not Object Is Nothing then 
    do something 
+0

Otro fragmento dice: * Cada vez que un usuario ejecuta la aplicación o componente instalado y se carga el formulario, el control recibe Initialize, ReadProperties y resize events. * Si los formularios se cargan de manera invisible, eso explicaría por qué este evento se está disparando. . – raven

1

Creo que algunos eventos para controles de usuario se ejecutan durante el tiempo de diseño, al menos con el propósito de renderizarlos de manera consistente.

+0

En el caso de controles de usuario, esto incluye UserControl_Initialize() ... que puede desencadenar eventos. – Brian

+0

Pueden hacer mucho más que eso. Vea la propiedad EditAtDesignTime de un UserControl. – Bob77

Cuestiones relacionadas