Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > .NET
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-12-2009
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
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.

Última edición por Tauro78 fecha: 23-12-2009 a las 00:27:00.
Responder Con Cita
  #2  
Antiguo 23-12-2009
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 23-12-2009
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
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;
  }
Responder Con Cita
  #4  
Antiguo 24-12-2009
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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;
  }
__________________
[Crandel]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
error Named Pipes Provider nfrfabian Conexión con bases de datos 0 10-10-2007 19:39:15
Sobre error "Object reference not set to an instance of an object" fer21unmsm .NET 2 11-05-2007 21:56:46
Error A component Named Matri already Exists janlo Varios 5 28-07-2006 07:16:39
Error en Consulta: 'could not find object' rocio84 SQL 4 18-04-2006 01:56:58
Error: object not found shaktale SQL 0 03-07-2003 16:40:37


La franja horaria es GMT +2. Ahora son las 21:38:35.


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
Copyright 1996-2007 Club Delphi