• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Создание часов в паскале

  • Автор темы Автор темы zena
  • Дата начала Дата начала

zena

Новые
Регистрация
11 Ноя 2010
Сообщения
85
Реакции
1
Баллы
0
Создание часов в паскале

Помогите доработать часы в паскале. Нужно использовать в программе 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.
 
Помогите доработать часы в паскале. Нужно использовать в программе delay(задержка). У меня в программе при вставке этого оператора почему-то выдаёт ошибку, что delay-неизвестный идентификатор.
Естественно, выдает ошибку. Потому что Delay - это процедура модуля CRT, а у Вас этот модуль не присоединен.
 
Ну вот Вам часы:
Код:
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.webp
 
Спасибо большое...у меня кстати тоже кое-что получилось)
Проверьте пожалуйста правильно ли написана программа для этих часов.
Код:
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.
 
Спасибо большое...у меня кстати тоже кое-что получилось) Проверьте пожалуйста правильно ли написана программа для этих часов.
Проверить, к сожалению, не могу: Вы используете модули (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]);
И все дела.
 
Так, ну адаптировал я Вашу программу к тем типам и процедурам, к которым привык, получилось так:
Код:
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.webp
Так что еще работать и работать.
 
Ага, кое в чем разобрался.
Отбой, всё правильно - часы идут и показывают. Просто у меня цвета обратные - белый по черному, и при обращениях к процедуре нужно было переставить черный и белый местами.
Но непонятный сдвиг лимба нумерации относительно окружности циферблата всё-таки имеет место быть. Или это дизайн такой?
AA102.webp
 
Ну, например, такое:
Код:
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]);
И все дела.

Ага...спасибо...подправлю.
 
Назад
Сверху