Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Lista de formularios activos (https://www.clubdelphi.com/foros/showthread.php?t=66441)

principiante22 19-02-2010 20:14:34

Lista de formularios activos
 
Saludos Club,

Hay alguna lista de los formularios que están visibles organizada por el orden de visibilidad de los formularios?

Por ejemplo, si tengo este código:

Código Delphi [-]
Form3.Show; 
Form1.Show; 
From2.Show;

Hay alguna forma de saber que el form1 está delante del form3? No puede ser con el Screen.ActiveForm porque este me daría el form2 y no es lo que necesito.

Lo que quiero es tener un formulario delante de todos los demás de la aplicación pero no delante de las demás aplicaciones. Se les ocurre alguna forma?

Bueno, espero haberme explicado bien.

Gracias de antemano.

cocute 19-02-2010 20:58:06

no entiendo bien lo que quieres hacer porque primero dices que quieres saber que form esta delante y luego que quieres que un determinado form esté delante, si es esto último quizas con esto:
Form1.BringToFront;

principiante22 19-02-2010 21:14:56

Saludos cocute, esto me traerá al form1, pero no es eso lo que quiero. Lo que quiero es, si los tres formularios están visibles, cúal es el orden en que están presentandose.

Por ejemplo, con el mismo código que plantee al principio:

Código Delphi [-]
Form3.Show; 
Form1.Show; 
Form2.Show;

Esto me dará el siguiente orden de visibilidad:

1- Form2
2- Form1
3- Form3

Pero si le doy clic al form1, me dará el siguiente orden:

1- Form1
2- Form2
3- Form3

Lo que necesito saber es si el form2 está delante del form3.

Espero haberme explicado mejor.

DriverOp 19-02-2010 23:42:03

Creo que lo tengo.

En el fondo, lo que tú quieres saber es el z-order de las ventanas actualmente mostradas. El z-order es el orden en el que están "apiladas" las ventanas en la pantalla. Siendo la que está "arriba de todo" la ventana con el z-order cero y así en orden creciente hasta la última.

La API de Windows tiene dos funciones para saber el z-order de las ventanas, por el momento pude determinar el z-order de todas las ventanas abiertas (la de la aplicación actual y las del resto de las aplicaciones) usando estas dos funciones:

GetTopWindow() devuelve el handle de la ventana con z-order cero si le pasas cero como parámetro:

Código Delphi [-]
var
  h: hwnd;
begin
  h:=GetTopWindow(0);
...

Luego:
GetNextWindow() devuelve la siguiente ventana según su z-order del handle que le pasas como parámetro, el segundo parmámetro sirve para indicarle la dirección en la que quieres recorrer el z-order:

Código Delphi [-]
var
  h: hwnd;
begin
  h:=GetTopWindow(0);
  while h <> 0 do
    begin
       h := GetNextWindow(h,GW_HWNDNEXT);
    end;

Lo que hago aquí es obtener el handle de la ventana "arriba de todo" y luego entro al ciclo en el que recorro todas las ventanas hasta abajo de la pila de ventanas. La última ventana no tiene una ventana siguiente y la función GetNextWindow devuelve cero, con lo que finaliza el ciclo.

Código Delphi [-]
var
  h: hwnd;
  z: integer;
begin
  Memo1.Lines.Clear;
  h:=GetTopWindow(0);
  z:=0;
  while h <> 0 do
    begin
      if h = Form1.Handle then
        Memo1.Lines.Add(IntToStr(z)+' Es el form1.');
      if h = Form2.Handle then
        Memo1.Lines.Add(IntToStr(z)+' Es el form2.');
      if h = Form3.Handle then
        Memo1.Lines.Add(IntToStr(z)+' Es el form3.');
      h := GetNextWindow(h,GW_HWNDNEXT);
      inc(z);
    end;
end;

Este sería el código con el que podrías comenzar a experimentar. La variable z te dirá el z-order de las ventanas.

principiante22 20-02-2010 00:58:49

Esto era exactamente lo que necesitaba :D

Todavía no lo he probado pero eso era lo que necesitaba. Muchas gracias


La franja horaria es GMT +2. Ahora son las 00:21:14.

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