Foros Club Delphi

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

ricardopl65 10-03-2013 18:26:02

1 Archivos Adjunto(s)
Pues acabo de volver a probarlo y a mi me funciona.
Prueba este dpr:

alsn 10-03-2013 19:17:33

Sigue sin funcionarme. Igual es la versión de Delphi. Para poder probarlo, he tenido que quitar en los "uses" todas las referencias: "Winapi." "Vcl." "System." ya que no las reconocía, y eliminar entonces los uses dobles que quedaban.

alsn 12-03-2013 13:50:50

Hay un truco, que conozco desde mi época de Visual Basic, para crear ventanas flotantes (tipo barras de herramientas de Office), que consistiría en:

Código Delphi [-]
const
  SWW_hParent = -8;

 ...

SetWindowLong(FormFlotante.Handle, SWW_hParent, FormPadre.Handle)


Esta forma permite más posibilidades, como crear una jerarquía de ventanas.

Ejemplo:

Código Delphi [-]
procedure TForm1.FormShow(Sender: TObject);
const
  SWW_hParent = -8;
begin
  SetWindowLong(Form2.Handle,SWW_hParent,Form1.Handle);
  Form2.Show;

  SetWindowLong(Form3.Handle,SWW_hParent,Form2.Handle);
  Form3.Show;
end;

Chris 12-03-2013 16:44:40

Algo más sencillo que puedes usar en las nuevas versiones de Delphi

Establece la propiedad PopupMode del formulario a pmAuto y por último, crea el formulario superior como hijo directo del formulario padre/principal. Por ejemplo:

Código Delphi [-]
FormHijo := TFormHijo.Create(FormPadre);

Saludos!

Enlaces:
Propiedad PopupMode.
WS_POPUP (Para versiones de Delphi que no traen la propiedad PopupMode de TCustomForm.

alsn 12-03-2013 18:05:26

Sí, es eso mismo. Incluso se puede establecer la propiedad PopupMode por código a posteriori:

Código Delphi [-]
FormHijo := TFormHijo.Create(FormPadre);
FormHijo.PopupMode := pmAuto;
FormHijo.Show;

Aunque no se comporta exactamente igual. Me explico, con el siguiente código:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Form1);
  Form2.PopupMode := pmAuto;
  Form2.Show;

  Form3 := TForm3.Create(Form1);
  Form3.PopupMode := pmAuto;
  Form3.Show;
end;

El Form3 se comporta como si fuese hijo del Form2, no del Form1. Y no entiendo por qué.

Saludos!

Chris 12-03-2013 18:21:19

Cita:

Empezado por alsn (Mensaje 456502)
Sí, es eso mismo. Incluso se puede establecer la propiedad PopupMode por código a posteriori

Aunque lo puedes hacer, la documentación de Delphi aconseja que lo hagas esclusivamente en tiempo de Diseño.

Cita:

Empezado por alsn (Mensaje 456502)
Aunque no se comporta exactamente igual. Me explico, con el siguiente código:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
    ....
end;

El Form3 se comporta como si fuese hijo del Form2, no del Form1. Y no entiendo por qué.

Saludos!

No entiendo realmente que esté pasando. Hace un tiempo hice una aplicación usando estas propiedades, pero los formularios no se comportan a cómo mencionas. No recuerdo que configuración en especial estaba utilizando para que no me diera este inconveniente. Habría que probar distintas combinaciones.

Saludos.

PD.: Probá estableciendo la propiedad PopupMode en tiempo de diseño exclusivamente.

alsn 12-03-2013 18:28:39

También lo había probado así, por si fuera eso.

Saludos!

alsn 12-03-2013 18:52:00

A ver, si hago lo siguiente:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Form1);
  Form2.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form3 := TForm3.Create(Form1);
  Form3.Show;
end;

Sí se comportan de la manera esperada. Pero, estando en el mismo procedimiento se comportan como he dicho anteriormente.

Saludos

ricardopl65 13-03-2013 20:36:36

Pues a mi me funciona
 
Al menos en XE2 funciona con el ejemplo que te di. Mira este video a ver si se acerca a lo que quieres.
http://www.ricardoplaza.com/download/formdetras.mp4

alsn 14-03-2013 12:43:54

Efectivamente, es eso Ricardo. En el uso de CreateParams me funcionan, por ejemplo, los códigos de esta página:
http://delphi.about.com/od/formsdialogs/l/aa073101b.htm
Pero con WS_EX_NOACTIVATE no marcha en mi caso.

Un saludo

ricardopl65 14-03-2013 14:03:15

que sistema operativo tienes? versión de delphi?

alsn 14-03-2013 14:44:59

Lo he probado en una máquina virtual con Windows XP y Turbo Delphi.
No me dedico a la programación, es más bien una afición. Aunque en alguna ocasión le he sacado provecho.

ricardopl65 14-03-2013 15:24:06

deberias probar con un windows real y un delphi completo, a ver que tal, seguro ese es el problema

Chris 14-03-2013 20:55:21

Cita:

Empezado por alsn (Mensaje 456502)
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Form1);
  Form2.PopupMode := pmAuto;
  Form2.Show;

  Form3 := TForm3.Create(Form1);
  Form3.PopupMode := pmAuto;
  Form3.Show;
end;

El Form3 se comporta como si fuese hijo del Form2, no del Form1. Y no entiendo por qué.

Saludos!

Si aún lo quieres hacer así, la siguiente oración que extraigo de una entrada de la ayuda de Delphi te puede aclarar:
Cita:

Empezado por Delphi
If the PopupMode property is set to pmAuto, Screen.ActiveForm is used as the PopupParent property.

En este caso tendrás que establecer las propiedades PopupMode a pmExplicit y PopupParent a Form1 (en este caso Form1 es el formulario padre).

Saludos!

alsn 15-03-2013 09:38:57

Así sí se puede elegir el formulario padre de manera precisa.

Muchas gracias!


La franja horaria es GMT +2. Ahora son las 22:31:34.

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