Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eliminar De Memoria Form Mdi (https://www.clubdelphi.com/foros/showthread.php?t=51288)

citlalliDgp 11-12-2007 19:30:36

Eliminar De Memoria Form Mdi
 
Hola amigos expertos, me encuentro aqui nuevamente necesitando de su ayuda. Mi priblema es el siguiente:

Estoy manejando forms del tipo MDI. Tengo un form fsMDIForm que es el principal de mi aplicación. Desde el cual invoco otros forms del tipo fsMDIChild. El problema es que cuando cierro uno de los forms fsMDIChild, y luego intento abrirlo de nuevo desde el form principal me arroja un error que dice mas o menos "Acces violation at address....". Probablemente la razón por la que me aparese este error sea por que no estoy eliminando de la memoria el form hijo que creo cuando lo invoco. La cuestión es, cómo puedo asegurarme de que cuando cierro un form fsMDIChild, éste se elimine de la memoria, para de ésta manera, cuando trate de volverlo a invocar me permita simplemente volverlo a crear.

Alguien podría ayudarme por favor.....:)

enecumene 11-12-2007 19:36:23

Hola, en el evento OnCLose del form Child pones lo siguienteÑ

Código Delphi [-]
Action := caFree;

Saludos.

Gabo 11-12-2007 19:42:12

En el evento OnClose del formulario a cerrar pon lo siguiente:

Código:

Action:= caFree;

citlalliDgp 11-12-2007 19:49:42

Hola enecumene, gracias por tu atencion. La instruccion que me dices ya la he utilizado, pero pensé que algo mas me hacía falta, por que despues de que cierro el form no puedo volver a abrirlo. Entonces, creo que el problema es otro, mira, te voy a explicar. Desde el form principal donde invoco el form "Registrar Productos" (por mencionar un ejemplo), he puesto este código:

Código Delphi [-]
procedure TForm2.Proveedores1Click(Sender: TObject);
begin
if not Assigned(Form4) Then
    Application.CreateForm(TForm4, Form4)
else
    Form4.BringToFront;
end;

Esto con la finalidad de validar que una vez que el form 'Registrar Productos' haya sido invocado, si el usuario intenta invocarlo de nuevo, no me cree otro form nuevo. De lo contrario cada vez que el usuario repita esta acción se estaria creando un form. Crees que sea por esto que no me permite volver a crear el form cuando lo cierro ????

Gabo 11-12-2007 19:49:46

¡Vaya! Mi computador va lento y se queda un poco pillado!!! :p

Por cierto, en éste post de uno de los hilos que has abierto para tratar el tema, te indiqué un artículo de la wikipedia para que leyeras, donde se explica esta cuestión. ¿Lo has leído?

citlalliDgp 11-12-2007 19:57:02

Hola Gabo, claro que leí el articulo que me recomendaste. Pero pensé que algo me estaba haciendo falta, es por eso que realizo esta consulta.

enecumene 11-12-2007 20:41:23

Hola, intentaste de esta forma?:

Código Delphi [-]
procedure TForm2.Proveedores1Click(Sender: TObject);
begin
Application.CreateForm(TForm4, Form4);
Form4.Show;
end;
o

Código Delphi [-]
procedure TForm2.Proveedores1Click(Sender: TObject);
begin
Form4:=TForm4.Create(self);
Form4.Show;
end;

Saludos.

citlalliDgp 11-12-2007 20:49:31

Las dos opciones que me diste me funcionan, enecumeme. Y cada vez que cierro el form, puedo volverlo a abrir. El problema es, que no puedo evitar que cada vez que invoque el form "Registrar Productos" (por ejemplo), me esté abriendo o creando una nueva ventana. Es ésto lo que no puedo solucionar.

maeyanes 11-12-2007 21:16:04

Hola...

El problema que puedes tener es que cuando la variable Form4 después de destruir la forma no queda apuntando a nil, así que al hacer:

Código Delphi [-]
if not Assigned(Form4) then

la segunda vez, esta te devolverá falso...

Para corregir esto puedes hacer algo como esto en Form4

Agregas el evento OnDestroy:

Código Delphi [-]
procedure TForm4.OnDestroy(Sender: TObject);
begin
  Form4 := nil
end;

Saludos...

yusnerqui 11-12-2007 21:32:15

Esto es una adaptación de un código que tenía en una aplicación mdi, que a la ves es una adaptación de un código que saqué de la cara oculta del delphi 4 que trata sobre el tema.

Te sujiero que busques en ese libro si lo de abajo no te funciona.
Código Delphi [-]
Procedure TPrincipal.BuscaForma;
var i : Byte;
begin
 if MDIChildCount > 0 then
   for i := MDIChildCount -1 downto 0 do
     if MDIChildren[i] is TForm4 then     
       begin        
         TForm4(MDIChildren[i]).Show;
         Exit;
       end;
Form4:=TForm4.Create(Application)
end;

Saludos


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

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