Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Cómo saber si un formulario está creado? (https://www.clubdelphi.com/foros/showthread.php?t=78236)

newtron 31-03-2012 10:08:16

¿Cómo saber si un formulario está creado?
 
Hola a tod@s.

Para hacer consultas de tablas tengo un formulario especial de la clase TForm llamado TNTConsulta. Cuando quiero hacer una llamada al mismo lo declaro como una variable local, lo creo y llamo a una función del mismo, de la siguiente manera:

Código Delphi [-]
procedure TNTFormTraspasos.SpeedButton1Click(Sender: TObject);
var
DialogoConsulta: TNTConsulta;
begin
  DialogoConsulta:=TNTConsulta.Create(nil);
  DialogoConsulta.ConsultaConFiltro2('Consulta de articulos',Tabla,1,3,'CODIGO',Filtro);
  if DialogoConsulta.ModalResult = mrOK then 
     EditArticulo.Text:=DialogoConsulta.Valor;
  DialogoConsulta.Free;
end;

.... bien, por otros temas necesito saber si la variable DialogoConsulta ha pasado ya por el .Create. He probado a ver si es igual a nil pero no lo es y con el depurador no se puede saber el valor que tiene hasta que no se ha creado, o sea, que no sé qué valor tiene antes de pasar por el .create.

No se si me he explicado con claridad.

Gracias y un saludo

Al González 31-03-2012 13:12:39

Si tu variable fuera global en lugar de local —quizá tengas una variable llamada "NTConsulta"—, podrías usar "FreeAndNil (NTConsulta)" En lugar de "NTConsulta.Free". Hace lo mismo (destruir el objeto), pero asignándole Nil a la variable. Así es más fácil determinar luego si el objeto existe o no, esto siempre que no se dé el caso de tener dos formularios de consulta creados, pues la variable solamente puede apuntar a uno de ellos.

Regreso a la cama...

Lepe 31-03-2012 14:58:09

El caso es que Delphi no inicializa las variables locales, de ahí que no puedas saber qué valor tiene, es más, fuera de esa rutina ni siquiera sabes si ha sido creado o no.

Quizás puedas consultar el objeto Screen donde aparece todas las ventanas que tú has creado:
Código Delphi [-]
var i:integer;
begin
  for i:= 0 to Screen.count - 1 do
  begin
    if screen.forms[i].classname = 'TNTConsulta' then showmessage(' eureeeeeka');
  end;
end;

Otra cosa es que antes de crear la ventana, puedes asignar el valor nil a la variable temporar, así si puedes saber si ha sido creado. Incluso puedes usar FreeAndNil dentro de la rutina, como dice Al González, para testear su valor y tal.

newtron 01-04-2012 09:22:22

Ok, lo pruebo.

Gracias a ambos y un saludo.

newtron 01-04-2012 09:55:17

Vale.

Esto me valdría, el problema es que el formulario no tiene FreeAndNil, solo Free :confused:. Imagino que si solo lo igualo a nil irá creando un formulario nuevo en cada .create, ¿no?, ¿qué solución se os ocurre?.

Casimiro Notevi 01-04-2012 12:14:28

Se usa:
Código Delphi [-]
FreeAndNil( LoQueSea );

newtron 02-04-2012 09:04:39

Cita:

Empezado por Casimiro Notevi (Mensaje 429077)
Se usa:
Código Delphi [-]FreeAndNil( LoQueSea );

¡Andalaleche! y yo pensando que era un método del formulario. :D

Me vale, gracias a todos.

Casimiro Notevi 02-04-2012 10:39:39

Cita:

Empezado por newtron (Mensaje 429126)
¡Andalaleche! y yo pensando que era un método del formulario.

Es que no se puede saber todo :)


La franja horaria es GMT +2. Ahora son las 12:23:57.

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