Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Создание часов в паскале (http://www.tehnari.ru/f43/t42417/)

zena 22.11.2010 19:37

Создание часов в паскале
 
Помогите доработать часы в паскале. Нужно использовать в программе 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.


Vladimir_S 22.11.2010 21:42

Цитата:

Сообщение от zena (Сообщение 421257)
Помогите доработать часы в паскале. Нужно использовать в программе delay(задержка). У меня в программе при вставке этого оператора почему-то выдаёт ошибку, что delay-неизвестный идентификатор.

Естественно, выдает ошибку. Потому что Delay - это процедура модуля CRT, а у Вас этот модуль не присоединен.

Vladimir_S 22.11.2010 23:38

Вложений: 1
Ну вот Вам часы:
Код:

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. Название Вашего графического модуля (поправите, если надо) и инициализация графического режима - самостоятельно (зависит от реализации Паскаля и свойств системы).
Вложение 25435

zena 23.11.2010 08:40

Спасибо большое...у меня кстати тоже кое-что получилось)
Проверьте пожалуйста правильно ли написана программа для этих часов.
Код:

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.


Vladimir_S 23.11.2010 09:58

Цитата:

Сообщение от zena (Сообщение 421534)
Спасибо большое...у меня кстати тоже кое-что получилось) Проверьте пожалуйста правильно ли написана программа для этих часов.

Проверить, к сожалению, не могу: Вы используете модули (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 23.11.2010 15:14

Вложений: 1
Так, ну адаптировал я Вашу программу к тем типам и процедурам, к которым привык, получилось так:
Код:

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.

Можете убедиться, что ничего по сути не изменилось. И вот что увидел (нечто странное):
Вложение 25453
Так что еще работать и работать.

Vladimir_S 23.11.2010 17:07

Вложений: 1
Ага, кое в чем разобрался.
Отбой, всё правильно - часы идут и показывают. Просто у меня цвета обратные - белый по черному, и при обращениях к процедуре нужно было переставить черный и белый местами.
Но непонятный сдвиг лимба нумерации относительно окружности циферблата всё-таки имеет место быть. Или это дизайн такой?
Вложение 25460

zena 23.11.2010 19:41

Цитата:

Сообщение от Vladimir_S (Сообщение 421552)
Ну, например, такое:
Код:

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]);
И все дела.

Ага...спасибо...подправлю.


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

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.