PRB: Obtener acceso a propiedad de evento Initialize produce un bucle infinito

Seleccione idioma Seleccione idioma
Id. de artículo: 171979 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Si una propiedad de un objeto se hace referencia en su propio inicializar el evento, Visual Basic se desencadenará el evento Initialize para ese objeto para que se pueden crear instancias de. Dará como resultado una recursividad infinita hasta que se ejecuta el espacio de pila y recibirá el siguiente error:
Error en tiempo de ejecución '28':
Espacio de pila insuficiente
Esto ocurrirá para "integrados" objetos, tales como formularios y objetos creados mediante las clases de Visual Basic.

Causa

Poder tener acceso a una propiedad de un objeto, se debe inicializar el objeto. Esto es, de hecho, el objetivo del evento Initialize; permite al desarrollador colocar el objeto en un estado satisfactorio Inicializando datos privadas antes de que se invocan las propiedades y métodos del objeto. Las propiedades y métodos que tenga que dependen de los datos internos del objeto está en un estado estable.

Por consiguiente, el evento Initialize debe completarse antes de una propiedad o método de un objeto puede obtener acceso y, por lo tanto no es inesperado que se desencadena el evento Initialize nuevo cuando se hace referencia a una propiedad en el evento Initialize.

Solución

Si intenta establecer una propiedad de un objeto integrado de Visual Basic, a continuación, es posible hacer referencia a la propiedad en un evento que se produce después de que el evento Initialize. Por ejemplo, en lugar de establecer el título de un formulario en el evento Initialize, establecer en el evento de carga o el evento Activate.

Una alternativa a hacer referencia directamente a Form1, que es un puntero de objeto global, es usar palabra clave. Cuando haga referencia directamente a Form1 en el evento Initialize del formulario, el objeto global Form1 no se ha creado para que Visual Basic intenta crear instancias de ella. Este proceso hace que la recursividad infinita. Utilice la palabra clave Me para evitar este recursividad.

Si está intentando definir una propiedad para un objeto creado con módulos de clase en Visual Basic, puede ser apropiado crear un método para inicializar datos o establecer valores iniciales de las propiedades, para el que el programa cliente sería responsable de la llamada después de crear instancias de un objeto. (Quizás un buen ejemplo análogo de esto es la función API de OLE OLEInitialize, qué cliente programas escritos en C explícitamente deben llamar a antes de utilizar servicios OLE).

Otra forma de hacerlo es establecer los datos privados en el que se basa una propiedad en el evento Initialize. Por ejemplo, si una propiedad de Visual Basic de una clase utiliza un miembro de datos privados así:
   Private lPrivProp1 As Long

   Public Property Get lProp1() As Long
   lProp1 = lPrivProp1
   End Property

   Public Property Let lProp1(vNewValue As Long)
   lPrivProp1 = vNewValue
   End Property
				
entonces en el evento Initialize del módulo de clase que contiene esta propiedad, no es adecuado para probar y establecer la propiedad pública de la clase, sino establecer el miembro de datos privada en un valor.

Estado

Esto es así por diseño.

Nota : ha cambiado el comportamiento con las versiones 5.0 y 6.0 de Visual Basic. Ya no recibe el error en tiempo de ejecución al tener acceso a la propiedad de un objeto en el evento Initialize de un formulario. Sin embargo, todavía se recomienda que continúe utilice los eventos Load o Activate de un formulario a propiedades de acceso de objetos en lugar del evento Initialize.

Más información

Pasos para reproducir el problema

  1. Inicie un proyecto nuevo de Visual Basic. Se creará Form1 de manera predeterminada.
  2. En el evento Initialize de Form1, agregue la siguiente línea de código:
          Form1.Caption = "Hello world"
    						
  3. Ejecute el proyecto presionando la tecla F5. Finalmente, Visual Basic se ejecutará fuera de espacio de pila.

Pasos para evitar el problema

  1. Inicie un proyecto nuevo de Visual Basic. Se creará Form1 de manera predeterminada.
  2. En el evento Initialize, coloque la siguiente línea de código:
          Me.Caption = "Hello world"
    						
  3. Ejecute el proyecto presionando la tecla F5. Debería aparecer el formulario con un título "Hello World".

Propiedades

Id. de artículo: 171979 - Última revisión: sábado, 22 de febrero de 2014 - Versión: 4.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic 6.0 Edición de aprendizaje
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
Palabras clave: 
kbnosurvey kbarchive kbmt kbprb KB171979 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 171979

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com