Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   como cerrar una Form? (https://www.clubdelphi.com/foros/showthread.php?t=30607)

chileno 11-04-2006 14:30:15

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...

Lepe 11-04-2006 14:49:35

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

Kosmo 11-04-2006 14:55:19

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

Lepe 11-04-2006 15:15:16

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.

PepeLolo 11-04-2006 16:25:24

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"?.:eek:

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

un saludo;)

chileno 11-04-2006 18:30:06

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...

roman 11-04-2006 18:34:37

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

chileno 11-04-2006 19:29:27

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?

roman 11-04-2006 20:04:48

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

chileno 11-04-2006 20:53:34

hola roman....
gracias funciono a la primera....gracias por entender que los gustos de algunos son un poco extraño para la mayoria...

pgranados 14-12-2022 19:45:01

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.


La franja horaria es GMT +2. Ahora son las 03:06:26.

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