Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cerrar formularios pasado un tiempo (https://www.clubdelphi.com/foros/showthread.php?t=77574)

ElDioni 08-02-2012 18:08:46

Cerrar formularios pasado un tiempo
 
Hola,

Tengo varios paneles dentro del form principal y varios formularios en una aplicación, el tema es que me gustaría que los paneles y los formularios que hacen referencia a un determinado tema no se puedan quedar abiertos si no se están utilizando durante un tiempo, pero no se si existe alguna forma de saber si alguien está utilizando un TPanel en concreto o un formulario en concreto para, una vez pasado el tiempo estipulado se cierren solo esos formularios y esos paneles y no toda la aplicación.

Espero que se entienda lo que quiero hacer y si no pues lo intento explicar otra vez.

Saludos.

kapcomx 08-02-2012 18:20:50

tiempo
 
de momento se me ocurre que en el evento onexit del panel actives un times con un intervalo que tu mismo puedes determinar. el la propiedad interval de este.

por ultimo programes en el ontimer del timer que se cierre el panel al cumplirse ese intervalo.:cool:

ElDioni 08-02-2012 19:38:42

Hola,

creo que no me he explicado bien, yo tengo varios paneles, los utilizo como si fueran distintas pantallas pero dentro del mismo formulario, por medio de un statusbar me voy moviendo por todos los paneles que tenga visibles en ese momento, hay un panel que quiero ocultar si no se está utilizando pero no se como saber si se está utilizando un panel u otro a no ser que en cada uno de los componentes que tenga el panel que quiero ocultar le ponga un código para reiniciar un timer en el onmousemove, por ejemplo. Quería saber si existe otra forma menos tediosa de conseguir lo que quiero.

Saludos.

Caral 08-02-2012 20:31:29

Hola
Por lo que entiendo tienes varios paneles.
Para que esten activos, osea en uso, tienen que estar visibles.
Si estan visibles pero no los quieres usar esperando cierto tiempo entonces los escondes.
Si es asi, aqui tienes un ejemplo sencillo.
Saludos

ElDioni 09-02-2012 12:59:48

Hola Caral, gracias por tu tiempo.

He probado lo que me propones, he tenido que modificar la comprobación del tiempo cuando llega al que hemos establecido de la siguiente manera:

Código Delphi [-]
  If TimeToStr(Time) = TimeToStr(Tiempo) then
    begin
      TPanel(comp).Visible:= False;
    end;

Porque cuando hacía la comprobación no los consideraba iguales, de todas formas no es realmente lo que quiero, digamos que de los tres paneles que me has dibujado en tu ejemplo estoy utilizando el panel1, me muevo por él, pincho en él o en algún componente que contenga, pero el panel2 y el panel3 no los estoy utilizando, pasado el tiempo establecido quiero que se me cierren el panel2 y el panel3 pero no el 1 que si que lo estoy utilizando.

Espero que se entienda.

Saludos.

Caral 09-02-2012 13:10:26

Hola
Usa el tag del panel.
Saludos

ElDioni 09-02-2012 16:41:52

:confused:, no se a que te refieres, dices que use el tag del panel, ¿como vigía?, por ejemplo, si estoy usando el panel1 a este le pongo el tag:=1 y a los demás el tag:=0, entonces pasado el tiempo miro los que tienen 0 y los cierro, ¿algo así?, si te refieres a eso se me ocurre que, si tengo abierto un panel en primer plano pero no lo estoy utilizando porque me he ido a tomar cafe, en realidad no lo estoy utilizando, por lo que se debería cerrar. Si cuando cambio de panel pongo el que tengo activo en 1 en el tag y el resto en 0 se me cerraran todos los que pongan 0 cuando llegue el tiempo deseado aunque los haya estado usando en el último segundo y lo que quiero es que no se cierren hasta que haya pasado un tiempo sin utilizarse.

A lo mejor es que no he pillado a que te referías con el tag.

Saludos.

Caral 09-02-2012 17:45:32

Hola
Pregunto:
Los usaras con el mouse ?.
Se podria hacer un procedimiento para que vea la posicion de raton, algo asi:

Código Delphi [-]
procedure TForm1.posicion;
 var
  pt:tpoint;
begin
 getcursorpos(pt);
 label1.Caption:= inttostr(pt.x)+'   '+inttostr(pt.y) ;
end;

Esto te dara la posicion x e Y del raton, con esto puedes saber si el raton esta encima del panel y cerrar los demas.
Saludos

ElDioni 09-02-2012 18:24:50

Te tengo que pedir perdón Caral porque te voy dando la información a cuentagotas, sí, utilizo el ratón para moverme por el panel y sus componentes, pero también el teclado, además el panel que estoy utilizando lo pongo en Align:=AlClient por lo que los demás se quedan detrás, entonces voy añadiendo los nombres de los paneles que tengo abiertos en un statusbar, al pulsar sobre el nombre del panel que quieres ver te lo trae al frente. tu solución valdría si los paneles tuvieran una posición fija cada uno, sabiendo la posición del panel y la del mouse.

Una solución que me sirvió una vez para una aplicación que quería que se cerrase si no se estaba utilizando fué la siguiente:

Código Delphi [-]
procedure TFrmMenuCompras.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
//RATON
if (Msg.message = WM_MOUSEMOVE) then
  begin
    timer1.Enabled:=false;
    timer1.Enabled:=true;
  end
// TECLAS
else
  begin
    // Pulsada tecla...
    if  (Msg.message = WM_KEYDOWN)     or (Msg.message = WM_KEYUP)       or
        (Msg.message = WM_SYSKEYDOWN)  or (Msg.message = WM_SYSKEYUP)    or
        (Msg.message = WM_ACTIVATE)    or (Msg.message = WM_NCACTIVATE)  or
        (Msg.message = WM_ACTIVATEAPP) or
        (Msg.message = WM_LBUTTONDOWN) or
        (Msg.message = WM_RBUTTONDOWN) or (Msg.message = WM_MBUTTONDOWN) then
      begin
        timer1.Enabled:=false;
        timer1.Enabled:=true;
      end;
  end;
end;

Pero esto era para cerrar la aplicación entera no una cierta parte de la aplicación.

Espero que así se entienda mejor.

ElDioni 13-02-2012 09:40:33

Hola,

quería especificar que además de querer cerrar los paneles que estabamos comentando, que se encuentran dentro de un mismo form, también quiero cerrar otros formularios cuando pase un tiempo determinado sin usarse.

Saludos.

ecfisa 13-02-2012 19:05:31

1 Archivos Adjunto(s)
Hola ElDioni.

Te agrego otra idea derivando una clase de TPanel, por ahí te puede servir...

Saludos.

Caral 13-02-2012 19:15:19

Hola
Quiero poner una queja formal.
Los codigos de mi amigo ecfisa me están dejando mal parado.:D:D:D;)
Asi no se vale.;)
Saludos
PD: Muy bueno amigo, muy bueno.:)

ElDioni 14-02-2012 10:25:16

Hola ecfisa,

muchas gracias por el código, está cojonudo, voy a adaptarlo a mi programa para ver como queda y os cuento, pero en principio, con el vistazo que le he dado así por encima, creo que me va a servir para lo que pretendía.

Gracias de nuevo, y a ti también Caral gracias por tu tiempo.

Saludos.

ElDioni 14-02-2012 10:52:38

Bueno, lo he estado probando y efectivamente me sirve y mucho, le he tenido que añadir el siguiente código porque sino no reiniciaba el contador del timer.

Código Delphi [-]
procedure TForm1.PanelEnter(Sender: TObject);
begin
  (Sender as TPanel).FTimer.Enabled:=false;
  (Sender as Tpanel).TimeToClose:= 10000;
  (Sender as TPanel).FTimer.Enabled:=true;
end;

Me faltaría poder cerrar el panel que tiene el foco si en realidad, aunque tenga el foco, no se está utilizando. Voy a ver si se me ocurre algo.

Saludos y gracias.


La franja horaria es GMT +2. Ahora son las 23:04:59.

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