Tema: mas de mdi
Ver Mensaje Individual
  #2  
Antiguo 02-03-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
  1. La naturaleza de esta pregunta va más allá del concepto de formularios MDI. En general cuando quieres asegurarte de que un objeto se destruye aún ante la eventualidad de una excepción, debes usar finally en lugar de except:

    Código Delphi [-]
    try
      VerDatos := TFVerDatos.Create(Self);
    
      { más código }
    
    finally
      VerDatos.Free;
    end;

    Nota que requieres una variable (VerDatos) que apunte al objeto creado para poder llamar al método Free.

    Si además requieres manejar una excepción puedes anidar los bloques:

    Código Delphi [-]
    try
      VerDatos := TFVerDatos.Create(Self);
    
      try
        { más código }
      except
        { manejo de la exepción }
      end;
    finally
      VerDatos.Free;
    end;
  2. No me queda claro quién crea a quién pero lo que realmente necesitas saber es el mecanismo que utilizan los descendientes de TComponent (como los formularios) para la destrucción de objetos.

    Cuando construyes un descendiente de TComponent le pasas al constructor el "Owner" de la componente. Este "Owner" o dueño de la componente es otro objeto descendiente de TComponent que se encargará de destruir al objeto. Básicamente lo que sucede es que el "Owner" agrega la componente recién creada a una lista interna de componentes (el arreglo Components). Cuando el "Owner" se destruye (por el método que sea), repasa su lista de componentes llamando al destructor de cada una.

    En tú caso, al pasar Self como parámetro (Self se refiere al formulario en sí) éste se convierte en el "Owner" del formulario hijo y por tanto se encarga de destruirlo.

    Sin embargo nota que tú dices "si form1 se cierra con form2 abierto...". Y el verbo cerrar no implica necesariamente que form1 se destruya. Si se destruye entonces sí se libera form2 pero si simplemente se oculta entonces form2 quedará en memoria hasta que form1 sea destruído.

  3. No está clara tu pregunta. form1.MDIChildCount sólo es válido- como es de suponerse -cuando form1 es MDIForm- únicamente los MDIForm pueden tener MDIChild.

  4. En el momento en que un formulario se muestra con ShowModal no puedes acceder a ningún formulario previamente abierto pero desde el que se abre puedes abrir otros formularios que si podrás acceder.

// Saludos
Responder Con Cita