Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2012
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Aquí hay muchas cosas involucradas, y como dice el amigo maeyanes, si no pones un poco de código, no podemos ayudarte más que dando palos de ciego.

Se me ocurre una cosa (así a bote pronto), y es que:

1º) Si los creas a medida que se necesitan, lo más común es usar código del siguiente estilo, para crearlo Y DESTRUIRLO:

Código Delphi [-]
with TMiFormQueNecesito.Create(nil) do begin
  try
    //Lo que hagas con ese form.
    ShowModal(); //o Show o lo que sea...
  finally
    Free;
  end;
end;

Fíjate que el Owner del form es nil, ya que lo destruimos manualmente.

2º) Al cerrar un formulario, pues eso, sólo se cierra, no se destruye. Por tanto, si tienes un botón (o menú item o event handler en general) que haga lo que indicas:

Código Delphi [-]
TForm5.Create(Application).ShowModal;

Al cerrar el form, éste no se destruirá, sólo se cerrará. Se destruirá al salir de la aplicación. Te remito al apartado 1º para ver cómo crearlos y destruirlos de golpe.

3º) Si lo que quieres es que se comporte como se indica en el apartado 2º, entonces deberías guardar el form en una variable y crearlo una única vez:

Código Delphi [-]
  if not assigned(FMiForm) then
    FMiForm:=TForm5.Create(Application);
  FMiForm.ShowModal;

4º) Por supuesto que si creas un form con Owner Application, entonces NO debes destruirlo al cerrar la aplicación. Ya se encargará de eso la VCL. En el ejemplo del apartado anterior, NO debes destruir FMiForm.
Si quieres controlar tú cúando destruirlos, entonces créalos con Owner=nil y al cerrar la aplicación los destruyes.

Espero ayudarte, pero sin más datos, poco más se puede hacer.

Un saludo,
LoPiTaL
Responder Con Cita
  #2  
Antiguo 30-05-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
El problema es que estás poniendo a NIL el valor de form5, a lo que te da el error al mandar el CLOSE porque vale NIL.

Mi consejo es, llama a Form5.Close, y en el evento Onclose del formulario haces el Form5 := NIL;

Código Delphi [-]
if (Form5 <> nil) then begin
    DataModule2.queryLogin.Close;
    Form5.Close;
  end;

Procedure Form5.Onclose(SENDER : TObject);
begin
   Form5 := NIL;
end;
Responder Con Cita
  #3  
Antiguo 30-05-2012
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Perdona, no había visto tu último post!!
Edito: champy se me adelantó

Evidentemente, el código que has puesto no te va a funcionar (supongo que será al escribirlo en el navegador, pero por si acaso...):

Código Delphi [-]
if (Form5 <> nil) then begin
    DataModule2.queryLogin.Close;
    Form5:=nil;
    Form5.Close;
  end;

¡¡¡pones a nil el formulario antes de destruirlo!!!!

Debe ser de la siguiente forma, incluyendo código para destruirlo, de tal forma que cuando pulses el botón TIENES que volver a crearlo:

Código Delphi [-]
if (Form5 <> nil) then begin
    DataModule2.queryLogin.Close;
    Form5.Close;
    Form5.Free;
    Form5:=nil;
  end;

o alternativamente:

Código Delphi [-]
if (Form5 <> nil) then begin
    DataModule2.queryLogin.Close;
    Form5.Close;
    FreeAndNil(Form5);
  end;

Pero ya te digo, que lo más "elegante" es usar la opción 1 que te planteaba en el anterior post, creas el form cuando lo muestres, haces lo que sea con él (ShowModal, etc, etc...), cuando pulsas el botón ese de cerrar SÓLO llamas a Close, en el evento FormClose de este formulario cierras el DataModule, y cuando regrese del ShowModal, entonces se hace el Free.
Resumiendo:

Código Delphi [-]
//En Formulario principal

procedure TMainForm.OnClickDeMiBotónDeMostrarFormulario(Sender: TObject);
begin
  with TMiFormQueNecesito.Create(nil) do begin
    try
      //Lo que hagas con ese form. Concretamente, aquí le podrías pasar variables del main a este form para que haga lo que sea con ellas (si necesita alguna)
      ShowModal(); //o Show o lo que sea para que se muestre, ya con las variables que necesite inicializadas
      //Lees las variables que necesites (si necesitas alguna) del form
    finally
      //Finalmente destruimos el form
      Free;
    end;
  end;
end;

//En el formulario secundario
procedure TMiFormQueNecesito.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //Aquí todo lo que tenga que hacer al cerrarse. Si tienes que hacer un Showmessage, debe ser aquí, NO en el formDestroy, ya que en el formDestroy ya no se puede cancelar el
  //cierre del formuario, y aquí sí.
  DataModule2.queryLogin.Close;
end;

procedure TMiFormQueNecesito.OnButtonClick(Sender: TObject);
begin
  //Evento al hacer click en ese botón tuyo para cerrar.
  Close;
end;

Fíjate que he separado lo que tú haces en el botón de cerrar en dos métodos FormClose y el evento de cerrar. ¿Por qué? Porque si cierras el formulario SIN pulsar el botón (por ejemplo Alt+F4), entonces no cerrarías el dataModule, y de ésta forma sí.

Una última cosa.

Si creas y destruyes formularios manualmente, te recomiendo que borres las variables que Delphi crea automáticamente al añadir un formulario nuevo al proyecto, como por ejemplo las del estilo Form1, Form2, etc... Así no te liarán, ya que estas variables las usa Delphi para crearte el formulario por tí, no para que tú lo hagas por Delphi.

Espero haberte ayudado.

Un saludo,
LoPiTaL

Última edición por LoPiTaL fecha: 30-05-2012 a las 22:56:31.
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
Access violation al cerrar un formulario elaguna Varios 2 12-11-2010 19:35:46
Access Violation al cerrar .exe mArTaLF Varios 3 16-10-2007 09:11:37
Cerrar forms de manera independiente coleleon OOP 8 01-12-2005 22:54:15
Access Violation al cerrar ClientSocket auveele Internet 0 15-11-2004 00:39:53
Cerrar Forms javiermorales OOP 3 30-06-2003 10:29:32


La franja horaria es GMT +2. Ahora son las 14:50:30.


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