Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2010, 16:49   #1
Александр Маркелов
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 14
По умолчанию Секундомер на Delphi

Есть секундомер. Он действует так: Пуск-Стоп. А как "засечь" промежуточный результат?
Александр Маркелов вне форума Ответить с цитированием
Старый 25.05.2010, 16:54   #2
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Используй таймер и считай секунды (или сотые доли секунд для полного счастия!!!). Нажатие "Пуск" - запускает таймер; Нажатие "Стоп" - останавливает таймер. Вывод результата - хорошо смотрится на цифровом сегментном индикаторе...
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 25.05.2010, 16:55   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

взять разницу между текущим временем и началом (стартовым временем)...

А вообще, чтобы конкретно и правильно ответить на Ваш вопрос надо видеть, как Вы создали свой секундомер, что происходит при действиях "Пуск" и "Стоп"...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.05.2010, 16:58   #4
Александр Маркелов
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 14
По умолчанию

В том-то и дело: если я нажму "стоп" таймер остановится, а нужно чтоб он продолжил работу. Один финишировал(промежуточный результат), а остальные еще бегут!
Александр Маркелов вне форума Ответить с цитированием
Старый 25.05.2010, 16:58   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В любом случае думаю автору нужна будет функция Now, возвращающая текущее время-дату.
А насчет как засечь, тут как правильно сказал Серж - "надо видеть, как Вы создали свой секундомер" т.е. что использовано в коде.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.05.2010, 17:04   #6
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Извините, но не совсем понимаю зачем выполнять какие-то вычисления между началом(пуском) и текущим системным временем. Пускаем таймер и по кнопке "Стоп" фиксируем промежуточные результаты. Нужно несколько показаний - делаем несколько индикаторов (да хоть динамически)
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 25.05.2010, 17:06   #7
Александр Маркелов
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 14
По умолчанию

Вот исходник:
unit Main;

interface

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

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

var
Form1: TForm1;
msec, sec, min:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=not Timer1.Enabled;
if Timer1.Enabled then button1.Caption:='Стоп'
else button1.Caption:='Старт'
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var s:string;
begin
if msec=9then inc(sec);//если кол-во миллисекунд равно девяти, то
//добавляем 1 к секундам
if msec<9then inc(msec)//если кол-во миллисекунд меньше 9
//то добавляем 1 к миллисекундам
else msec:=0;//иначе обнуляем миллисекунду
if sec=60 then begin
sec:=0;
inc(min);// если кол-во секунд 60, то обнуляем секунды и
// добавляем 1 к минутам
end;
s:=IntToStr(min)+':';//меняем значение переменной s на кол-во минут
if sec<10 then s:=s+'0'+IntToStr(sec)//если кол-во секунд меньше 10,
//то добавляем к уже имеющемуся s ноль и кол-во секунд
else
s:=s+IntToStr(sec);//в противном случае добавляем только
//кол-во секунд
s:=s+','; //добавляем к s запятую
if msec<9 then s:=s+IntToStr(msec)
else
s:=s+IntToStr(msec);
Label1.Caption:=s;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=false;//останавливаем таймер
msec:=0;
sec:=0;
min:=0;//обнуляем все переменные
Label1.Caption:='0:00,0';
Button1.Caption:='Старт ';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:='0:00,0';
Button1.Caption:='Старт';
Button2.Caption:='Сброс';
Timer1.Enabled:=false
end;

end.
Александр Маркелов вне форума Ответить с цитированием
Старый 25.05.2010, 21:35   #8
Fuadik
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 37
По умолчанию Секундомер

Попробуйте код. Поместите на форму 2 Лейбла, Таймер, 1 Эдит, 2 Буттона:
1 Буттон - Пуск, 2 Буттон - засечка времени, 1 BitBtn Kind - Close.
#
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
BitBtn1: TBitBtn;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit1Exit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
NowTime, MyTime: TTime;
MyEdit: array[1..10] of TEdit;
n, i, t: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
Timer1.Enabled:=true;
NowTime:=Time;
Label1.Caption:=TimeToStr(NowTime);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label2.Caption:=TimeToStr(Now-NowTime);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
for i:=1 to n do
if MyEdit[i].Text='0' then
begin
MyEdit[i].Text:=Label2.Caption;
Exit;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
t:=30;
Button1.Caption:='Пуск';
Button2.Caption:='Время'
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then Button1.SetFocus;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
if n>0 then
for i:=1 to n do
begin
MyEdit[i]:=TEdit.Create(Self);
MyEdit[i].Parent:=Form1;
MyEdit[i].Top:=t*i;
MyEdit[i].Left:=150;
MyEdit[i].Text:='0';
end;
end;

end.
#
n - кол-во участников. В Эдит1 вводите кол-во участников (например, 3). Нажмёте Enter - появятся 3 Эдита. Нажмете Буттон1 - запустится таймер. Нажмёте Буттон2 - в Эдитах будет время, прошедшее с момента нажатия на Буттон1.

Последний раз редактировалось Fuadik; 26.05.2010 в 18:38. Причина: Добавление
Fuadik вне форума Ответить с цитированием
Старый 27.05.2010, 17:20   #9
Александр Маркелов
Пользователь
 
Регистрация: 25.05.2010
Сообщений: 14
По умолчанию

Как бы работает, но... ввожу количество участников, нажимаю Enter - никакой реакции. Edit-ы не появляются. И еще - нужны "десятки"(Десятые доли секунд).
Александр Маркелов вне форума Ответить с цитированием
Старый 27.05.2010, 20:06   #10
Fuadik
Пользователь
 
Регистрация: 22.01.2010
Сообщений: 37
По умолчанию

Все работает, сейчас проверил. После того, как вы поместите на форму указанные компоненты, скопируйте мой код в ваш Unit1. Потом кликните на Буттон1, Буттон2, Эдит1. В инспекторе объектов для Эдит1 кликните OnExit, OnKeyPress, для Таймера OnTimer, для Формы OnCreate. Все заработает. А с "десятками" разберётесь потом. Сообщите, если заработает.
Fuadik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Секундомер girkoff Общие вопросы C/C++ 3 26.12.2009 12:30
Секундомер aesoem Общие вопросы Delphi 10 28.01.2008 19:25
секундомер itisiam Общие вопросы Delphi 6 31.05.2007 16:55