Foros Club Delphi

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

gluglu 13-01-2006 17:09:04

Forms Sombreados
 
Hola Amigos !

Encontré una curiosidad para sombrear los forms en http://www.swissdelphicenter.ch/de/showcode.php?id=1296

Lo que he podido comprobar que si muestro el form de manera 'No Modal' (Form.Show) todo funciona correctamente, pero si lo muestro 'Modal' (Form.ShowModal) entonces la parte del nuevo form que se encuentre sobre otro form de la misma aplicación no se sombrea, y la que aparece fuera de la aplicación principal sí que se sombrea correctamente. En este caso particular también ocurre que si paso a otra aplicación de windows cualquiera (llámese Word, etc. ...., el mismo Delphi en modo Debug, ...), y vuelvo a mi aplicación, el sombreado aparece correctamente en cualquier caso :eek: .

Alguna ayudita del por qué y como solventarlo ?

Gracias y saludos a todos !

gluglu 14-01-2006 01:03:02

Buscando información adicional al respecto, encontré lo siguiente :
Cita:

After reading the MS website, the shadow is displayed to show the Z order. So the shadow may be truncated if other windows on the desktop are placed higher in the Z order.
Alguien me puede ayudar como hacer de una ventana existente, la de mayor 'orden Z' ?

gluglu 14-01-2006 02:15:00

Sigo investigando ...

Por otro lado he visto que al parecer hace falta la siguiente línea adicional de código :
Código:

SystemParametersInfo(SPI_SETDROPSHADOW,0,Pointer(true),0);
pero si lo intento en mi Delphi 2005, me dá error de 'Invalid TypeCast' con Pointer(true). Ya que los punteros todavía no es mi fuerte, me podría decir alguien por favor como hacer que el parámetro que debe ser de tipo puntero, me señale a 'True' ?

Esto es lo que aparece en la ayuda de Delphi bajo 'SystemParametersInfo'
Cita:

The SystemParametersInfo function retrieves or sets the value of one of the system-wide parameters. This function can also update the user profile while setting a parameter.

BOOL SystemParametersInfo( UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);...
SPI_SETDROPSHADOWEnables or disables the drop shadow effect. Set pvParam to TRUE to enable the drop shadow effect or FALSE to disable it. You must also have CS_DROPSHADOW in the window class style.
Saludos de nuevo !

gluglu 14-01-2006 02:40:27

A pesar de todo esto ...
Código Delphi [-]
procedure TForm.CreateParams(var Params: TCreateParams);
const
  CS_DROPSHADOW = $00020000;
var
  B : longbool;
begin
  inherited;
  B := True;
  SystemParametersInfo(SPI_SETDROPSHADOW,0,B,0);
  Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;
sigue sin funcionar con Form.Showmodal :(

gluglu 16-01-2006 18:08:38

:p !!

Finalmente me contesto a mi mismo en todo este post !!

Ya lo conseguí ...

Encontré en la propia ayuda de Delphi lo siguiente :
Cita:

The PopupMode property controls how the top-level form behaves with respect to Window's WS_POPUP style. A window that has the WS_POPUP style is always above its "owner" in Z-order.
De esta manera he conseguido el sombreado también en el form que se llama con ShowModal
Código Delphi [-]
 Form2 := TForm2.Create(Self);
Form2.PopupMode := pmAuto;
Form2.ShowModal;
Saludos a todos !

roman 16-01-2006 21:58:43

gluglu, te agradezco que hayas continuado y concluido este hilo tú sólo. Mucha gente, al no recibir respuesta, opta por no publicar la suya propia una vez que la encuentran. Da gusto ver que esta vez no fue así.

Me resta una pregunta: ¿qué versión de Delphi usas? Porque no veo la propiedad PopupMode por ningún lado. :(

maeyanes 16-01-2006 22:08:31

Pues según, parece que esta propiedad la agregaron desde Delphi 8.

http://blogs.borland.com/abauer/arch...02/10/295.aspx


Saludos...

gluglu 17-01-2006 10:48:40

Gracias a David 'dec' pude crear mi propio avatar, incluyendo la versión del Delphi que utilizo, así como la BD que uso.

Estaba programando en D2005 pero ya me estoy pasando por completo a D2006. Cierto es que como llevo poquito tiempo en el nuevo mundo del Delphi, empezé directamente con la versión más actual, por lo que no sabía que dicha propiedad no se encontraba disponible en versión anteriores a D8.

Lo que sí creo es que la indicación que viene en el primer link que expuse, con respecto a sombrear los forms, sirve para todas las versiones de Delphi, pero yo me encontraba el problema con aquellas ventanas que eran 'modales'.

Seguro que junto con la explicación que viene en el link que ha dado maeyanes, debe existir una manera de solucionar el orden Z de las ventanas modales en D7 o anteriores, y de esta manera poder hacer uso de los forms sombreados incluso en versiones modales.

Debo añadir a todo este hilo que no especifiqué que además hay que activar la propiedad FormStyle = fsStayOnTop del form que se quiere sombrear.

En cualquier caso es un placer para mí compartir con todos vosotros mis averiguaciones, así como aprovechar para daros las gracias a todos por la ayuda que siempre me prestais en mis consultas.

Un saludo a todos. ;)

oregon 30-10-2006 18:15:31

Sombreado de un form
 
Saludos Gluglu,

Estoy intentando aplicar tus conocimientos sobre sombreado a un form de tipo showmodal, pero no consigo averiguar como y donde poner cada parte del código: ¿en el form principal? ¿en el form que se visualiza como modal?...
He hecho varias pruebas, pero todas ellas infructuosas-

¿me puedes hechar una mano con esto?
Muchas gracias!

warbird 23-08-2007 17:10:52

Tengo el mismo problema con el que iniciaste el hilo, no logro que un form modal haga sombra en los formularios de la aplicación, si hace sombra en cualquier parte fuera de la misma, pero a los forms de la aplicación no les hace sombra.

Seguí todos tus consejos sin embargo no logro hacerlo funcionar. Tal vez podrías publicar el código completo, para ver si me estoy perdiendo algo.

Gracias

:confused::confused::confused::confused::confused:

gluglu 23-08-2007 17:33:26

Al crear un Form en tiempo de ejecución lo que hago es :
Código Delphi [-]
Form1 := TForm1.Create(Self);
Form1.PopupMode := pmAuto;
Form1.ShowModal;
El Form1 tiene la propiedad FormStyle := fsStayOnTop.

Y en el Form1 :
Código Delphi [-]
TForm1 = class(TForm)
  ....
private
  { Private declarations }
public
  { Public declarations }
protected
  procedure CreateParams(var Params: TCreateParams); override;
end;
 
procedure TForm1.CreateParams(var Params: TCreateParams);
const
  CS_DROPSHADOW = $00020000;
begin
  inherited;
  Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;

Al menos así me funciona a mi sin ningún tipo de problema. ;)

warbird 24-08-2007 15:11:26

Funcionó, gracias por responder.
:)


La franja horaria es GMT +2. Ahora son las 19:37:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi