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