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 detectar si un formulario ya está abierto? (https://www.clubdelphi.com/foros/showthread.php?t=72311)

mbguantay 10-02-2011 03:19:46

Cómo detectar si un formulario ya está abierto?
 
Hola amigos como estan?

En realidad no se si se puede hacer. Tengo que abrir un formulario cada cierto tiempo a modo de recordatorio de lo que no hay que olvidarse de hacer. Usé el temporizador para q cada cierto tiempo se abra un formulario com si fuera una agenda del dia, o una alarma... el tema es que si el formulario no se cierra, por algun motivo, digamos no estar sentado en la pc.. al cabao de un tiempo se han abierto un monton de instancias del mismo formulario...

quisiera saber si hay alguna forma de detectar un formulario ya abierto.. para en ese caso, no volver a abrirlo... Gracias!!!

ecfisa 10-02-2011 04:46:27

Hola.

Una forma sería:
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  for i:= Screen.FormCount -1 downto 0 do
    if Screen.Forms[i].Name = 'Form2' then  // suponiendo que tu form se llame Form2
    begin
      Screen.Forms[i].Show;
      Exit;
    end;
  with TForm2.Create(Application) do Show;
end;

Un saludo.

newtron 10-02-2011 10:06:03

Hola.

Yo uso esta forma:

if Formulario = nil then
Formulario := TFormulario.Create(Self);
Formulario.Show;

Saludos

Casimiro Notevi 10-02-2011 13:01:41

Yo uso una solución básicamente igual que la de ecfisa:

Código Delphi [-]
function  EstaAbiertoForm (cNombre : string) : boolean;
var
  i : integer;
begin
  Result := false;
  for i := 0 to Screen.FormCount - 1 do
    if Pos (LowerCase(Screen.Forms[i].Name),  LowerCase(cNombre) ) > 0 then
    begin
      Result := true;
      break
    end
end;

rgstuamigo 10-02-2011 14:05:38

Cita:

Empezado por newtron (Mensaje 390531)

Yo uso esta forma:

if Formulario = nil then
Formulario := TFormulario.Create(Self);
Formulario.Show;

Es una alternativa muy óptima la que mencionas , ya que no se necesita recorrer con un ciclo todos formularios en pantalla para hacer la búsqueda;)...Sin embargo para poder usarla hay que asegurarse que al momento de cerrar y destruir el formulario hay que ponerlo a nulo (nil) osea hacer:
Código Delphi [-]
Formulario := nil;
Eso lo podemos hacer en en evento OnDestroy del formulario por ejemplo.
Saludos...:)

mbguantay 10-02-2011 15:54:37

Gracias!!
 
Muchas Gracias por las respuestas!! Ya pruebo las que me dijeron pero infinitamente gracias.

AzidRain 10-02-2011 16:40:10

Otra solución aún mas simple es la siguiente:

En el evento que dispara el timer, antes de mostrar la ventana, desactiva el timer y en el evento OnClose de la ventana lo vuelves activar. De esta manera el timer solo corre mientras no se está mostrando la ventana, que es el comportamiento deseado.

Chris 10-02-2011 17:07:16

Cita:

Empezado por AzidRain (Mensaje 390582)
Otra solución aún mas simple es la siguiente:

En el evento que dispara el timer, antes de mostrar la ventana, desactiva el timer y en el evento OnClose de la ventana lo vuelves activar. De esta manera el timer solo corre mientras no se está mostrando la ventana, que es el comportamiento deseado.

Es exactamente lo que iba a proponer! Te me has adelantado! :cool:
Creo que es la solución más simple y adecuada a este caso.

Saludos,
Chris

newtron 10-02-2011 17:20:56

Cita:

Empezado por rgstuamigo (Mensaje 390560)
Es una alternativa muy óptima la que mencionas , ya que no se necesita recorrer con un ciclo todos formularios en pantalla para hacer la búsqueda;)...Sin embargo para poder usarla hay que asegurarse que al momento de cerrar y destruir el formulario hay que ponerlo a nulo (nil) osea hacer:
Código Delphi [-]Formulario := nil;

Eso lo podemos hacer en en evento OnDestroy del formulario por ejemplo.
Saludos...:)

.... tiquismiquis.... :p


La franja horaria es GMT +2. Ahora son las 16:29:23.

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