Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-09-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Mostar/Ocultar una sombra a un Form en tiempo de ejecución

Este truco es para mostrar u ocultar una sombra, en nuestros Forms en tiempo de ejecución. Es muy habitual encontrar un truco parecido, que consiste en crear el formulario con la Sombra ya puesta, pero pocas veces se explica como ponerla y quitarla en tiempo de ejecución, así que he decidido escribir este truco :)

Este truco sólo funciona en Windows XP.

Esta pequeña función nos servirá para saber si la aplicación esta siendo ejecutada en un WinXP:
Código Delphi [-]
function IsWinXP: Boolean;
begin
 Result:=(Win32Platform = VER_PLATFORM_WIN32_NT) and
         (Win32MajorVersion >= 5) and (Win32MinorVersion >= 1);
end;

En esta segunda función lo que obtenemos, es si el usuario activo de Windows, tiene activa la propiedad "Sombras" a los menús (tales como Inicio, PopupMenus, etc...). Esta función la necesitamos para luego restaurar la configuración inicial del usuario.
Código Delphi [-]
function isDropShadowEnabled: Boolean;
{$IFDEF VER150} // Si es la version 7 (o inferior) de Delphi, entonces declara esta constante
const
  SPI_GETDROPSHADOW = $1024;
{$ENDIF}
begin
  SystemParametersInfo(SPI_GETDROPSHADOW, 0, @Result, 0);
end;

Aquí viene el código principal del Truco, en donde por parámetros le pasaremos si queremos mostrar u ocultar (activar o desactivar) la sombra en nuestro Formulario.
Código Delphi [-]
procedure TForm1.doActivateDropShadow(Enabled: Boolean);
{$IFDEF VER150} // Si es la versión 7 (o inferior) de Delphi, entonces declara estas constantes
const
  SPI_SETDROPSHADOW = $1025;
  CS_DROPSHADOW     = $20000;
{$ENDIF}
var
  teniaSombra: Boolean; // Esta variable recordara si tenia o no activa la opción de las sombras

begin
  // Esta corriendo en un WinXP? Si no es asi, abandona.
  if not IsWinXP then Exit;
  // Antes de cambiar nada, guardamos el estado inicial (config. del usuario de windows)
  teniaSombra:=isDropShadowEnabled;
  // Queremos activar la Sombra?
  if Enabled then
    begin
      // Activa la Sombra
      SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(True), 0);
      SetClassLong(Handle,GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW);
    end
  else // Quita la Sombra
    SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(False), 0);
  // Recrea la ventana
  RecreateWnd;
  // Restaura la configuración inicial del usuario  
  SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(teniaSombra), 0);
end;

Como podéis observar, es quizás un poco "basto" la forma que tiene de quitar la sombra (su funcionamiento se basa en poner la propiedad de "Sombras" de Windows a FALSE, así pues ningún menú en nuestro Windows tendrá sombras, recrear la ventana y luego restauramos la propiedad "Sombras" al valor puesto por el usuario.

Espero que os sirva este truco.

P.D.: La propiedad "Sombras" de Windows que tanto nombro, se puede cambiar desde: "Propiedades de pantalla -> Apariencia -> Efectos... -> "Mostrar sombras bajo los menús"

Saludos.
Responder Con Cita
  #2  
Antiguo 14-09-2006
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: ago 2003
Posts: 460
Poder: 21
DarKraZY Va por buen camino
Hola Xesc,

Acabo de probar este truco, pero no me funciona como esperaba.

Esto usando Delphi 7 y Windows XP con el tema por defecto aplicado.

Lo único que consigo cuando activo las sombras es que al mover la ventana, el refresco sea más lento que de normal. Pero no experimenta ningún cambio el menú que he creado.

Un saludo.
Responder Con Cita
  #3  
Antiguo 14-09-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
La sombra deberia aparecer en el "Formulario", o sea en el TForm, no en los menus, ya q por si solos estos ya lo tienen, si la prpiedad de sombras (en el windows) ya estan activadas.

La verdad, esq este truco lo he escrito usando el Delphi2k6, asi q tendre q probarlo con el Delphi 7 a ver si me ocurre lo mismo.

P.D.: Yo voy con el tema "Azul" de por defecto.

Saludos.
Responder Con Cita
  #4  
Antiguo 14-09-2006
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Por cierto, el resultado deberia ser algo parecido a esto:
http://img180.imageshack.us/my.php?image=consombrasb9.png

(Y edito: del mensaje anterior, que no uso el Azul por defecto, sino el Royal (del propio MS, q es parecido al por defecto).

Saludos.
Responder Con Cita
  #5  
Antiguo 14-04-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Si lo que quieren es siempre mantener activa la sombra, utilicen algo más profecional, por ejemplo, el siguiente código:

type
TForm1 = class(TForm)

private
{ Private declarations }
public
{ Public declarations }
protected
procedure CreateParams(var Params: TCreateParams); override; // Importante el "Override" !!!!
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{------------------------------------------------------------}
// Con esta función verificamos si el usuario está utilizanco WinXp
function IsWinXP: Boolean;
begin
Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and
(Win32MajorVersion >= 5) and (Win32MinorVersion >= 1);
end;
{------------------------------------------------------------}


{------------------------------------------------------------}
// Si es WinXP, entonces creamos la sombra
procedure TForm1.CreateParams(var Params: TCreateParams);
const
CS_DROPSHADOW = $00020000;
begin
inherited;
if IsWinXP then
Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW
else
end;
{------------------------------------------------------------}

esto nos evitará estar cambiando sin permiso la configuración al usuario. Recuenden que eso no le agrada a nadie.
Responder Con Cita
  #6  
Antiguo 14-04-2007
Avatar de xEsk
[xEsk] xEsk is offline
Miembro Premium
 
Registrado: feb 2006
Posts: 454
Poder: 19
xEsk Va por buen camino
Hola D&W, tu solucion es la mas comun, pero la gracia del truco era poder activar y desactivar la sombra en tiempo de ejecucion. Tu truco pone la sombra, si, pero esta ya no se puede "quitar".

Si es cierto que no agrada lo de cambiar la configuracion, pero siempre va bien saber como se hace (es un truco dentro de otro truco xD).

Saludos.
Responder Con Cita
  #7  
Antiguo 16-04-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Por ser un truco dentro de otro truco, está bien, te doy mérito de eso; pero en la práctica, no me parece que no es una buena idea utilizarlo, sería mejor aún proporcionarle al usuario la opción de mostrar/ocultar las sombras en las ventanas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:15:58.


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
Copyright 1996-2007 Club Delphi