Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-01-2005
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
No funciona LockWindowUpdate en XP

Hola amigos
Como dice el titulo del hilo, no me funciona la funcion LockWindowUpdate en Win XP, utilizo dicha funcion para quitar el molesto parpadeo que se produce cuando se crea y maximiza un fom hijo dentro de un Form MDI. En Win 98 funciona perfectamente, pero al probarlo en XP, la funcion no paraliza la actualizacion de pantalla cuando se crean y maximizan los form hijos, aqui va como utilizo la funcion...
Código Delphi [-]
 
Begin
........
 
//Bloqueamos el repintado de la pantalla hasta que no se halla
//cargado completamente el formulario
LockWindowUpdate(Self.Handle);
//Creamos el nuevo hijo
FormHijo:=TFormMaestroEnsayoMuestraHormigon.Create(Self); 
//Damos un nombre al formulario 
FormHijo.Caption:=NombreFormulario;
//Dejamos que la pantalla se repinte, para mostrar en pantalla
//lo que el formulario muestra
LockWindowUpdate(0);
.......
 
End;
Se agradece cualquier ayuda...
Saludos....
__________________
Un hombre inteligente aprende de los errores propios...
Un hombre sabio aprende de los errores de los demas...
Responder Con Cita
  #2  
Antiguo 24-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En estos momentos no recuerdo los detalles pero me parece que LockWindowsUpdate debes aplicarlo no a Self.Handle sino a Self.ClientHandle (¿o ambos?). El caso es que ClientHandle corresponde a una ventana dentro del formulario que no se ve pero es la que se ocupa de los formularios hijos.

// Saludos
Responder Con Cita
  #3  
Antiguo 24-01-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
En estos momentos no recuerdo los detalles pero me parece que LockWindowsUpdate debes aplicarlo no a Self.Handle sino a Self.ClientHandle (¿o ambos?). El caso es que ClientHandle corresponde a una ventana dentro del formulario que no se ve pero es la que se ocupa de los formularios hijos.
LockWindowsUpdate lockea cualquier tipo de ventana, y cuanto "mas adentro" lockee, mejor será el efecto porque no quedará en blanco todo el form si este proceso demora demasiado.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 24-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
LockWindowsUpdate lockea cualquier tipo de ventana, y cuanto "mas adentro" lockee, mejor será el efecto porque no quedará en blanco todo el form si este proceso demora demasiado.
Responder Con Cita
  #5  
Antiguo 24-01-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
la compliqué?? ... si tenemos una ventana en particular, por ejemplo un TAnimate que queremos bloquear, y este TAnimate esta contenido por un panel, el panel pro un frame y el frame por el form, lo que nos conviene bloquear es el TAnimate o a lo sumo su contenedor inmediato (el TPanel). Si lo bloqueamos para realizar un proceso, y este proceso puede demorar, el formulario no repintará lo que tengamos bloqueado (siempre que ejecutemos un ProcessMessage dentro de nuestro proceso).
¿Se entiende a que voy?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #6  
Antiguo 24-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, vamos a recapitular o salirnos por la tangente

Si por "molesto parpadeo", senpiterno se refiere al efecto de animación de ventanas al maximizar o restaurar entonces es más que suficiente deshabilitar tal efecto:

Código Delphi [-]
var
  Info: TAnimationInfo;

begin
  Info.cbSize := SizeOf(TAnimationInfo);
  LongBool(Info.iMinAnimate) := false;
  SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
end;

Claro que esto desactivará la animación en todo el sistema. Si sólo quiere desactivarse en las ventanas hijas entonces puede activarse una vez que se termine de maximizar o restaurar la ventana. En este mensaje hay más detalles al respecto.

// Saludos

pd: ya en la noche consultaré con la almohada para entender a Federico
Responder Con Cita
  #7  
Antiguo 24-01-2005
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
Gracias por la respuesta roman y por la aclaracion del concepto de bloqueo del repintado de las ventanas delphi.com.ar, pero el asunto es que sigue sin funcionar. Prove con LockWindowUpdate(Self.ClientHandle) y LockWindowUpdate(Self.Handle) e incluso ambos que el efecto deseado sigue sin funcionar.....???

Saludos
__________________
Un hombre inteligente aprende de los errores propios...
Un hombre sabio aprende de los errores de los demas...
Responder Con Cita
  #8  
Antiguo 24-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Probaste lo de deshabilitar las animaciones? ¿Revisaste el hilo que mencioné?

// Saludos
Responder Con Cita
  #9  
Antiguo 24-01-2005
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
roman vi e implemente lo del hilo al cual que merivaste, pero aun sigue sin funcionar. Cuando me refiero al molesto efecto del formulario al crearce, hago referecia, a que cuando un form hijo se crea en un MDI, este se crea con un tamaño mas reducido que el contenedor de este y al ejecutarse la accion de maximizarce (ya que asi la tengo definida) este da unos parpadeos. Lo que quiero lograr es que el form aparesca ya maximizado, sin que se vea su tamaño original de creacion y el molesto efecto de maximizacion, espero haber aclarado mas las cosas...

Saludos.
__________________
Un hombre inteligente aprende de los errores propios...
Un hombre sabio aprende de los errores de los demas...
Responder Con Cita
  #10  
Antiguo 24-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Vamos a ver, creo que esto te debe funcionar en cualquier caso:

Código Delphi [-]
type
  TForm2 = class(TForm)
  private
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  end;

implementation

procedure TForm2.WMSysCommand(var Msg: TWMSysCommand);
begin
  case Msg.CmdType and $FFF0 of
    SC_ZOOM, SC_RESTORE:
    begin
      EnableAnimation(false);
      LockWindowUpdate(Handle);

      inherited;

      LockWindowUpdate(0);
      EnableAnimation(true);
    end;

    else
      inherited;
  end;
end;

end.

donde Form2 es el formulario hijo y EnableAnimation es como en el otro hilo.

// Saludos
Responder Con Cita
  #11  
Antiguo 24-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y bueno, siguiendo con las pruebas veo que en el código anterior puedes quitar LockWindowsUpdate y funciona perfecto. Total, que LockWindowsUpdate termina siendo innecesario y habría que cambiar el título a este hilo.

// Saludos
Responder Con Cita
  #12  
Antiguo 24-01-2005
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
Gracias roman por la ayuda, pero lamento decir que no funciona, es mas se produce un efecto de pixelacion de la pantalla, es decir quedan pegados ciertos cuadros de la pantalla, hasta que el proceso de mostrar el formulario se termina...como informacion adicional utilizo win xp profesional y delphi 7. Lo extraño es que antes cuando utilizaba win 98 con solo la utilizacion LockWindowUpdate(Handle) antes de crear el formulario me funcionada.....

Saludos...
__________________
Un hombre inteligente aprende de los errores propios...
Un hombre sabio aprende de los errores de los demas...

Última edición por senpiterno fecha: 24-01-2005 a las 23:11:26.
Responder Con Cita
  #13  
Antiguo 24-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues no sé qué decirte. Suena a un problema del driver de video. Yo he hecho la prueba también con Delphi7 y Win Xp Profesional y me ha funcionado perfecto.

// Saludos
Responder Con Cita
  #14  
Antiguo 24-01-2005
senpiterno senpiterno is offline
Miembro
 
Registrado: abr 2004
Posts: 112
Poder: 21
senpiterno Va por buen camino
Roman en que momento el form creado recive el mensaje WMSysCommand...

Saudos...
__________________
Un hombre inteligente aprende de los errores propios...
Un hombre sabio aprende de los errores de los demas...
Responder Con Cita
  #15  
Antiguo 25-01-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por senpiterno
en que momento el form creado recive el mensaje WMSysCommand...
Cada vez que se ejecuta un comando del menú del sistema (el que aparece al dar click en el cuadrito de la esquina superior izquierda o el menú contextual de la barra de título) e incluye Maximizar (Zoom) y restaurar (Restore). El doble cick sobre la barra de título genera este mismo mensaje.

Si te fijas, el código que te pongo lo que hace es detectar este mensaje e inhabilitar la animación antes de procesarlo (antes de llamar a inherited) y lo restaura después de que termina el procesamiento por defecto.

¿Por qué no pruebas primero poniendo EnableAnimation(false) en el OnCreate del formulario olvidándote del WMSysCommand? Como mencioné antes, esto debe deshabilitar las animaciones en todo el sistema así que debería funcionarte bien. Lo del SysCommand era sólo para no deshabilitar las animaciones en otras aplicaciones sino sólo al momento de maximizar o restaurar una ventana hija.

// Saludos
Responder Con Cita
Respuesta



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 17:35:18.


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