Free Web Hosting by Netfirms
Web Hosting by Netfirms | Free Domain Names by Netfirms

Creación de un timer en tiempo de ejecución


El siguiente ejemplo muestra cómo crear un timer ‘interno’, en respuesta a la pulsación de un botón. En el ejemplo se muestra la hora en la barra de título del formulario donde está el botón, durante diez segundos.

El form principal (y único) de la aplicación se ve en la figura. El código que se ejecuta en respuesta al evento OnClick del botón es el siguiente:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(Reloj) then FreeAndNil(Reloj);
  Reloj:=TTimer.Create(Self);
  Reloj.Interval:=1000;
  Reloj.OnTimer:= prTimer;
  TiempoDeParada:= Time+10/86400; //diez segundos mas tarde se termina
  Reloj.enabled:=true;
end;

Lo primero es controlar que no haya un reloj asignado ya a la variable Reloj, porque entonces crearíamos otro y perderíamos la referencia al anterior. Por lo tanto, si hay un timer asignado lo destruimos antes de crear el nuevo.

Estoy usando un par de variables: Reloj, de tipo TTimer, y TiempoDeParada, de tipo TDateTime. Estas variables están declaradas en la parte privada del form, como se ve en el siguiente fragmento:

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    TiempoDeParada: TDateTime;
    Reloj: TTimer;
    procedure prTimer(Sender: TObject);
  public
  end;

Muestro la declaración completa para aprovechar e introducir también el procedimiento que se llamará en respuesta al evento OnTimer del timer: prTimer. Este procedimiento es el que realiza el trabajo, y es llamado en este ejemplo cada segundo (Interval = 1000):

procedure TForm1.prTimer(Sender: TObject);
begin
  caption:= TimeToStr(time);
  if Time>TiempoDeParada then
  begin
    Reloj.Enabled:= false;
    FreeAndNil(Reloj);
    Caption:= 'Tiempo!';
  end;
end;

Como vemos, simplemente muestra la hora actual usando la función Time. Luego comprueba la condición de terminación, en este caso que la hora sea mayor que la estipulada para terminar; si se llega a esa hora detiene el timer, lo destruye y escribe en el título un mensaje indicando que llegamos a la hora especificada.

Una sola precaución más: cuando se cierra la ventana es conveniente ‘apagar’ el timer para no tener problemas. Esto se hace en el evento OnClose del form:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(Reloj) then FreeAndNil(Reloj);
end;

Eso es todo. No es que este ejemplo sea muy útil, pero la técnica tiene su aplicación en muchas situaciones reales.

El código se puede descargar de este enlace.