PDA

Ver la Versión Completa : No funciona LockWindowUpdate en XP


senpiterno
24-01-2005, 19:38:45
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...


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....

roman
24-01-2005, 19:58:21
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

delphi.com.ar
24-01-2005, 20:42:08
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!

roman
24-01-2005, 20:56:47
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.


:confused:

delphi.com.ar
24-01-2005, 21:05:55
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?

roman
24-01-2005, 21:34:17
A ver, vamos a recapitular o salirnos por la tangente :p

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:


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 (http://www.clubdelphi.com/foros/showthread.php?t=11164&highlight=LockWindowUpdate) hay más detalles al respecto.

// Saludos

pd: ya en la noche consultaré con la almohada para entender a Federico :p

senpiterno
24-01-2005, 21:44:48
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

roman
24-01-2005, 21:46:46
¿Probaste lo de deshabilitar las animaciones? ¿Revisaste el hilo que mencioné?

// Saludos

senpiterno
24-01-2005, 22:05:23
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.

roman
24-01-2005, 22:44:42
Vamos a ver, creo que esto te debe funcionar en cualquier caso:


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

roman
24-01-2005, 23:05:13
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. :D

// Saludos

senpiterno
24-01-2005, 23:07:36
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...

roman
24-01-2005, 23:12:02
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

senpiterno
24-01-2005, 23:22:15
Roman en que momento el form creado recive el mensaje WMSysCommand...

Saudos...

roman
25-01-2005, 01:42:58
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