Помощь - Поиск - Пользователи - Календарь
Полная версия: Аналоговые часы фиксированного размера
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Rocket
Вот программа,которая создает аналоговые часы,которые выводят текущее время в часах, минутах и секундах. Нажатие пользователя мышью на компонент изменяет часовой пояс – нажатие в левой половине компонента увеличивает смещение, влевой – уменьшает.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, TeeProcs, TeEngine, Chart, Buttons, ComCtrls,
   ToolWin, ActnMan, ActnCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    procedure DrawArrows (DrawColor: TColor);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  KooRX,KooRY,Rad:Integer;
  Arrow_H,Arrow_M,Arrow_S:Integer;
  H,M,S,MS:Word;
  HourAngle,MinAngle,SecAngle:Real;
  i,c:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender:TObject);
begin
Form1.BorderStyle:=bsSingle;  //устанавливаем границы
Form1.BorderIcons:=[biSystemMenu,biMinimize];   // вид границ
Timer1.Interval:=1000;
Timer1.Enabled:=false;
KooRY:=Form1.ClientHeight div 2;
KooRX:=KooRY;
Rad:=KooRX-20;
Arrow_H:=Rad-30;
Arrow_M:=Rad-20;
Arrow_S:=Rad-10;
i:=0;
end;

procedure TForm1.FormPaint(Sender:TObject);
var i:integer;
begin
//Прорисовка циферблата
with Form1.Canvas do begin
   //Вывод окружности
   Pen.Color:=clAqua; // цвет линии
   Pen.Width:=6;  //толщиналинии
   Brush.Color:=clblack;  // цвет заливки
   Ellipse(20,20,20+2*Rad,20+2*Rad);
   Pen.Width:=2;
   //Вывод рисок
   for i:=0 to 11 do begin
   moveto(KooRx+round((rad-9)*sin(i/6*pi)),
       KooRy-round((rad-9)*cos(i/6*pi)));  // переход на координаты
   lineto(KooRx+round((rad)*sin(i/6*pi)), //рисование лини
       KooRy-round((rad)*cos(i/6*pi)));
   end;
   //Вывод цифр
   Font.Height:=10; //размер шрифта
   Font.Color:=clBlack; //цвет шрифта
   Brush.Color:=Form1.Color;
   TextOut(KooRX-TextWidth('12') div 2,KooRY-Rad-TextHeight('12')-5,'12');  // вывод значений на циферблат
   TextOut(KooRX+Rad+5,KooRY- TextHeight('3'),'3');
   TextOut(KooRX-TextWidth('6') div 2,KooRY+Rad+5,'6');
   TextOut(KooRX-Rad-TextWidth('9')-5,KooRY-TextHeight('9'),'9');
   end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.caption='Start' then begin
// zapusk chasov
drawarrows(clblack);   //заливка
decodetime(time,h,m,s,ms); //считыввание времени
hourangle:=(h+i mod 12)/12*(2*pi);
minangle:=m / 60 * (2*pi);
secangle:=s / 60 * (2*pi);
drawarrows(clred);
Button1.Caption:='Stop';
timer1.Enabled:=true;
end
else begin
//ostanovka chasov
Button1.caption:='Start';
timer1.Enabled:=false;
end;
end;

procedure TForm1.Timer1Timer(Sender:TObject);
begin
//Стереть стрелки
drawarrows(clblack);
//narisovat strlki na novom meste
decodetime(time,h,m,s,ms);
hourangle:= (h+i mod 12)/12 * (2*pi);
minangle:=m / 60 * (2*pi);
secangle:=s / 60 * (2*pi);
drawarrows(clred);
Label1.Caption:=TimeToStr(Time);//Отображение текущего значения времени
end;

procedure tform1.drawarrows(drawcolor: tcolor);
begin
with form1.canvas do begin
pen.color:=drawcolor;
moveto(KooRx,KooRy);
//chasovaia strlka
pen.width:=4;
lineto(KooRx+round(arrow_H*sin(hourangle)),
       KooRy-round(arrow_H*cos(hourangle)));
moveto(KooRx,KooRy);
//minutnaia strlka
pen.width:=3;
lineto(KooRx+round(arrow_M*sin(minangle)),
       KooRy-round(arrow_M*cos(minangle)));
moveto(KooRx,KooRy);
//sekundnaia strlka
pen.width:=1;
lineto(KooRx+round(arrow_S*sin(secangle)),
       KooRy-round(arrow_S*cos(secangle)));
end;
end;



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
C:=Form1.ClientHeight div 2;
if x>c then i:=i+1
else i:=i-1;
end;

end.


Всё работает хорошо. Проблема заключается в том,что нужно создать и добавить свой компонет, а я не знаю как это сделать и связать это с моими часами. Пожайлуста, подскажите как организовать компонент! smile.gif очень нужно...
volvo
О создании собственных компонентов читай, например, тут:

http://www.citforum.ru/programming/32less/les41.shtml
Rocket
Цитата(volvo @ 17.06.2007 18:26) *

О создании собственных компонентов читай, например, тут:

http://www.citforum.ru/programming/32less/les41.shtml

Ну, а для моей программы какой-нибудь компонент по-быстрому накидать не можете помочь? Пожалуйста! yes2.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.