Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
Exclamation 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.....
Responder Con Cita
  #2  
Antiguo 11-12-2007
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
Hola, en el evento OnCLose del form Child pones lo siguienteÑ

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

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #3  
Antiguo 11-12-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
En el evento OnClose del formulario a cerrar pon lo siguiente:

Código:
Action:= caFree;
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
  #4  
Antiguo 11-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
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 ????
Responder Con Cita
  #5  
Antiguo 11-12-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
¡Vaya! Mi computador va lento y se queda un poco pillado!!!

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?
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
  #6  
Antiguo 11-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 11-12-2007
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: may 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 21
enecumene Va por buen camino
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.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #8  
Antiguo 11-12-2007
citlalliDgp citlalliDgp is offline
Miembro
 
Registrado: oct 2007
Posts: 38
Poder: 0
citlalliDgp Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 11-12-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
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...
Responder Con Cita
  #10  
Antiguo 11-12-2007
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
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
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Como llamar form desde otros form y regresar a la linea que se estaba ejecutando Willy Rodrigo C++ Builder 1 03-08-2007 20:36:23
Eliminar ciertos datos de la memoria RAM dec Seguridad 63 30-03-2007 04:42:29
Error de memoria al llamar otra form dmagui Conexión con bases de datos 18 26-09-2005 23:43:27
eliminar opcion de eliminar en un dbgrid morfeo21 Varios 3 14-07-2005 18:05:32
Eliminar del memoria los querys Aura OOP 4 01-04-2004 18:40:40


La franja horaria es GMT +2. Ahora son las 13:49:05.


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