Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ секундомер графический

Автор: striker 7.06.2009 0:59

Нужен секундомер в графике. Циферблат, нажатие кнопки - старт/стоп
Где-то недавно видел готовый, нужен для одной идеи.
Помогите найти пожалуйста и подскажите

Автор: volvo 7.06.2009 1:04

Это имеешь в виду: http://forum.pascal.net.ru/index.php?s=&showtopic=15581&view=findpost&p=90836 ? Это именно часы, но секундомер пишется по тому же принципу.

Автор: striker 7.06.2009 1:16

А где можно модули скачать для неё?
Бета-версия ругается на модули, а с WinApi вообще непонятно, там вообще много ругательств smile.gif

Автор: volvo 7.06.2009 2:21

А, у тебя Турбо Паскаль... Ясно. Тогда за основу можешь взять вот это (я не знаю, как у тебя замеряется время, что еще должно происходить, вот код, который просто рисует секундомер, и останавливает его по нажатию любой кнопки на клавиатуре...)

uses crt, dos, graph;

const
R = 100;
angle = (360 / 60) * pi / 180;

procedure Draw(CX, CY: integer);
var
i: integer;
len: integer;
begin
setcolor(white);
circle(cx, cy, R);
for i := 0 to 59 do begin
if i mod 5 = 0 then begin
setcolor(lightred); len := 5;
end
else begin
setcolor(white); len := 3;
end;

line(
cx + Trunc((R - len) * cos(i*angle)),
cy - Trunc((R - len) * sin(i*angle)),
cx + Trunc((R + len) * cos(i*angle)),
cy - Trunc((R + len) * sin(i*angle))
);
end;
end;

procedure DrawArrow(CX, CY: integer; sec: integer);
const
ArrowLen = 0.8;
begin
line(
cx, cy,
cx + Trunc(ArrowLen*R * cos(pi/2 - sec*angle)),
cy - Trunc(ArrowLen*R * sin(pi/2 - sec*angle))
);
end;

Function GetTime: LongInt;
Var
h, m, s, ms: Word;
R: longint;
begin
Dos.GetTime(h, m, s, ms);
GetTime := ms + 100 * (s + 60 * (longint(m) + 60 * h));
end;

var
gd, gm: integer;
i: integer;
curr_time: longint;
stop: boolean;

begin
gd := detect;
initgraph(gd, gm, '');
Draw(getmaxx div 2, getmaxy div 2);
setwritemode(xorput);

i := 0; stop := false;
repeat
DrawArrow(getmaxx div 2, getmaxy div 2, i mod 60);

curr_time := GetTime;
while GetTime - curr_time < 100 do; { просто ждем 1 секунду }
if keypressed then begin
stop := true; while keypressed do readkey;
end;

DrawArrow(getmaxx div 2, getmaxy div 2, i mod 60);
inc(i);
until stop;

readln;
closegraph;
end.
Чтобы оно запускалось повторно - надо "обернуть" это все еще одним циклом...

Автор: striker 7.06.2009 14:14

Спасибо большое!

Добавил цикл. Только вот когда нажимаешь кнопку для
остановки стрелка пропадает, потом нажимаю для старта - появляется. Куда добавить
чтобы она в последнем положении замирала?


Добавлено через 11 мин.

А, разобрался
Ещё немного
нагло. Не встречал электронный, т.е цифровой секундомер в графическом режиме
т.е цифры большие на экране считают?

Автор: volvo 7.06.2009 14:27

Я бы сделал так:

begin
gd := detect;
initgraph(gd, gm, '');
Draw(getmaxx div 2, getmaxy div 2);
setwritemode(xorput);

i := 0;
repeat
stop := false;
repeat
DrawArrow(getmaxx div 2, getmaxy div 2, i mod 60);

curr_time := GetTime;
while GetTime - curr_time < 100 do;
if keypressed then begin
stop := true; while keypressed do readkey;
end;

if not stop then begin
DrawArrow(getmaxx div 2, getmaxy div 2, i mod 60);
inc(i);
end;
until stop;

while not keypressed do;
finished := readkey = #27;
DrawArrow(getmaxx div 2, getmaxy div 2, i mod 60);
until finished;
closegraph;
end.
Нажатие Esc в положении Stop = выход из программы... Для повторного старта - любая другая клавиша...

Добавлено через 52 сек.
Цитата
Не встречал электронный, т.е цифровой секундомер в графическом режиме т.е цифры большие на экране считают?
Готовый - не встречал, семисегментные индикаторы делал сам...

Автор: striker 7.06.2009 14:32

А что такое семисегментные?

Автор: volvo 7.06.2009 14:35

Каждая цифра состоит из 7-ми сегментов:
http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B8%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80

Если надо, то см. здесь: http://forum.sources.ru/index.php?showtopic=272151&st=0&#entry2263928

Автор: striker 7.06.2009 14:42

Спасибо.
А не подскажешь почему у меня при запуске в TP экран сразу сворачивается? blink.gif

Автор: volvo 7.06.2009 14:44

Не знаю, у меня ничего не сворачивается... Можешь попробовать добавить

g_driver := detect;
первой строкой, может от этого?
P.S. Вопросы по другим программам - не здесь, договорились? Здесь - только о секундомере со стрелкой...

Автор: striker 7.06.2009 14:49

ок smile.gif