Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   mas de mdi (https://www.clubdelphi.com/foros/showthread.php?t=19007)

pablo 02-03-2005 00:14:10

mas de mdi
 
dudas
-----

1) teniendo este codigo
try
TFVerDatos.Create(self);
except
???
end;

en ?? quiero indicar que se haga un free si algo falla; no uso
una variable ( var := TFVerDatos.Create(self)) porque quiero q se cree un form
independiente cada vez q ejecuto el codigo... como puedo hacer?

2)a) tengo un form (form1) q es mdichild de un form parent, a su vez este form tien otro mdichild
creado con .create(self) (form2); si form1 se cierra con form2 abierto, form2 se libera o simplemente se cierra?

B) porque al hacer form1.mdichildCount no me cuenta los form2 que tengo abiertos?, tambien observo que no me toma
a form2 como hijo de form1, salvo que ponga form1.fStyle = MDIForm, pero siendo asi, no seria child de el form principal....
como puedo hacer?

3) puedo hacer showmodal de un form pero solamente para que no le devuelva el control a su padre;
pero sí poder usar otros forms ?

roman 02-03-2005 01:32:51

  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


La franja horaria es GMT +2. Ahora son las 04:56:38.

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