お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"RE:アナログ時計の描画"

この発言は
#00078 Athena さんのアナログ時計の描画
に対するコメントです

Athenaさん:こんばんは〜 H-Tritonです。 これは楽しめるコードですね。 覚えたての知識でコンポーネントにしてみました。 TImageから派生しています。 ファイル名「AnaClock.pas」で保存してインストールします。 フォームに貼り付けて Intervalプロパティを適当な値にセットすると時計 が動き出します。 //--- ここから --- unit AnaClock; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TAnaClock = class(TImage) private { Private 宣言 } FTimer: TTimer; FInterval: Cardinal; function GetX(Angle:Extended;R,CenterX:Integer) : Integer; function GetY(Angle:Extended;R,CenterY:Integer) : Integer; procedure SetInterval(Value: Cardinal); procedure DrawHands(Sender: TObject); protected { Protected 宣言 } public { Public 宣言 } constructor Create( AOwner : TComponent ); override; destructor Destroy; override; published { Published 宣言 } property Interval: Cardinal read FInterval write SetInterval; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TAnaClock]); end; // デストラクタ destructor TAnaClock.Destroy; begin FTimer.Free; inherited; end; // コンストラクタ constructor TAnaClock.Create( AOwner : TComponent ); begin inherited Create( AOwner ); FTimer:= TTimer.Create(Self); FTimer.OnTimer:= DrawHands; SetInterval(FInterval); //インターバル初期化 DrawHands(nil); end; //プロパティに値を書き込み、タイマーのインターバルを設定する procedure TAnaClock.SetInterval(Value: Cardinal); begin FInterval:= Value; FTimer.Interval:= FInterval; end; function TAnaClock.GetX(Angle:Extended;R,CenterX:Integer) : Integer; var E : Extended; begin E := Sin(Angle); Result:=Round(R * E)+(CenterX); //針の先端X座標 end; function TAnaClock.GetY(Angle:Extended;R,CenterY:Integer) : Integer; var E: Extended; begin E := -Cos(Angle); Result:=Round(R * E)+(CenterY); //針の先端Y座標 end; //針を描く procedure TAnaClock.DrawHands(Sender: TObject); const Rad : Extended= Pi / 180; //ラジアン値を求めるための定数 var AnS,AnM,AnH,Angle:Extended; X,Y,Len,CX,CY,i : Integer; Hour,Min,Sec,MSec : Word; begin Canvas.Pen.Color:=clBlack; Canvas.Brush.Color:=clBtnFace; Canvas.FillRect(Clientrect); //前回の描画を消す Canvas.Brush.Color:=clWhite; CX := Width div 2; //中心の X 座標 CY := Height div 2;//中心の Y 座標 Canvas.Ellipse(CX-100,CY-100,CX+100,CY+100); //円を描画 DecodeTime(Now, Hour, Min, Sec, MSec); //時刻を分解 AnS := Sec * 6 * Rad; //秒針の角度(ラジアン) AnM := (Min * 6 + Sec * 0.1)* Rad; //分針の角度(ラジアン) AnH := (Hour* 30 + Min * 0.5)* Rad; //時針の角度(ラジアン) for i := 0 to 2 do begin case i of 0 : begin Canvas.Pen.Color:=clRed; Angle := AnH ; end; 1 : begin Canvas.Pen.Color:=clBlue; Angle := AnM ; end; 2 : begin Canvas.Pen.Color:=clAqua; Angle := AnS ; end; end; Len := i * 10 + 70 ; X:=GetX(AnS,Len,CX); Y:=GetY(AnS,Len,CY); Canvas.MoveTo(CX,CY); //中心にペンを置く //線を引く Canvas.LineTo(GetX(Angle,Len,CX),GetY(Angle,Len,CY)); end; end; end. //---- ここまで ---- ☆ H-Triton (^^) since 1996 ☆ Avalon友の会第80008号 玉でも石でもお預かりします FDELPHIサンプル蔵下足札番 Original document by H-Triton 氏 ID:(QZV11422)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum