Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Error: cannot access a disposed object named ... (https://www.clubdelphi.com/foros/showthread.php?t=65533)

Tauro78 23-12-2009 00:23:04

Error: cannot access a disposed object named ...
 
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.

Código Delphi [-]
private void treeView1_DoubleClick(object sender, System.EventArgs e)
  {
   if (treeView1.Nodes[0].Nodes[2].Nodes[0].IsSelected)
   {
     frmCuentasAltas frmCA = frmCuentasAltas.InstanciaSingleton();
     frmCA.Show();
     frmCA.Owner = this;
   }

En el formulario hijo (frmCuentasAltas) uso creo el Singleton

Código Delphi [-]
private static frmCuentasAltas instanciaSingleton = null;
  public static frmCuentasAltas InstanciaSingleton()
  {
   if (instanciaSingleton == null)
   {
    instanciaSingleton = new frmCuentasAltas();
   }
   return instanciaSingleton;
  }
 
  private frmCuentasAltas()
  {
   //
   // Required for Windows Form Designer support
   //
   InitializeComponent();
   //
   // TODO: Add any constructor code after InitializeComponent call
   //
  }

Son formularios MDI.

Desde ya muchas gracias.

Crandel 23-12-2009 14:20:11

Obviamente como dice el error y supones el formulario ya no existe. Al cerrar el formulario lo que estas haciendo es destruir la instancia. El problema surge que tu instanciaSingleton no se entera.

Entonces tenes dos soluciones:

1. En el Dispose del formulario avisarle que ya no existe asi:

Código Delphi [-]
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
            instanciaSingleton = null;
        }

2. No dejar que se cierre, solo ocultarla. En el evento FormClosing lo cancelas. De esta forma sólo se creara una vez el formulario.

Código Delphi [-]
        private void frmCuentasAltas_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            Hide();
        }

Suerte

Tauro78 23-12-2009 23:29:09

gracias por la respuesta, no he probado las opciones, pero he aplicado algo que se parece mas a la primer opcion y me funciona, gracias.

Código Delphi [-]
 
 
public static frmCuentasAltas InstanciaSingleton()
  {
   if (instanciaSingleton == null)
   {
    instanciaSingleton = new frmCuentasAltas();
   }
   if (instanciaSingleton != null && instanciaSingleton.IsDisposed)
   {
    instanciaSingleton = null;
    instanciaSingleton = new frmCuentasAltas();
   }
   
   return instanciaSingleton;
  }

Crandel 24-12-2009 08:23:16

Puedes simplificar tu condigo obteniendo la misma respuesta asi:

Código Delphi [-]
  public static frmCuentasAltas InstanciaSingleton()
  {
    if (instanciaSingleton == null || instanciaSingleton.IsDisposed)
    {
      instanciaSingleton = new frmCuentasAltas();
    }
   
    return instanciaSingleton;
  }


La franja horaria es GMT +2. Ahora son las 22:42:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi