Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   [TTimer] Ver tiempo actual para completar el ciclo de un Timer (https://www.clubdelphi.com/foros/showthread.php?t=92000)

MAXIUM 24-06-2017 01:37:37

[TTimer] Ver tiempo actual para completar el ciclo de un Timer
 
Hola la idea es la siguiente,

Si programo una tarea que se ejecuta cada 30.000 milesegundos en el evento OnTimer de un TTimer, ¿como puedo mostrar por pantalla cuantos milesegundos o segundos lleva hasta el momento para completar esos 30 segundos.

O explicado en otras palabras. Si se ejecuta cada 30 segundos una tarea o proceso, ¿como puedo ver en un TLabel lo siguiente?

...
22
23
24
25
26
27
...

dec 24-06-2017 18:23:48

Hola Maxium,

30.000 milisegundos son 30 segundos, estaremos de acuerdo. Pues bien, puedes usar una variable donde almacenar los segundos que se llevan "contados". Si quiere mostrarlos tal que: 1, 2, 3, 4, etc., en cada evento "Interval" del Timer tendrás que incrementar el valor de dicha variable. Si quieres mostrar los segundos tal que: 29, 28, 27, etc., deberás hacer lo contrario, esto es, decrementar el valor de la variable. En en primer caso la variable parte de 0 y en el segundo caso parte de 30. Dicha variable podrás mostrarla en un "Label" o en el control que prefieras.

ecfisa 25-06-2017 14:36:48

Hola.

A mi me queda la duda de si el conteo debe mostrar los segundos transcurridos o faltantes para cada temporización del timer, es decir para cada vez que se dispare el evento OnTimer. Si eso es lo que deseas, vas a necesitar un segundo temporizador para que realize la tarea del conteo entre eventos (del modo que te comentó dec) ya que el TTimer no contempla esa posibilidad.

Un ejemplo:
Código Delphi [-]
...
var
  Lapso: Integer = 0; // contador 

// OnTimer 30 segundos
procedure TForm1.Timer30Timer(Sender: TObject);
begin
  try
    ShowMessage( '30 segundos' ); // Acción que se desata cada 30 segs.
  finally
    Lapso := 0;
  end;
end;

// OnTimer 1 segundo
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Inc( Lapso );
  Label1.Caption := Format( '%d s.', [Lapso] );
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  Timer30.Interval := 30000; // 30 s
  Timer30.Enabled  := True;
  Timer1.Interval := 1000;  // 1 s
  Timer1.Enabled  := True;
end;

Saludos :)

dec 25-06-2017 19:41:53

Hola a todos,

Yo, lo que diga ecfisa. :D

ecfisa 25-06-2017 20:26:51

Cita:

Empezado por dec (Mensaje 518700)
Hola a todos,

Yo, lo que diga ecfisa. :D

¡ No hombre !:D que bién pude equivocar la interpretación y él querer otra cosa, ya nos especificará MAXIUM que es lo que anda necesitando.

Saludos :)

dec 25-06-2017 21:48:27

¡Hola a todos!

Cita:

Empezado por ecfisa (Mensaje 518701)
¡ No hombre !:D que bién pude equivocar la interpretación y él querer otra cosa, ya nos especificará MAXIUM que es lo que anda necesitando.

Saludos :)

Nada, nada... excusas. Yo lo que digas tú hasta el final. ¡Lo digo muy en serio! :) :D

MAXIUM 27-06-2017 03:16:43

Hola que tal,

Me refería a los segundos transcurridos.

Sin embargo, es útil saber el proceso inverso para ver los segundos o tiempo faltante, y usarlo en algún proyecto futuro. Sino es por mi, será por alguien más.

Por lo tanto, agradezco vuestra colaboración ^\||/

Ñuño Martínez 27-06-2017 10:45:33

Lo más "fácil" sería usar dos TTimer: uno para los 30 segundos y otro para cada segundo, tal como comenta ecfisa, pero yo usaría sólo un TTimer que se activara cada segundo y fuera actualizando una variable (o el propio "Tag" del componente) y el TLabel hasta llegar a treinta, más o menos así:
Código Delphi [-]
INTERFACE

  TYPE
  (* El formulario. *)
    TMiForm = CLASS (TForm)
      ElTimer: TTimer;
      ElLabel: TLabel;

      PROCEDURE onTimerTick (Sender: TObject);
    { ... }
    PRIVATE
      fContador: INTEGER = 0;
    { ... }
    END;

IMPLEMENTATION

{ ... }

  PROCEDURE TMiForm.onTimerTick (Sender: TObject);
  BEGIN
    INC (fContador);
    IF fContador >= 30 THEN
    BEGIN
    { Aquí se hace la operación que se requiera, o se activa un evento, o lo que sea
       y se reinicia el contador. }
      fContador := 0
    END;
    ElLabel.Caption := IntToStr (fContador)
  END;

{ ... }
Las ventajas son que usas menos recursos (y aún menos si en vez del campo fContador usas la propiedad Tag del TTimer), pero principamente evitaras tener que sincronizar dos TTimer diferentes, que puede parecer que no pero puede dar problemas.


La franja horaria es GMT +2. Ahora son las 21:48:25.

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