Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-12-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Error al abrir un formulario

Buenas a todos.

Tengo una aplicación en D6, con Firebird como base de datos, es una aplicacióm MDI y tengo un problema que no siempre se produce, lo cual no me ayuda en nada en aislarlo.

Ejecuto en Main Form (MDI), desde allí llamo a un Form child con la siguiente instruccion:

Código Delphi [-]
 
F_Parcs:=TF_Parcs.Create(self);

Este form tiene un JVDbgrid con una serie de registros de un Dataset, si hago doble click en una linea del Grid, esto me llama a un nuevo form con la siguiente sintaxis:

Código Delphi [-]
 
F_Camions:=TF_Camions.Create(Application);
F_ModulDades.Camions.Locate('ID',Camions_ParcID.Value,[]);

La primera vez que hago un doble click, abre sin ningun problema el form, pero a veces cuando llamo a un segundo registro desde el mism grid, despues de haber cerrado el primero

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

me lanza un error de access violation at adress....

Alguien me puede hacer un F1 con este prolema?

Gracias por adelantado

Josep
Responder Con Cita
  #2  
Antiguo 26-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Agregá en a tus forms MDIChilds el evento OnDestroy con la siguiente línea:

Código Delphi [-]
procedure TNombreDelForm.FormDestroy(Sender: TObject);
begin
  NombreDelForm:= nil;
end;

Ya que con
Código Delphi [-]
Action:= caFree
no estás destruyendo inmediatamente el form, solo le estás indicando a Windows que puede disponer de la memoria ocupada por dicho form
cuando él lo considere necesario.

También podés destruirlo en el evento OnClose:
Código Delphi [-]
procedure TNombreDelForm.FormClose(Sender: TObject; var Action: TCloseAction);;
begin
  Action:= caFree;
  NombreDelForm:= nil;
end;

Pero me parece que el evento OnDestroy es más adecuado.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 29-12-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Gracias Ecfisa.

He probado tus indicaciones y funciona, no da el error de access violation, pero ahora lo que pasa es que el form queda minimizado y no se destruye.

Esto es correcto?

Debo poner algo más?

Es que si le pongo el action:=cafree y el form:=nil en el onclose sigue fallando.

Saludos

Josep
Responder Con Cita
  #4  
Antiguo 29-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jafera.

Por favor, aclarame dos dudas:
. ¿ F_Camions es MDIChild ?
. ¿ Podrías poner el trozo de código donde lo creas y mostras? (Show/ShowModal)


Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 29-12-2010 a las 12:40:40.
Responder Con Cita
  #5  
Antiguo 29-12-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Gracias Ecfisa.

El metodo de llamada es el que puse en el primer post del hilo

Código Delphi [-]
 
procedure TF_Parcs.JvDBGrid1DblClick(Sender: TObject);
begin
        F_Camions:=TF_Camions.Create(Application);
        F_ModulDades.Camions.Locate('ID',Camions_ParcID.Value,[]);
end;

Veo que tras las pruebas el problema sigue siendo en action:=caFree, con el destroy a nil funciona bien pero no me lo cierra.

El form style es fsMDIChild

Saludos

Josep
Responder Con Cita
  #6  
Antiguo 29-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola jafera.

Llamando a F_Camions desde F_Parcs de este modo:
Código Delphi [-]
...
procedure TF_Parcs.MostrarChild(FrmClass: TFormClass);
var
  i: Integer;
begin
  for i:= 0 to Screen.FormCount -1 do
    if Screen.Forms[i] is FrmClass then
    begin
      Screen.Forms[i].WindowState:= wsNormal;
      Screen.Forms[i].BringToFront;
      Exit;
    end;
  with FrmClass.Create(Application) do Show;
end;

procedure TF_Parcs.DBGrid1DblClick(Sender: TObject);
begin
  MostrarChild(TF_Camions);
end;

Y teniendo en F_Camions:
Código Delphi [-]
...
procedure TF_Camions.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= caFree;
end;

procedure TF_Camions.FormDestroy(Sender: TObject);
begin
  F_Camions:= nil;
end;
No tendrías que tener ningun inconveniente.

Para salir de toda duda hice la prueba y el form se cierra correctamente sin arrojar ninguna excepción.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 29-12-2010 a las 14:49:06.
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
Abrir Formulario MDI b1ast3r OOP 2 08-04-2008 18:18:59
Error al abrir un formulario narrolaso Impresión 3 04-04-2008 18:29:54
Error Class TExtendEdit not found al abrir un formulario Iges Varios 4 26-10-2007 06:10:58
formulario abrir, cerrar arespremium OOP 3 14-08-2007 09:06:21
Error abrir formulario molina669 Varios 1 07-11-2005 11:49:33


La franja horaria es GMT +2. Ahora son las 10:14:41.


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