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 11-04-2006
chileno chileno is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
chileno Va por buen camino
como cerrar una Form?

hola a todos¡¡¡

tengo uan duda, ahi le va....

tengo un ficha madre "Ficha1" que llama en el evento onShow a la ficha "Ficha2", la ficha2 esta en modo ShowModal, por lo tanto solo se visualiza la ficha2, para pasar el control a la ficha1 o su visualizacion , la ficha 2 debe cerrarse en modo mrOK...no se si me entienden...este el el codigo que tengo:
Código Delphi [-]
  
procedure TFicha1.FormShow(Sender: TObject);
begin
    with TFicha2.Create(Self) do
    try
        if not (ShowModal =mrOk) then
        begin
            Ficha1.Close; // es aca donde me aroja un error de violacion de mem.
                              // puede ser que no se puede cerrar porque todavia no es visible...
                              // como puedo matar ficha1
        end;
    finally
        Free;
    end;
end;
ficha1 no es la principal de proyecto osea es llamada antes por otra from....
ya chau...y gracias...

Última edición por chileno fecha: 11-04-2006 a las 14:33:48.
Responder Con Cita
  #2  
Antiguo 11-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En la forma 2 pones dos TBitBtn, uno con su propiedad ModalResult a mrOk y el otro boton con MrCancel.

Por cierto, estas creando el 2 y cerrando el 1, por eso da el access violation.
no tienes que cerrarlo. los BitBtn se encargan de ello.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 11-04-2006 a las 14:57:44.
Responder Con Cita
  #3  
Antiguo 11-04-2006
Kosmo Kosmo is offline
Miembro
 
Registrado: abr 2006
Posts: 21
Poder: 0
Kosmo Va por buen camino
No se si será porque al crear el Form2 no se libera éste de memoria.

Prueba a hacer un Form2.Free antes de cerrar el 1.

De todas formas, si es porque no se puede cerrar el Form1 porque aun no esta visualizado, puedes incluir un TTimer en el formulario Form1 que se active despues de 1 segundo y que éste te lo cierre.

Código Delphi [-]
if not (ShowModal =mrOk) then
        begin
            Timer1.Enable:=TRUE;
end;
 
...

Y en el Timer1 le pones 100 milisegundos o asi y le pones en el OnActivate el Form1.Close
Responder Con Cita
  #4  
Antiguo 11-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No creo que el Formshow sea el evento apropiado.

crea un método en Ficha1
Código Delphi [-]
procedure TFicha1.Consultar;
var Cerrar :Boolean;
begin
   Cerrar := false;
    with TFicha2.Create(Self) do
    try
        if not (ShowModal =mrOk) then
        begin
            Cerrar := true;
        end;
    finally
        Free;
    end;
  if cerrar then Release // cerrar la ventana desde un método de la misma.
  else Show;

Ahora solo tienes que crear la ficha1, llamar al método Consultar (que ya le pondrás un nombre más apropiado) y tienes todo resuelto.

Tambien podría ser una función, así la ventana que llama a Ficha1.Consultar pueda saber si Ficha1 está abierta o cerrada.

Al menos delphi, desde el mismo evento Onshow no te deja ocultar la propia ventana con Ficha1.Hide. No he probado a destruirla.

saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 11-04-2006
Avatar de PepeLolo
PepeLolo PepeLolo is offline
Miembro
 
Registrado: jun 2003
Ubicación: Fuenlabrada - Madrid - Espagna
Posts: 265
Poder: 21
PepeLolo Va por buen camino
Para empezar el concepto que quieres realizar esta bajo mi entender ligeramente equivocado.

¿Que sentido tiene que al visualizar "Ficha1" llames a "Ficha2" y al cerrar "Ficha2" destruyas "Ficha1"?.

Mi pregunta es ¿Qué es lo que quieres hacer exactamente?

un saludo
__________________
PepeLolo
El hombre el único virus que mide más de unas cuantas micras
Responder Con Cita
  #6  
Antiguo 11-04-2006
chileno chileno is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
chileno Va por buen camino
hola pepelolo...
la idea es la siguiente...al visializar la ficha2 selecciono un proveedor "por decirlo de alguna forma" listado en un StringGrid. si selecciono alguno se muestra la ficha1 con los datos seleccionados y si no selecciono nada y cierro la ficha2 no me debe mostrar la ficha1 ...
chau...
Responder Con Cita
  #7  
Antiguo 11-04-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Entonces sería más sencillo y claro si en lugar de abrir Ficha1 abres directamente Ficha2, y sólo si se selecciona un proveedor abres la Ficha1:

Código Delphi [-]
if Ficha2.ShowModal = idOk then
  Ficha1.Show;

// Saludos
Responder Con Cita
  #8  
Antiguo 11-04-2006
chileno chileno is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
chileno Va por buen camino
cierto que si roman... pero la idea inicial es cerrar la ficha...segun lo que aportas seria selecccionar el proveedor y mostrar la otra ficha, lo que me gustaria es cerrar la ficha donde se hace el llamado....se puede hacer eso?
Responder Con Cita
  #9  
Antiguo 11-04-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por chileno
pero la idea inicial es cerrar la ficha
El punto es que es esta idea original la que no le cuadra a nadie más que a ti. ¿Para qué muestras una ventana a la que el usuario posiblemente no va a acceder (si escoge cancelar)?

Pero bueno, no soy yo quien para dictar tus gustos. Lo apunto sólo para opinar que a fin de cuentas esto puede ser confuso para el usuario.

¿Se puede hacer lo que quieres? Sí, claro que se puede. El problema es sólo, como ya has visto, que no puedes cerrar- ni, por tanto destruir -una ventana desde su propio evento OnShow. La solución entonces está en ejecutar el código que ahora tienes en este evento posteriormente.

Aquí la idea:

Código Delphi [-]
const
  CM_AFTERSHOW = WM_USER + 1;

type
  TFicha1 = class(TForm)
    procedure FormShow(Sender: TObject);

  private
    procedure CMAfterShow(var Msg: TMessage); message CMAFTERSHOW;
  end;

implementation

procedure TFicha1.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, CM_AFTERSHOW, 0, 0);
end;

procedure TForm1.CMAfterShow(var Msg: TMessage);
begin
  with TFicha2.Create(nil) do
    try
      if ShowModal = mrCancel then Self.Close;
    finally
      Free;
    end;
end;

PostMessage envía un mensaje a la ventana (Ficha1) que se procesará sólo hasta que terminen de procesarse los otros mensajes, lo cual se traduce en que tal mensaje no se recibirá sino hasta que el evento OnShow haya terminado por completo. Tal mensaje lo recibes con el manejador CMAfterShow desde donde sí puedes autocerrar el formulario.

// Saludos
Responder Con Cita
  #10  
Antiguo 11-04-2006
chileno chileno is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
chileno Va por buen camino
hola roman....
gracias funciono a la primera....gracias por entender que los gustos de algunos son un poco extraño para la mayoria...
Responder Con Cita
  #11  
Antiguo 14-12-2022
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
Wow, cuanto tiempo ha pasado desde que crearon el post, yo tenia la misma duda el día de hoy.

La solución mas sencilla a mi gusto es utilizar:


Código Delphi [-]
uses Shellapi;
if TUCONDICION = true then
begin
showMessage('LA CONDICIÓN SE CUMPLE, CERRANDO FORMA.');
PostMessage(Handle, WM_CLOSE, 0, 0);
Exit;
end;

Saludos.
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
Efecto al cerrar form kakesoft Varios 1 12-12-2005 20:57:17
cerrar/minimizar un form jmlifi Varios 1 28-11-2005 10:54:08
Al cerrar Form no entra en OnClose nowheremanza OOP 2 13-09-2005 14:04:41
Problema al cerrar form Iseberiano Varios 4 08-06-2005 21:50:17
Cerrar un Form scooterjgm OOP 5 18-11-2004 11:27:33


La franja horaria es GMT +2. Ahora son las 17:00:09.


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