Идущие часы(нужна помощь со стрелками)

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Идущие часы(нужна помощь со стрелками)

Сообщение Водород » 12.05.2010 12:35:24

Народ по проекту мне дали сделать идущие часы с 3 стрелками вот что я наклипал
Код: Выделить всё
Program fdgfaf;
uses graph,crt;
var gd, gm, r, a, x, y: integer;
x1,y1,x3,y3:smallint;
c:char;
Begin
gd:=vga;
gm:=2;
Initgraph(gd,gm,'');
r:=174;
setcolor(15);
setfillstyle(1,12);
Circle(300,250,200);
Circle(300,250,180);
floodfill(110,250,15);
setcolor(15);
setfillstyle(1,10);
circle(300,250,174);
floodfill(126,250,15);
setcolor(15);
setfillstyle(1,15);
floodfill(299,249,15);
setfillstyle(1,12);
bar(150,247,170,253);
bar(435,247,455,253);
bar(297,389,303,409);
bar(297,95,303,115);
a:=0;
repeat
x3:=300+round((r-55)*sin(a*pi/180));
  y3:=250-round((r-55)*cos(a*pi/180));
  setcolor(0);
  line(300,250,x3,y3);
  delay(60000);
  setcolor(15);
  line(300,250,x3,y3);
  a:=a+6;
  if keypressed then c:=readkey;
until c=#27;
repeat
  x:=300+round((r-25)*sin(a*pi/180));
  y:=250-round((r-25)*cos(a*pi/180));
  setcolor(14);
  line(300,250,x,y);
  delay(1000);
  setcolor(15);
  line(300,250,x,y);
  a:=a+6;
if keypressed then c:=readkey;
until c=#27;

readln;
closegraph;
end.

Последний repeat until не удаёться запустить т.е одна стрелка(минутная) у меня работает а вторая ни в какую не хочет.Если я меняю местами то работаёт начинает работать сикундная а минутная нефига, уже всё перепробывал подскжаите пожалуйсто!! и ещё мне нужно сделать так что бы ещё и дата выводилась ума не приложу как(((Я буду оченб благодарен если поможете!
Водород
новенький
 
Сообщения: 28
Зарегистрирован: 12.05.2010 12:29:35

Re: Идущие часы(нужна помощь со стрелками)

Сообщение AbakAngelSoft » 12.05.2010 12:46:29

а кто вам сказал что циклы выполняются параллельно?
по вашему коду сначала будет выполнен первый цикл до тех пор пока не нажмут esc, а только потом начнет выполняться второй.
Либо сделайте вложенные циклы, либо выносите оба цикла в потоки - что бы получить паралельное выполнение.
Аватара пользователя
AbakAngelSoft
постоялец
 
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар

Re: Идущие часы(нужна помощь со стрелками)

Сообщение Водород » 12.05.2010 12:49:01

я делал так
Код: Выделить всё
repeat
x3:=300+round((r-55)*sin(a*pi/180));
  y3:=250-round((r-55)*cos(a*pi/180));
  setcolor(0);
  line(300,250,x3,y3);
  delay(60000);
  setcolor(15);
  line(300,250,x3,y3);
  a:=a+6;
x:=300+round((r-25)*sin(a*pi/180));
  y:=250-round((r-25)*cos(a*pi/180));
  setcolor(14);
  line(300,250,x,y);
  delay(1000);
  setcolor(15);
  line(300,250,x,y);
  a:=a+6;

но у меня не получалось может что то не так делаю подскажи если знаешь
Водород
новенький
 
Сообщения: 28
Зарегистрирован: 12.05.2010 12:29:35

Re: Идущие часы(нужна помощь со стрелками)

Сообщение FeodoR » 12.05.2010 12:59:54

Ну дык конечно. Потому как программа вертится в первом цикле, рисует чего-то. Потом цикл прерывается по нажатию клавиши и происходит переход во второй цикл. Так как написано работать не будет.

Надо сделать отрисовку стрелок за один проход в одном цикле. Тогда всё будет ОК.

Теперь про время. Часы в этом примере ходят абы как. То есть без привязки к любому времени.
Есть же функции GetTime, GetSystemTime. Причём для Вашего случая GetSystemTime предпочтительнее, ибо там уже есть разбивка на часы, минуты, секунды.

Добавлено спустя 52 секунды:
И не надо делать Delay(n). При этом выполнение программы стопорится. Цикл и только цикл. Через 40 минут напишу.

Добавлено спустя 1 час 9 минут 49 секунд:
Я бы сделал вот примерно так. Но код на работоспособность не проверял. Проблемы с графиков в Linux... Но всё компилируется. :)
Процедуру отрисовки стрелок специально в процедуру не выношу. Хотя оч. хочется.
Код: Выделить всё
Program fdgfaf;
uses graph, crt, SysUtils;
var
  c : char;
  T : TSystemTime;
  gd, gm, r, x, y        : integer;
  H, PrevH, PrevM, PrevS : Word;
const
Grd : double=pi/180;

{$R *.res}

BEGIN
gd:=vga;
gm:=2;
InitGraph(gd,gm,'');
r:=174;
SetColor(15);
SetFillStyle(1,12);
Circle(300,250,200);
Circle(300,250,180);
FloodFill(110,250,15);
SetColor(15);
SetFillStyle(1,10);
Circle(300,250,174);
FloodFill(126,250,15);
SetColor(15);
SetFillStyle(1,15);
FloodFill(299,249,15);
SetFillStyle(1,12);
Bar(150,247,170,253);
Bar(435,247,455,253);
Bar(297,389,303,409);
Bar(297,95,303,115);
repeat
  GetLocalTime(T);
  if T.Hour>=12
  then H:=T.Hour-12
  else H:=T.Hour;
  if PrevH<>T.Hour
  then
   begin
    x:=300+round((r-55)*sin(PrevH*30*Grd));
    y:=250-round((r-55)*cos(PrevH*30*Grd));
    SetColor(15);
    Line(300,250,x,y);
    PrevH:=T.Hour;
   end;
  if PrevM<>T.Minute
  then
   begin
    x:=300+Round((r-55)*sin(PrevM*60*Grd));
    y:=250-Round((r-55)*cos(PrevM*60*Grd));
    SetColor(15);
    Line(300,250,x,y);
    PrevM:=T.Minute;
   end;
  if PrevS<>T.Second
  then
   begin
    x:=300+Round((r-25)*sin(T.Second*Grd));
    y:=250-Round((r-25)*cos(T.Second*Grd));
    SetColor(15);
    Line(300,250,x,y);
   end;
  x:=300+Round((r-55)*sin(H*30*Grd));
  y:=250-Round((r-55)*cos(H*30*Grd));
  SetColor(0);
  Line(300,250,x,y);
  x:=300+Round((r-55)*sin(T.Minute*60*Grd));
  y:=250-Round((r-55)*cos(T.Minute*60*Grd));
  SetColor(0);
  Line(300,250,x,y);
  x:=300+Round((r-25)*sin(T.Second*Grd));
  y:=250-Round((r-25)*cos(T.Second*Grd));
  SetColor(14);
  Line(300,250,x,y);
  Delay(1000);
  if keypressed
  then c:=readkey;
until c=#27;
ReadLn;
CloseGraph;
END.
Аватара пользователя
FeodoR
новенький
 
Сообщения: 59
Зарегистрирован: 16.04.2010 12:11:34
Откуда: MSK, ЮАО


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru