PDA

Ver la Versión Completa : Efectos de Ventanas


gerald
29-10-2008, 16:17:02
Tengo un form q trabaja como un grid y con un boton se me ejecuta. Quisiera saber como le puedo dar un efecto al mostrar y al ocultar sin usar las api de windows porq deberia de ejecutarse en cualquier version de windows Si me pudieran ayudar agradeceria mucho.....

enecumene
29-10-2008, 16:30:40
Hola, al menos deberías explicar qué clase de efectos necesitas, eso es algo extenso ;)

Saludos.

gerald
29-10-2008, 16:49:45
Hola, al menos deberías explicar qué clase de efectos necesitas, eso es algo extenso ;)

Saludos.

Mostrar y ocultar la ventana como si se desvaneciera desde abajo hacia arriba cuando se oculta y arriba hacia abajo cuando se muestra. no lento pero no tan rapido me entiendes???

ContraVeneno
29-10-2008, 19:47:03
con TForms no se como se pueda hacer, pero con las DevExpress, puedes usar un TDockPanel, agregar páneles y listo.

Lepe
29-10-2008, 19:52:45
El efecto de desvanecerse está disponible desde windows 2000 (con algún service pack) o superior y en delphi, creo recordar que desde delphi 6 con las propiedades AlphaBlend, etc...

¿de verdad tienes windows 95/98 todavía por ahí?

Algo que sí te va a funcionar en todos los windows es el "Roll up" esto es, decrementar el Height y width del TForm hasta que sean muy pequeños y después ocultar la ventana.

Saludos

gerald
29-10-2008, 20:32:30
no entiendo exactamente lo qme dices papa y como es un programa administrativo no deseo tener problemas con que windows usan los clientes por eso no quiero meterme en eso. Si me podrias explicar eso q me dijiste seria de mucha ayuda estoy urgido por solucionar ese incomveniente

Lepe
30-10-2008, 18:07:39
Pon esto en un botón de la ventana que quieres ocultar:


var PasoAnimaciones :integer;
begin
PasoAnimaciones := 2;

while ClientHeight >3 do
begin
Height := Height -PasoAnimaciones;
Top := Top + Pasoanimaciones;
application.ProcessMessages;
application.ProcessMessages;
end;
Hide;


En otro botón, pon este código, hará la animación de mostrarse:

var PasoAnimaciones :integer;
FAlto :integer;
FAncho:integer;
begin
PasoAnimaciones := 2;
FAlto := 200; // alto que se quiere de la ventana
FAncho := 300;
Width:=3;
ClientHeight:= Pasoanimaciones;
Show;
Height := 1;
while Height < FAlto do
begin
Height:= Height+Pasoanimaciones;
application.ProcessMessages;
application.ProcessMessages;
end;
end;
Selft.SetBounds(left, top, Falto, Fancho);

gerald
30-10-2008, 20:53:50
ok entiendo porq mandas a ejecutar dos veces el aplication.processmessages eso no lo entiendo

Lepe
30-10-2008, 21:06:58
En principio, al haber 2 llamadas, hace una pausa más grande, ya que los eventos de repintado tienen poca prioridad en windows.

La verdad, ese código tiene bastante tiempo, no recuerdo si produce algún tipo de fallo al repintar, con uno debería bastar.

Saludos

gerald
30-10-2008, 21:12:50
entiendo porq yo hize uno pero con el form como si fuera un grid y bueno no me da problemas pero al hacer click a donde se activa otro evento la primera vez funciona bien pero despues mientras hace el cerrado del form y se activa el otro evento pareciera q no terminara el proceso y deja la mitad del form ahi. cuando se termina la ejecucion del otro regresa al del form lo termina de cerrar y como el optro evento q uso tiene el evento repeatclick se vuelva a ejecutar y no se ve nada bien. No se como solucionar el problema por eso te pregunto sobre el metodo application.processmessages porq yo uso solo uno no se si deba colocar dos o hay otra forma de hacerlo de todas maneras aqui te paso el codigo ahi solo le faltan las coordenadas de donde se encuentra el grid pero ese funciona

procedure TFFComboBox.EjecutarEfecto(canActivate :Boolean ; pSize :Integer ; pAlign :tAlign );
var nSize: integer;
begin
nSize := 0;
while nSize < GRID_ComboBox.Height +4 do
begin
nSize := nSize + pSize;
if (nSize > GRID_ComboBox.Height +4) then
pSize := (GRID_ComboBox.Height - (nSize - pSize)) + 2;

//Formulario Activo
if canActivate = True then
begin
if not (Height > GRID_ComboBox.Height +4) then
Height := Height + pSize;
end
//oculta el formulario
else if canActivate = False then
begin
if not (Height = 0) then
begin
Height := Height - pSize;
end
end;
Application.ProcessMessages;
end;
end;

Lepe
30-10-2008, 23:49:49
No entiendo muy bien tu explicación, pero según dices, deberías sustituir el Application.processmessages por Update.

Processmessages hace que el programa "respire", por eso permite intercalar la ejecución de ese otro evento mientras se está cerrando el Form.

Update lo que hace es forzar el repintado de la ventana, pero no deja "respirar" a la aplicación. En este caso, mientras se esté cerrando el Form, no permitirá ejecutar intercalar la ejecución de ese evento que hablas.

Prueba a ver.

Saludos