La clase es simple:
type
TMedirTiempo=class(TObject)
private
FInicio:TTime;
FFinaliza:TTime;
FTranscurrido:TTime;
public
constructor Create (Owner:TComponent);
function Iniciar:TTime;
function Finalizar:TTime;
function Transcurrido:TTime;
end;
Cómo estoy comenzando a implementar clases, luego de leer bastante, voy a explicar un poco algunas cosas que la mayoría de los colegas programadores ya saben, pero los que retomamos la programación luego de muchos años, no.
Por ejemplo, la clase la definimos como class(TObject) porque es una clase que no hereda de ninguna otra clase y la más "primitiva" es TObject. Ahora:
TMedirTiempo=class así sin TObject también es válido, pero no recomendado.
FInicio es un campo (Field) por eso se acostumbra a empezar con la letra F; los campos son variables que pertenecen a una clase. Si se declaran en la "sección" (en realidad no es sección aunque lo aparenta muy bien, private es un identificador) private solo podrá se accedido por otros miembros de la clase y clases heredadas pero no por la instancia de la clase, por ejemplo:
var
Medidor:TMedirTiempo;
begin
Medir:=TMedirTiempo.Create(nil);
Medir.Finicio:= // esto no se puede.
¿Por qué usamos un constructor? Porque en él inicializamos los campos, pero muchas veces no es necesario definirlo, en tal caso se utiliza el heredado de TObject. Y sí, el constructor es público, lo mismo que las funciones, lo que implica que se pueden invocar en la unidad donde instanciamos la clase.
Hasta aquí la interfaz, vamos ahora a la implementación de la clase.
constructor TMedirTiempo.Create(Owner: TComponent);
begin
FInicio:=StrToTime('0');
FFinaliza:=StrToTime('0');
FTranscurrido:=StrToTime('0');
end;
function TMedirTiempo.Iniciar: TTime;
begin
FInicio:=Now;
end;
function TMedirTiempo.Finalizar: TTime;
begin
FFinaliza:=Now;
end;
function TMedirTiempo.Transcurrido: TTime;
begin
FTranscurrido:=FFinaliza-FInicio;
Result:=FTranscurrido;
end;
Y para utilizarla es muy simple, por ejemplo:
Procedure CargarSList;
var
MedirTiempo:TMedirTiempo;
sl:TStringList;
i:Integer;
begin
sl:=TStringList.Create;
MedirTiempo:=TMedirTiempo.Create(nil);
MedirTiempo.Iniciar;
for i:=1 to 100000 do
sl.Add(IntToStr(i));
MedirTiempo.Finalizar;
ShowMessage('Tiempo transcurrido: '+TimeToStr(MedirTiempo.Transcurrido));
sl.Free;
MedirTiempo.Free;
end;
También podríamos mostrar la hora de inicio y fin de la medición, porque ambas son funciones que devuelven el tiempo.
Puede pasar (y pasa) que el tiempo es menor a un segundo, entonces se muestra 0 (cero). Una opción para agregar los milisegundos es utilizar la misma función TimeToStr (que se ubica en la unidad DateUtils) con la opción FormatSettings.
Sería algo así:
Procedure CargarSList;
var
MedirTiempo:TMedirTiempo;
sl:TStringList;
i:Integer;
fs:TFormatSettings;
begin
fs:=DefaultFormatSettings;
fs.LongTimeFormat:='hh:nn:ss.zzz';
sl:=TStringList.Create;
MedirTiempo:=TMedirTiempo.Create(nil);
MedirTiempo.Iniciar;
for i:=1 to 100000 do
sl.Add(IntToStr(i));
MedirTiempo.Finalizar;
ShowMessage('Tiempo transcurrido: '+TimeToStr(MedirTiempo.Transcurrido,fs));
sl.Free;
MedirTiempo.Free;
end;
TFormatSettings es un registro (record) por lo tanto ni se crea ni se libera.
No hay comentarios:
Publicar un comentario