Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 22.11.2010, 19:37   #1 (permalink)
zena
Member
 
Регистрация: 11.11.2010
Сообщений: 85
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 20
По умолчанию Создание часов в паскале

Помогите доработать часы в паскале. Нужно использовать в программе delay(задержка). У меня в программе при вставке этого оператора почему-то выдаёт ошибку, что delay-неизвестный идентификатор.
Код:
program jfj;
uses graphABC;
 var
 x,y:integer;
 r:word;
begin
circle(250,250,70);
circle(250,250,7);
Line (250,250,210,290);
Line (250,250, 290, 210);
line (250,250,280,200)
end.
zena вне форума   Ответить с цитированием

Старый 22.11.2010, 19:37
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Многие этим интересовались, например тут

Самодельный MP3 плеер на 100 часов музыки
Вопросы по ремонту электронных часов
Ремонт автомобильных часов АЧК-10

Старый 22.11.2010, 21:42   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от zena Посмотреть сообщение
Помогите доработать часы в паскале. Нужно использовать в программе delay(задержка). У меня в программе при вставке этого оператора почему-то выдаёт ошибку, что delay-неизвестный идентификатор.
Естественно, выдает ошибку. Потому что Delay - это процедура модуля CRT, а у Вас этот модуль не присоединен.
Vladimir_S вне форума   Ответить с цитированием
Старый 22.11.2010, 23:38   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну вот Вам часы:
Код:
program jfj;
uses graph,CRT,DOS;
 var
 i:integer;
 X1,X2,Y1,Y2,H,M,S,S100:word;
 SS:String;
begin
 {Здесь нужно инициализировать графический режим}
 REPEAT
  ClearDevice;
  SetColor(Yellow);
  SetLineStyle(SolidLn,0,ThickWidth);
  Circle(320,240,200);
  SetTextStyle(DefaultFont,HorizDir,2);
  SetTextJustify(CenterText,CenterText);
  For i:=1 to 12 do
   begin
    X1:=320+ROUND(180*Sin(30*i*Pi/180));
    X2:=320+ROUND(200*Sin(30*i*Pi/180));
    Y1:=240-ROUND(180*Cos(30*i*Pi/180));
    Y2:=240-ROUND(200*Cos(30*i*Pi/180));
    Line(X1,Y1,X2,Y2);
    X1:=320+ROUND(160*Sin(30*i*Pi/180));
    Y1:=240-ROUND(160*Cos(30*i*Pi/180));
    STR(i,SS);
    OutTextXY(X1,Y1,SS);
   end;
  SetLineStyle(SolidLn,0,NormWidth);
  For i:=1 to 60 do
   begin
    X1:=320+ROUND(190*Sin(6*i*Pi/180));
    X2:=320+ROUND(200*Sin(6*i*Pi/180));
    Y1:=240-ROUND(190*Cos(6*i*Pi/180));
    Y2:=240-ROUND(200*Cos(6*i*Pi/180));
    Line(X1,Y1,X2,Y2);
   end;
  SetLineStyle(SolidLn,0,ThickWidth);
  SetColor(LightRed);
  GetTime(H,M,S,S100);
  If H>=12 then H:=H-12;
  Line(320,240,320+ROUND(100*Sin(30*(H+M/60)*Pi/180)),
                            240-ROUND(100*Cos(30*(H+M/60)*Pi/180)));
  Line(320,240,320+ROUND(160*Sin(M*6*Pi/180)),
                            240-ROUND(160*Cos(M*6*Pi/180)));
  SetColor(LightBlue);
  Circle(320,240,10);
  Delay(60000);
 UNTIL KeyPressed;
 CloseGraph;
END.
Несколько замечаний:
1. Часы идут и даже показывают правильное время (если, конечно, на компьютере установлено таковое).
2. Выход из программы - нажатие любой клавиши. Правда, придется с минутку подождать, пока кончится время задержки. Установлена задержка в 1 минуту; в принципе, можно поставить и меньше.
3. Название Вашего графического модуля (поправите, если надо) и инициализация графического режима - самостоятельно (зависит от реализации Паскаля и свойств системы).
clock.jpg
Vladimir_S вне форума   Ответить с цитированием
Старый 23.11.2010, 08:40   #4 (permalink)
zena
Member
 
Регистрация: 11.11.2010
Сообщений: 85
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 20
По умолчанию

Спасибо большое...у меня кстати тоже кое-что получилось)
Проверьте пожалуйста правильно ли написана программа для этих часов.
Код:
uses CRT, graphABC, Utils;
var x1,y1,xh,yh,xm,ym,xc,yc,gd,gm,X,Y,i,a:integer;
    n:array[0..12] of string;
    curTime : DateTime;
    s:string;

procedure ShowCurArrows(ShowColor : ColorType);
begin
  SetPenColor( ShowColor );
  xc:=round(X-180*cos(pi/180*(90+6*CurTime.Second)));
  yc:=round(Y-180*sin(pi/180*(90+6*CurTime.Second)));
  line(x,y,xc,yc);
  xm:=round(X-155*cos(pi/180*(90+6*CurTime.Minute)));
  ym:=round(Y-155*sin(pi/180*(90+6*CurTime.Minute)));
  line(x,y,xm,ym);
  xh:=round(X-115*cos(pi/180*(90+6*((CurTime.Hour mod 12)*5+ CurTime.Minute div 12))));
  yh:=round(Y-115*sin(pi/180*(90+6*((CurTime.Hour mod 12)*5+ CurTime.Minute div 12))));
  line(x,y,xh,yh);
end;

begin
n[1]:=' 1'; n[2]:=' 2'; n[3]:='3';
n[4]:='4'; n[5]:='5'; n[6]:='6';
n[7]:='7'; n[8]:='8'; n[9]:='9';
n[10]:='10'; n[11]:='11'; n[12]:='12';
X:=WindowWidth div 2;
Y:=WindowHeight div 2;
circle(X,Y,190);
a:=270;
for i:=1 to 60 do
  begin
   x1:=round(X-205*cos(pi/180*a));
   y1:=round(Y+205*sin(pi/180*a));
   a:=a+6;
   if (a-6) mod 30=0 then TextOut(x1-16,y1-18,n[12-(i div 5)])
   else

  end;
  xh:=X; yh:=Y;
  xm:=X; ym:=Y;
  xc:=X; yc:=Y;
  circle(X,Y,3);
  circle(X,Y,6);
  circle(X,Y,9);
repeat
  CurTime := CurrentDateTime;
  ShowCurArrows( clBlack);

  delay(1000);

  ShowCurArrows( clWhite );
until keypressed;
end.
zena вне форума   Ответить с цитированием
Старый 23.11.2010, 09:58   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от zena Посмотреть сообщение
Спасибо большое...у меня кстати тоже кое-что получилось) Проверьте пожалуйста правильно ли написана программа для этих часов.
Проверить, к сожалению, не могу: Вы используете модули (Utils) и типы (DateTime, ColorType и пр.), имеющиеся далеко не в каждой реализации транслятора. У меня, например, таковых нет.
Ну а так, внешне...
Ну, например, такое:
Код:
n[1]:=' 1'; n[2]:=' 2'; n[3]:='3';
n[4]:='4'; n[5]:='5'; n[6]:='6';
n[7]:='7'; n[8]:='8'; n[9]:='9';
n[10]:='10'; n[11]:='11'; n[12]:='12';
это просто неприлично. Делается так:
Код:
For i:=1 to 12 do STR(i,n[i]);
И все дела.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 23.11.2010, 15:14   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Так, ну адаптировал я Вашу программу к тем типам и процедурам, к которым привык, получилось так:
Код:
uses CRT, graph, DOS;
var x1,y1,xh,yh,xm,ym,xc,yc,gd,gm,X,Y,i,a,Hour,Minute,Second,S100:integer;
    n:array[0..12] of string;
    s:string;

procedure ShowCurArrows(ShowColor:BYTE);
begin
  SetColor(ShowColor);
  xc:=round(X-180*cos(pi/180*(90+6*Second)));
  yc:=round(Y-180*sin(pi/180*(90+6*Second)));
  line(x,y,xc,yc);
  xm:=round(X-155*cos(pi/180*(90+6*Minute)));
  ym:=round(Y-155*sin(pi/180*(90+6*Minute)));
  line(x,y,xm,ym);
  xh:=round(X-115*cos(pi/180*(90+6*((Hour mod 12)*5+ Minute div 12))));
  yh:=round(Y-115*sin(pi/180*(90+6*((Hour mod 12)*5+ Minute div 12))));
  line(x,y,xh,yh);
end;

begin
Initgraph(<тут должны быть индивидуальные пераметры>);
n[1]:=' 1'; n[2]:=' 2'; n[3]:='3';
n[4]:='4'; n[5]:='5'; n[6]:='6';
n[7]:='7'; n[8]:='8'; n[9]:='9';
n[10]:='10'; n[11]:='11'; n[12]:='12';
X:=GetMaxX div 2;
Y:=GetMaxY div 2;
circle(X,Y,190);
a:=270;
for i:=1 to 60 do
  begin
   x1:=round(X-205*cos(pi/180*a));
   y1:=round(Y+205*sin(pi/180*a));
   a:=a+6;
   if (a-6) mod 30=0 then OutTextXY(x1-16,y1-18,n[12-(i div 5)])
   else

  end;
  xh:=X; yh:=Y;
  xm:=X; ym:=Y;
  xc:=X; yc:=Y;
  circle(X,Y,3);
  circle(X,Y,6);
  circle(X,Y,9);
repeat
  GetTime(Hour,Minute,Second,S100);
  ShowCurArrows(Black);

  delay(1000);

  ShowCurArrows(White);
until keypressed;
CloseGraph;
end.
Можете убедиться, что ничего по сути не изменилось. И вот что увидел (нечто странное):
aa101.jpg
Так что еще работать и работать.
Vladimir_S вне форума   Ответить с цитированием
Старый 23.11.2010, 17:07   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ага, кое в чем разобрался.
Отбой, всё правильно - часы идут и показывают. Просто у меня цвета обратные - белый по черному, и при обращениях к процедуре нужно было переставить черный и белый местами.
Но непонятный сдвиг лимба нумерации относительно окружности циферблата всё-таки имеет место быть. Или это дизайн такой?
aa102.jpg
Vladimir_S вне форума   Ответить с цитированием
Старый 23.11.2010, 19:41   #8 (permalink)
zena
Member
 
Регистрация: 11.11.2010
Сообщений: 85
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 20
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Ну, например, такое:
Код:
n[1]:=' 1'; n[2]:=' 2'; n[3]:='3';
n[4]:='4'; n[5]:='5'; n[6]:='6';
n[7]:='7'; n[8]:='8'; n[9]:='9';
n[10]:='10'; n[11]:='11'; n[12]:='12';
это просто неприлично. Делается так:
Код:
For i:=1 to 12 do STR(i,n[i]);
И все дела.
Ага...спасибо...подправлю.
zena вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:31.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.