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 08-08-2007
luxus luxus is offline
Miembro
 
Registrado: oct 2004
Posts: 134
Poder: 20
luxus Va por buen camino
Comprobar el estado de un form

Hola a todos,

tengo una pequeña duda que no logro solucionar.
Estoy diseñando una aplicación y supongamos que cuando se activa un botón ejecuto en ese momento la instruccion:

Applicaction.CreateForm(TF..., F....)

y luego trabajo en con el form.

Pues bien mi duda llega en como puedo comprobar si dicho form está creado (y activo) en el momento de ejecución de la aplicación.

He intentado ver si la propiedad FormState me ayuda pero no logro que me indique lo que necesito. Es más: ¿Es esa la solución?

Os agradeceria si me podeis echar una mano.

Un saludo
Responder Con Cita
  #2  
Antiguo 08-08-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Generalmente la instrucción que dices la emplea Delphi en el archivo de proyecto. Cuando se crean formularios en tiempo de ejecución suele hacerse algo similar a esto:

Código Delphi [-]
Form2 := TForm2.Create(Self);

Y, si quieres comprobar si "Form2" contiene ya una instancia del formulario, previamente creada:

Código Delphi [-]
if not Assigned(Form2)
  Form2 := TForm2.Create(Self);
Form2.ShowModal();

Creo recordar que los formularios cuentan con un método "Showing" que indica si está mostrándose el formulario en cuestión.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 08-08-2007
luxus luxus is offline
Miembro
 
Registrado: oct 2004
Posts: 134
Poder: 20
luxus Va por buen camino
Re: Comprobacion del form

Gracias por tu ayuda,

mi duda surge si aunque el form NO esté creado esta instrucción ya no me sirve ¿no?

Form2 := TForm2.Create(Self);
Responder Con Cita
  #4  
Antiguo 08-08-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Esa instrucción crea una instancia de "TForm2" y guarda una referencia en la variable "Form2". Si el formulario estuviera ya creado, la instancia anterior sería sustituida por la nueva. Si el formulario no estuviera creado, se crearía mediante esa instrucción.

Ya digo. Lo normal es no dejar a Delphi que cree los formularios, es decir, quitar los "CreateForm" del archivo de proyecto ".dpr". Luego, cuando necesitas usar un formulario, lo creas, y cuando ya no lo necesitas lo destruyes.

Pero esto último suele hacerse con formularios que vamos a mostrar "modalmente". Y de hecho no tienes que destruir el formulario explícitamente si le asignas un "Parent" (en su constructor) puesto que ya dicho "Parent" se encargará de la destrucción del formulario.

Si por el contrario muestras el formulario mediante su método "Show", es decir, no lo haces "modalmente", el asunto es muy similar, es decir, compruebas que no exista ya una instancia del formulario que vas a mostrar:

Código Delphi [-]
if not Assigned(Form2) then
  Form2 := TForm2.Create(Self);
Form2.Show();

Y puedes usar el evento "OnClose" de "Form2" de este modo:

Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject;
 var Action: TCloseAction);
begin
  Action := caFree;
end;

Pero fíjate que existen otros posibles valores para "Action", como "caMinimize y caHide, caNone".

Antes comenté que normalmente se destruyen los formularios cuando ya no se los necesita, sobre todo si se muestran "modalmente". Esto suele hacerse tal que así:

Código Delphi [-]
var
  Form2: TForm2;
begin
  Form2 := TForm2.Create(nil);
  try
    Form2.ShowModal();
  finally
    Form2.Free();
  end;
end;

De ese modo creamos el formulario, lo mostramos y lo destruimos acto seguido de que se cierre. Fíjate que esto último (gracias I.M) todavía puede hacerse de una forma "más elegante", usando la magia del "with" de Delphi:

Código Delphi [-]
begin
  with TForm2.Create(nil) do
  try
    ShowModal();
  finally
    Free();
  end;
end;

Pero no sé si entre tanta cháchara al final he conseguido responder a tu inquietud o qué... Lamento el rollo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 08-08-2007
luxus luxus is offline
Miembro
 
Registrado: oct 2004
Posts: 134
Poder: 20
luxus Va por buen camino
No sé si me explico

Hola DEC

En primer lugar muchas por tu ayuda y dedicación.

No sé si me he explicado bien o no.

Tengo el caso que algunas recurro a un form y otras veces no. Cuando recurro a dicho form lo creo, lo muestro y al final lo destruyo (tal como me explicas).

LLega un momento en que por otra vía tengo que comprobar si el form anterior está creado o no. Si está creado lo muestro y si no hago otras funciones.

Es ahí donde tengo el problema. ¿como comprobar si el form está o no creado? Es más he intentado usar

if not Assigned(FFacturarPresupuesto) then
presupuesto:=FFacturarPresupuesto.DataSource2.DataSet.FieldValues['codigo']
else
presupuesto:='';

y me da el siguiente error:

Access violation at address 007614F3 in module "proyecto.exe". Read of address 00000314

Creo que esto se debe a que el form no está creado.

PD. Muchas gracias nuevamente por tu ayuda
Responder Con Cita
  #6  
Antiguo 08-08-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Tal como planteas el código:

Código Delphi [-]
if not Assigned(FFacturarPresupuesto) then
  presupuesto:=FFacturarPresupuesto.DataSource2.DataSet.FieldValues['codigo']
else
  presupuesto:='';

Creo que debería ser al revés:

Código Delphi [-]
if Assigned(FFacturarPresupuesto) then
  presupuesto:=FFacturarPresupuesto.DataSource2.DataSet.FieldValues['codigo']
else
  presupuesto:='';

Es decir, "si FFacturarPresupuesto contiene un objeto, entonces usamos FFacturaPresupuesto".

La violación de acceso se produce porque tu código dice algo como "Si FFacturarPresupuesto no contiene un objeto, lo usaré de todas formas...". Y lógicamente no puedes usar un objeto (ni ninguno de sus métodos o propiedades) si el objeto no existe.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 08-08-2007 a las 18:03:49.
Responder Con Cita
  #7  
Antiguo 08-08-2007
luxus luxus is offline
Miembro
 
Registrado: oct 2004
Posts: 134
Poder: 20
luxus Va por buen camino
Ya!!!

Hola DEC

Ya funcionó. Muchas Gracias por tu ayuda. La verdad es que me estaba volviendo loco con este fallo.

Supongo que será después de estar tantas horas delante la pantalla.

Un saludo
Responder Con Cita
  #8  
Antiguo 08-08-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Supongo que será después de estar tantas horas delante la pantalla.
Pues sí, suele pasar, ¡hay que descansar de vez en cuando hombre!
__________________
David Esperalta
www.decsoftutils.com
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
comprobar sql cuscus Conexión con bases de datos 3 22-11-2006 07:22:24
Comprobar que es Integer Alexis7788 Varios 4 01-10-2006 05:10:15
Comprobar la conexion al servidor de bd fjolivares Conexión con bases de datos 5 30-01-2004 11:01:14
comprobar?? botones67 Varios 5 03-10-2003 21:09:05
comprobar?? botones67 Conexión con bases de datos 2 03-10-2003 19:29:21


La franja horaria es GMT +2. Ahora son las 01:32:40.


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