PDA

Ver la Versión Completa : como crear un cronometro completo


kurono
03-08-2008, 03:51:12
hola amigos del foro me gustaria hacer un cronometro completo osea que me muestre tanto los segundo como los minuto trascurrido como lo hace un cronometro real de esto que usan los entrenadores deportivo

Delphius
03-08-2008, 03:58:50
Hola kurono, ¿y el problema es?

Disculpa si suena un tanto molesto, pero... ¿intentaste avanzar en algo? tienes algo de código hecho?

Piensa en funciones DecodeTime, Now, TTimer, TimeToStr, etc.

Una pista, debes obtener la diferencia entre la fecha actual y la desde el momento en que se inicia el conteo.

Kurono me gustaria que dieras el primer paso en intentarlo por favor. Además hay ejemplos de como hacer un cronómetro.

Saludos,

kurono
03-08-2008, 04:22:55
hola amigo delphius esto es lo que tengo

public
{ Public declarations }
segundos:integer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin

segundos:=segundos+1;
label1.Caption:=inttostr(segundos);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
segundos:=0;
timer1.Enabled:=true;
end;

end.

pues esto me muestra los segundo pero cuando llega a 60 segundo me gustaria que mostrara que transcurrio un minuto

Delphius
03-08-2008, 04:31:04
OK, bueno... ahora a esos segundos de más hay que convertirlos en minutos y luego a los minutos en horas...

Esto se puede hacer con simples operaciones de sumas, restas, multiplicación y modulos.

los minutos se obtienen calculando la parte entera de la división entre los segundos y 60, luego se vuelve a calcular los segundos sobrantes. Luego se obtiene las horas... con el mismo proceso: la división de los minutos en 60.

¿Se entiende?

minutos = segundos div 60
segundos = segundos - (minutos x 60)

horas = minutos div 60

Ahora, también nos podemos evitar estos tediosos calculos llevando tres contadores... uno para los segundos, otro para las horas y otro para los minutos. La idea es que cuando el contador de los segundos se ponga en 60, el de los minutos en 1, y el contador de segundos se restablece a cero.
El mismo proceso se lleva a cabo para las horas.


Existe otra alternativa, aun más simple... Como he dicho: emplear Now y calcular la diferencia con una hora inicial de conteo.

Sigue pensando.

Saludos,

kurono
03-08-2008, 04:42:52
mmmm... amigo delphius dices que con el now se hace mas simple pero no se utilizarlo pues intentare con los 3 contadores

Delphius
03-08-2008, 04:53:39
mmmm... amigo delphius dices que con el now se hace mas simple pero no se utilizarlo pues intentare con los 3 contadores

¿Y digo yo? Porque no pruebas con F1? Simplemente basta con hacer algo como esto:

algo := Now;

por ejemplo...

ShowMessage('la hora actual es : ' TimeToStr(Now));

Now es una función que regresa la fecha y hora actual. TimeToStr() es una función que convierte la hora en string... en formato hh mm ss.;)

de igual forma piensa... ¿que diferencia hay entre Now que calculé hace 5 horas con uno que calculé ahora? ¿Se entiende la idea?;)

Saludos,

kurono
03-08-2008, 04:59:39
si lo entiendo pero ya me esta saliendo muy bien con los tres contadores cuando termine mostrare el codigo

kurono
03-08-2008, 05:25:28
amigo delphius ya termine el cronometro y funciona perfectamente

public
{ Public declarations }
segundos,minuto,hora:integer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
segundos:=segundos+1;
label1.Caption:=inttostr(segundos);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
minuto:=0;
segundos:=0;
hora:=0;
timer1.Enabled:=true;
timer2.Enabled:=true;
timer3.Enabled:=true;

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
minuto:=minuto+1;
label2.Caption:=inttostr(minuto);
segundos:=00;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
hora:=hora+1;
label3.Caption:=inttostr(hora);
end;

end.

pero como decias antes hay forma mas facil de hacer y me estaba preguntando si no habra un componente que haga estoy solo para reducir el tiempo de programacion en otra ocacion

egostar
03-08-2008, 05:39:13
Hola

:)

Salud OS

Delphius
03-08-2008, 05:41:55
amigo delphius ya termine el cronometro y funciona perfectamente

Código Delphi [-] (http://www.clubdelphi.com/foros/#) public { Public declarations } segundos,minuto,hora:integer; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin segundos:=segundos+1; label1.Caption:=inttostr(segundos); end; procedure TForm1.Button1Click(Sender: TObject); begin minuto:=0; segundos:=0; hora:=0; timer1.Enabled:=true; timer2.Enabled:=true; timer3.Enabled:=true; end; procedure TForm1.Timer2Timer(Sender: TObject); begin minuto:=minuto+1; label2.Caption:=inttostr(minuto); segundos:=00; end; procedure TForm1.Timer3Timer(Sender: TObject); begin hora:=hora+1; label3.Caption:=inttostr(hora); end; end.


pero como decias antes hay forma mas facil de hacer y me estaba preguntando si no habra un componente que haga estoy solo para reducir el tiempo de programacion en otra ocacion

Tranquilamente lo puedes hacer con un solo Timer.
Bueno te doy una solución implementando el Now.

1. En el momento en que se desee dar comienzo al cronómotro guardamos en una variable TDateTime la hora actual:

HoraInicial := Now;

2. En el evento onTimer ponemos algo como esto:

cronometro: string;
..

cronometro := TimeToStr(Now - HoraInicial);

luego, ya es cuestión de mostrarlo... Por ejemplo en la barra de título:

Form1.Caption := cronometro;

Para que funcione adecuadamente no está demás decir que la propiedad Interval del TTimer debe ser de un segundo, o 1000 milésimas.

Saludos,

kurono
03-08-2008, 05:46:41
ok mucha gracia delphius lo probare haora

kurono
03-08-2008, 06:01:17
amigo delphius acabo de probarel ejemplo con el now todo funciona bien pero cuando inicio el cronometro inicia de esta forma 12:00:00 deberia inicial todo en cero osea asi 00:00:00

Delphius
03-08-2008, 06:09:43
¿estás seguro?:confused: Prueba con esto:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
HoraInicial: TDateTime;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
HoraInicial := Now;
Timer1.Enabled := true;
Button2.Enabled := True;
Button1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Caption := 'El cronometro cuenta : ' + TimeToStr(Now - HoraInicial);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled := False;
Button1.Enabled := True;
Button2.Enabled := True;
end;

end.


Debería funcionar. A me funciona apropiadamente.
Saludos,

kurono
03-08-2008, 06:18:32
amigo delphius todavia sigue iniciando asi 12:00:00 pero creo que el error tiene que ver con la zona horaria que tengo

kurono
03-08-2008, 06:22:38
amigo delphius ya resolvi el problema era justamente eso la zona horaria que tenia

FGarcia
03-08-2008, 06:32:26
Bueno, ya resolviste tu problema... de todos modos aqui esta mi solucion. Tiene un pequeño problema con la actualizacion de la etiqueta (parpadeo) pero eso se soluciona con algo llamado Double buffered me parece, solo que no se como se implementa.:D:D