Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2010, 11:29   #1
Sh@rky
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 13
По умолчанию Часы с плавно передвигающейся минутной стрелкой

Уважаемые господа.
Есть простенькая программка с часами, которая показывает данное время..
Дело в том что секундная стрелка передвигается резко, а нужно сделать так чтоб передвигалась плавно (типа как в швейцарских часах =) )
До сих пор понять не могу как это сделать, не будете так добры подсказать, а?

Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
  procedure DrawArrows(DrawColor: TColor);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  CenterX, CenterY, Radius: integer;
  HourArrow,MinArrow, SecArrow: Integer;
  Hour, min, sec, msec: word;
  HourAngle, MinAngle, SecAngle: real;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
CenterY:= Form1.ClientHeight div 2;
CenterX:= CenterY;
Radius:=CenterX - 20;
HourArrow:=Radius - 30;
MinArrow:= Radius - 20;
SecArrow:= Radius- 10;
end;
 
procedure TForm1.FormPaint(Sender: TObject);
var i: integer;
begin
with Form1.Canvas do begin
  Pen.Color:=clBlue;
  Pen.Width:=4;
  Brush.Color:=clWhite;
  Ellipse(20,20,20 + 2 * Radius, 20 +2 * Radius);
  Pen.Width:=2;
  for i:=0 to 11 do begin
    MoveTo(CenterX+Round((Radius-9) * Sin(i / 6 *pi)),
           CenterY- Round((Radius - 9) * Cos(i / 6 *pi)));
    LineTo(CenterX+Round((Radius)*sin(i/6 *pi)),
    CenterY-Round((Radius) * cos(i / 6 *pi)));
    end;
  Font.Height:=10;
  Font.Color:=clBlack;
  Brush.Color:=Form1.Color;
  TextOut(CenterX-TextWidth('12') div 2, CenterY - Radius - TextHeight('12') - 5,'12');
  TextOut(CenterX+Radius+5, CenterY - TextHeight('3'), '3');
  TextOut(CenterX-TextWidth('6') div 2, CenterY+Radius+5, '6');
  TextOut(CenterX - Radius - TextWidth('9') -5, CenterY -TextHeight('9'), '9');
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption = 'Старт' then begin
  DecodeTime(Time, Hour, min, sec, msec);
  HourAngle:=(Hour mod 12) / 12 *(2*pi);
  MinAngle:=min / 60 * (2* Pi);
  SecAngle:=sec/ 60 *(2*pi);
  DrawArrows(Clred);
  Button1.Caption:='Stop';
  Timer1.Enabled:=true;
  end
  else begin
    Button1.Caption:='Старт';
    Timer1.Enabled:=false;
    end;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
DrawArrows(ClWhite);
DecodeTime(Time, Hour, min, sec, msec);
  HourAngle:=(Hour mod 12) / 12 *(2*pi);
  MinAngle:=min / 60 * (2* Pi);
  SecAngle:=sec/ 60 *(2*pi);
  DrawArrows(clRed);
end;
 
procedure TForm1.DrawArrows(DrawColor: TColor);
begin
with Form1.Canvas do begin
  Pen.Color:=DrawColor;
  MoveTo(CenterX, CenterY);
  Pen.Width:=3;
  LineTo(CenterX+ Round(HourArrow * Sin(HourAngle)),
  CenterY - Round(HourArrow*cos(HourAngle)));
  MoveTo(CenterX, CenterY);
  Pen.Width:=2;
  LineTo(CenterX + Round(MinArrow * sin(MinAngle)),
  CenterY - Round(MinArrow * Cos(MinAngle)));
  MoveTo(CenterX, CenterY);
  Pen.Width:=1;
  LineTo(CenterX+Round(SecArrow*sin(SecAngle)),
  CenterY - Round(SecArrow * Cos(SecAngle)));
  end;
end;
 
end.
p.s. извиняйте что код на весь экран, не знал как по меньше сделать или спрятать

Последний раз редактировалось Sh@rky; 29.11.2010 в 23:25.
Sh@rky вне форума Ответить с цитированием
Старый 29.11.2010, 12:05   #2
Ivan_Susanin
Пользователь
 
Регистрация: 15.04.2007
Сообщений: 20
По умолчанию

передвигать не раз в секунду , а раз 15-20 в секунду на меньший шаг
Ivan_Susanin вне форума Ответить с цитированием
Старый 29.11.2010, 13:21   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вау! Узнаю свой код! Значит, пригодился ?..

Цитата:
передвигать не раз в секунду , а раз 15-20 в секунду на меньший шаг
ну да, по сути именно так.


Sh@rky, сделайте следующее:
1) у таймера интервал задайте маленький. (ну, например, 20 или 30)
2) измените ОДНУ строчку кода, там, где вычисляется угол смещения секундной стрелки, вот так:
Код:
  MinAngle := min / 60 * (2* Pi);
    SecAngle := (sec + msec/1000) / 60 *(2*pi);
  DrawArrows(clRed);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.11.2010, 14:26   #4
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Serge_Bliznykov опередил с ответом.Также хотел посоветовать привязать определение угла секундной стрелки к милисекундам
Если еще и изменить определение часовой стрелки
HourAngle:=((Hour+min/60)) / 12 *(2*pi);,
то и часовая стрелка будет занимать положения между часами в зависимости от минут.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 29.11.2010 в 14:35.
DeKot вне форума Ответить с цитированием
Старый 29.11.2010, 15:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Dekot
то и часовая стрелка будет занимать положения между часами в зависимости от минут.
+1
угу. точно. подумал об этом, но не сделал.
тоже касается и минутной стрелки:
MinAngle := (min + sec/60) / 60 * (2* Pi);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.11.2010, 23:20   #6
Sh@rky
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 13
По умолчанию

Ребята, приношу свои глубочайшие извинения за не точную информацию!
Не секундную, а минутную стрелку! Т.е. чтоб минутная после прохода круга секундной не резко перешла на следующую минуту, а плавно переходила в след за секундной, ну понимаете как на наручных часах типа швейцарских =)
Sh@rky вне форума Ответить с цитированием
Старый 29.11.2010, 23:37   #7
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

А что в предыдущих сообщениях недостаточно информации/советов? Там и про минутную стрелку упиминалось. А самому поэкспериментировать с программой (уже готовой) слабо? Вам дали метод плавности с сек. и часовой стрелками. Для минутной тот же принцип. Дерзайте.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 30.11.2010, 07:34   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

DeKot +1
тем более, что и для часовой и для минутной написан ГОТОВЫЙ код!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2010, 20:32   #9
Sh@rky
Пользователь
 
Регистрация: 30.06.2010
Сообщений: 13
По умолчанию

спасибо большое!!! Все отлично!
Sh@rky вне форума Ответить с цитированием
Старый 30.11.2010, 21:40   #10
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
...написан ГОТОВЫЙ код!
Вот это и убивает в подходе молодежи к решению задач.
Есть код, рабочий, да подумай ты\Вы над ним, поменяй значения переменных, измени процедуру. Только так можно чему то научиться. А от просьб типа "зделайте мене ..."
больше вреда, чем пользы.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
меню с плавно затухающей обводкой как в АИМПе Frosty HTML и CSS 2 30.04.2010 11:16
отследить нажатие кнопки со стрелкой для раскрытия поля со списком Bezdar Microsoft Office Excel 4 16.03.2010 12:47
Плавно увеличить громкость KurtWagner Общие вопросы Delphi 10 02.02.2009 10:37
Как плавно поменять цвет формы гера Помощь студентам 1 20.04.2007 15:35