Ir al contenido



Foto

Error: cannot access a disposed object named ...


  • Por favor identifícate para responder
4 respuestas en este tema

#1 tauro78

tauro78

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 22 diciembre 2009 - 08:13

hola, quisiera saber si me pueden ayudar en lo siguiente:

tengo una forma principal con un treeview a traves del cual llamo a un formulario hijo. Uso el patron Singleton para que solo haya una instancia.
El problema es que si abro y cierro y luego intento abrir nuevamente el formulario hijo me muestra este error: cannot access a disposed object named 'frmCuentasAltas'.
Supuestamente es porque el objeto referenciado ya no existe.

Uso el siguiente codigo:

Desde el formulario padre llamo al formulario hijo.


csharp
  1. private void treeView1_DoubleClick(object sender, System.EventArgs e)
  2.   {
  3.   if (treeView1.Nodes[0].Nodes[2].Nodes[0].IsSelected)
  4.   {
  5.     frmCuentasAltas frmCA = frmCuentasAltas.InstanciaSingleton();
  6.     frmCA.Show();
  7.     frmCA.Owner = this;
  8.   }



En el formulario hijo (frmCuentasAltas) uso el Singleton


csharp
  1. private static frmCuentasAltas instanciaSingleton = null;
  2.   public static frmCuentasAltas InstanciaSingleton()
  3.   {
  4.   if (instanciaSingleton == null)
  5.   {
  6.     instanciaSingleton = new frmCuentasAltas();
  7.   }
  8.   return instanciaSingleton;
  9.   }
  10.  
  11.   private frmCuentasAltas()
  12.   {
  13.   //
  14.   // Required for Windows Form Designer support
  15.   //
  16.   InitializeComponent();
  17.   //
  18.   // TODO: Add any constructor code after InitializeComponent call
  19.   //
  20.   }



Son formularios MDI.

Desde ya muchas gracias.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.438 mensajes
  • LocationMéxico

Escrito 22 diciembre 2009 - 08:16

Hola

Aunque no se mucho de C, me parece que esto debería ser al revés.



delphi
  1.     frmCuentasAltas frmCA = frmCuentasAltas.InstanciaSingleton();
  2.     frmCA.Owner = this;
  3.     frmCA.Show();



Es decir, primero asignas y luego muestras.

Salud OS
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.621 mensajes
  • LocationMadrid - España

Escrito 23 diciembre 2009 - 01:35

Aquí parece que está el poblema:


cpp
  1. private void treeView1_DoubleClick(object sender, System.EventArgs e)
  2.   {
  3.   if (treeView1.Nodes[0].Nodes[2].Nodes[0].IsSelected)
  4.   {
  5.     frmCuentasAltas frmCA = frmCuentasAltas.InstanciaSingleton();
  6.     frmCA.Show();
  7.     frmCA.Owner = this;
  8.   }



Declaras una variable del tipo frmCuentasAltas. Esta variable existirá sólo en el ambito de la función reeView1_DoubleClick que al terminar la destruirá. Como sólo puede existir una instancia de la clase frmCuentasAltas, no puedes volverla a declarar y crear otra, por lo tanto la segunda vez que se ejecute no existirá ninguna instancia.

O bién accedes al puntero private static frmCuentasAltas instanciaSingleton, cosa imposible pues lo declaraste privado, o bien creas un método de la clase frmCuentasAltas para recuperar el puntero dicho si existe, o tal vez puedas usar una variable global frmCA como una instancia frmCuentasAltas válida.

Saludos.
  • 0

#4 raultr

raultr

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 23 diciembre 2009 - 01:51

Prueba poniendo asi tu instancia:



cpp
  1. public static frmCuentasAltas InstanciaSingleton()
  2.   {
  3.   if (instanciaSingleton == null || !instanciaSingleton .IsHandleCreated)
  4.  
  5.   {
  6.     instanciaSingleton = new frmCuentasAltas();
  7.   }
  8.   return instanciaSingleton;
  9.   }


  • 0

#5 tauro78

tauro78

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 24 diciembre 2009 - 12:01

gracias por las respuestas, use la siguiente opcion:



csharp
  1. public static frmCuentasAltas InstanciaSingleton()
  2.         {
  3.             if (instanciaSingleton == null || instanciaSingleton.IsDisposed)
  4.             {
  5.                 instanciaSingleton = new frmCuentasAltas();
  6.             }
  7.             return instanciaSingleton;
  8.         }


  • 0