Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Form (https://www.clubdelphi.com/foros/showthread.php?t=66499)

shoulder 23-02-2010 16:19:25

Form
 
Hola, porque no me cierra una ventana cuando en el onActivate, doy esta orden


if nvacio = 1 then
form4.close;


entra dentro del if, pasa por el close, pero sigue de largo, no se como hacer.
Gracias.

roman 23-02-2010 16:25:04

Por favor, asigna títulos adecuados a tus mensajes y utiliza las etiquetas [code] o [delphi] para escribir código.

En cuanto a tu pregunta, no puedes cerrar una ventana desde el OnActivate u Onshow; esto es, no puedes cerrar una ventana que aun no termina de mostrarse.

Lo que puedes hacer es lanzar enviar un mensaje personalizado con PostMessage y en el manejado de dicho mensaje mandar cerrar la ventana. Busca AfterShow o CM_AFTERSHOW en los foros para ver un ejemplo de lo que digo.

// Saludos

BrunoBsso 24-02-2010 00:01:59

En realidad SI se puede hacer eso. En el evento OnActivate del form podes cerrarlo sin problemas. Al menos eso me demuestra D2010.
Te recomiendo ke directamente no uses el identificador del form (o sea, "form4"). Simplemente ponele Close;
Sino, también podrias ponerle Self.Close;
Código Delphi [-]
procedure TForm1.FormActivate(Sender: TObject);
begin
  Close;
end;

Saludos!

Casimiro Notevi 24-02-2010 00:06:06

¿Seguro que así se cierra?

BrunoBsso 24-02-2010 00:17:55

Cita:

Empezado por Casimiro Notevi (Mensaje 354822)
¿Seguro que así se cierra?

Sip. Estaba seguro que si, pero lo probé antes de comentarlo por las dudas :D

roman 24-02-2010 03:05:04

A mi me funciona tanto en el OnShow como en el OnActivate, pero, sólo si es el formulario principal. Si se usa Show para mostrar otro formulario, entonces no cierra. De hecho, me lanza la excepción:

---------------------------
Project1
---------------------------
Cannot change Visible in OnShow or OnHide.
---------------------------
Aceptar
---------------------------

// Saludos

Caral 24-02-2010 03:18:57

Hola
Me imagino:
Código Delphi [-]
if nvacio = 1 then
begin
If Form4.visible = true then
form4.close;
end;
Saludos

BrunoBsso 24-02-2010 04:39:01

Cita:

Empezado por roman (Mensaje 354838)
A mi me funciona tanto en el OnShow como en el OnActivate, pero, sólo si es el formulario principal. Si se usa Show para mostrar otro formulario, entonces no cierra. De hecho, me lanza la excepción:

---------------------------
Project1
---------------------------
Cannot change Visible in OnShow or OnHide.
---------------------------
Aceptar
---------------------------

// Saludos

Tenés razón, no lo había probado en otro form que no sea el main.
Bueno, la única solución que le veo es desde el form que lo invoca.

Código Delphi [-]
//Form1 llama a Form4 en un OnClick de cualquier botón
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form4.Show;
end;

//Pero en vez de llamarlo podría verificar NVacio = 1 antes
procedure TForm1.Button1Click(Sender: TObject);
begin
  if NOT(NVacio = 1) then
    Form4.Show;
end;

BrunoBsso 24-02-2010 04:41:41

Cita:

Empezado por Caral (Mensaje 354843)
Hola
Me imagino:
Código Delphi [-]
if nvacio = 1 then
begin
If Form4.visible = true then
form4.close;
end;

Saludos

Eso no debe funcionar, porque la propiedad "visible" de los formularios siempre es true en los OnActivate de los mismos. Así que sería una condición retórica (siempre daría true) y volvería a lanzar el mismo error.
Saludos!

roman 24-02-2010 04:47:01

Cita:

Empezado por BrunoBsso (Mensaje 354852)
Bueno, la única solución que le veo es desde el form que lo invoca.

Puede hacerse como lo indiqué en mi primer mensaje. No obstante, yo concuerdo más contigo en el sentido de que quien debe hacer la comprobación es el formulario que llama.

// Saludos

shoulder 24-02-2010 17:02:16

Form cerrarlo en el onActivate
 
Gracias a todos, probe
if nvacio = 1 thenbeginIf Form4.visible = true thenform4.close;end;Pero me pasa de largo, tendria que existir una instancia porterior al onActivate, para cerralo ahi.

roman 24-02-2010 18:36:33

La respuesta está desde mi primer mensaje.

// Saludos

BrunoBsso 24-02-2010 21:01:00

Ya te dimos 2 soluciones
 
Cita:

Empezado por roman (Mensaje 354920)
La respuesta está desde mi primer mensaje.

// Saludos

Cita:

Empezado por roman
Lo que puedes hacer es lanzar enviar un mensaje personalizado con PostMessage y en el manejado de dicho mensaje mandar cerrar la ventana. Busca AfterShow o CM_AFTERSHOW en los foros para ver un ejemplo de lo que digo.

Ahí tenés la solución de roman que es pasándole messages.

Cita:

Empezado por BrunoBsso
Código Delphi [-]
//Form1 llama a Form4 en un OnClick de cualquier botón
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form4.Show;
end;

//Pero en vez de llamarlo podría verificar NVacio = 1 antes
procedure TForm1.Button1Click(Sender: TObject);
begin
  if NOT(NVacio = 1) then
    Form4.Show;
end;

Ahí tenés mi solución que es verificar antes de llamar al formulario.
Las dos te van a andar perfecto, parece que no las leíste.


La franja horaria es GMT +2. Ahora son las 00:35: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