unit AnalogUhr;
interface
uses
Windows, SysUtils, Classes, Graphics, ExtCtrls, Controls;
type
TAnalogUhr =
class(TImage)
private
{ Private-Deklarationen }
iOStunde,
iOMinute,
iOSekunde: Integer;
clOFuellFarbe: TColor;
FTimer: TTimer;
byOEinAus: Boolean;
iSinVal, iCosVal,
iMX, iMY,
// UhrMittelpunkt
iR,
iTX, iTY : Integer;
TimeVal : Extended;
BMP : TBitmap;
S :
String[2];
// FOnOptionsChange: TNotifyEvent;
// FOnTimer1Timer: TNotifyEvent;
Procedure SetStunde(iHour: Integer);
Function GetStunde: Integer;
Procedure SetMinute(iMin: Integer);
Function GetMinute: Integer;
Procedure SetSekunde(iSek: Integer);
Function GetSekunde: Integer;
Procedure SetFuelFarbe(clFarbe: TColor);
Function GetFuelFarbe: TColor;
Procedure SetTimer(byEinAus: Boolean);
Function GetTimer: Boolean;
// procedure DoOptionsChange;
procedure Timer1Timer(Sender: TObject);
Procedure Uhr;
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
published
{ Published-Deklarationen }
property Stunde: Integer
read GetStunde
write SetStunde
default 1;
property Minute: Integer
read GetMinute
write SetMinute
default 2;
property Sekunde: Integer
read GetSekunde
write SetSekunde
default 3;
property FuellFarbe: TColor
read GetFuelFarbe
write SetFuelFarbe
default clWhite;
property TimerEinAus: Boolean
read GetTimer
write SetTimer
default false;
// property OnTimer: TNotifyEvent read FOnTimer1Timer write FOnTimer1Timer;
// property OnOptionsChange: TNotifyEvent read FOnOptionsChange write FOnOptionsChange;
end;
procedure Register;
Var iI: Integer;
implementation
{###############################################################################
#
###############################################################################}
procedure Register;
begin
RegisterComponents('
Custom', [TAnalogUhr]);
end;
{###############################################################################
#
###############################################################################}
constructor TAnalogUhr.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimer := TTimer.Create(Self);
FTimer.Enabled := false;
FTimer.OnTimer := Timer1Timer;
FTimer.Interval:= 1000;
byOEinAus := false;
BMP := TBitmap.Create;
BMP.PixelFormat:= pf32bit;
BMP.Width := ClientWidth;
BMP.Height := ClientHeight;
Stunde := 15;
Minute := 22;
Sekunde:= 11;
Uhr;
end;
{###############################################################################
#
###############################################################################}
{procedure TAnalogUhr.DoOptionsChange;
begin
if Assigned(FOnOptionsChange) then FOnOptionsChange(Self);
end;}
{###############################################################################
#
###############################################################################}
procedure TAnalogUhr.Timer1Timer(Sender: TObject);
begin
Uhr
end;
{###############################################################################
#
###############################################################################}
Procedure TAnalogUhr.Uhr;
Procedure SinCosValue;
begin
iSinVal:= Round(iR*SIN(TimeVal));
iCosVal:= Round(iR*COS(TimeVal));
end;
Procedure Ausgabe;
begin
SinCosValue;
BMP.Canvas.MoveTo(iMX, iMY);
BMP.Canvas.LineTo(iMX+iSinVal, iMY-iCosVal);
end;
begin
BMP := TBitmap.Create;
BMP.PixelFormat:= pf32bit;
BMP.Width := ClientWidth;
BMP.Height := ClientHeight;
try
// Mitte
iMX:= ClientWidth
div 2;
iMY:= ClientHeight
div 2;
// GrößenFaktor
if (iMX<iMY)
then iR:= iMX*9
div 10
else iR:= iMY*9
div 10;
BMP.Canvas.Pen.Width := 1;
BMP.Canvas.Font.
Name := '
Tahoma';
BMP.Canvas.Font.Height:= iR
div 8;
// Zahlen:
for iI:=1
to 12
do
begin
TimeVal:= iI*2*PI/12;
SinCosValue;
S := IntToStr(iI);
iTX:= BMP.Canvas.TextWidth(S);
iTY:= BMP.Canvas.TextHeight(S);
BMP.Canvas.TextOut(iMX+iSinVal-(iTX
div 2), iMY-iCosVal-(iTY
div 2), S);
end;
iR := iR*9
div 10;
//
iTX:= iR
div 50;
// Kreis
BMP.Canvas.Ellipse(iMX-iR-iTX-4, iMY-iR-iTX-4, iMX+iR+iTX+4, iMY+iR+iTX+4);
BMP.Canvas.Brush.Color:= clYellow;
BMP.Canvas.FloodFill(iMX, iMY, clWhite, fsSurface);
// Mittelpunkt
// BMP.Canvas.Ellipse(iMX-iTX, iMY-iTX, iMX+iTX, iMY+iTX);
// PunkteMinuten:
for iI:=1
to 60
do
begin
TimeVal:= iI*2*PI/60;
SinCosValue;
// MinutenPunkte
BMP.Canvas.Ellipse(Rect(iMX+iSinVal-iTX, iMY-iCosVal-iTX, iMX+iSinVal+iTX, iMY-iCosVal+iTX));
end;
//----------------------Sekunden--------------------------------------------
TimeVal:= Time*SecsPerDay*2*PI/60;
Ausgabe;
//----------------------Minuten---------------------------------------------
BMP.Canvas.Pen.Width:= 2;
TimeVal:= Time*MinsPerDay*2*PI/60;
Ausgabe;
//----------------------Stunden---------------------------------------------
iR:= iR
div 2;
TimeVal:= Time*HoursPerDay*2*PI/12;
Ausgabe;
// Darstellung
BitBlt(Canvas.Handle, 0, 0, BMP.Width, BMP.Height, BMP.Canvas.Handle, 0, 0, SRCCOPY);
finally
BMP.Free
end
end;
{###############################################################################
#
###############################################################################}
{---------------Stunde---------------------------------------------------------}
Procedure TAnalogUhr.SetStunde(iHour: Integer);
begin
if (iHour<>iOStunde)
then iOStunde:= iHour;
end;
{###############################################################################
#
###############################################################################}
Function TAnalogUhr.GetStunde: Integer;
begin
Result:= iOStunde;
end;
{###############################################################################
#
###############################################################################}
{--------------Minute----------------------------------------------------------}
Procedure TAnalogUhr.SetMinute(iMin: Integer);
begin
if (iMin<>iOMinute)
then iOMinute:= iMin;
end;
{###############################################################################
#
###############################################################################}
Function TAnalogUhr.GetMinute: Integer;
begin
Result:= iOMinute;
end;
{###############################################################################
#
###############################################################################}
{---------------Sekunde--------------------------------------------------------}
Procedure TAnalogUhr.SetSekunde(iSek: Integer);
begin
if (iSek<>iOSekunde)
then iOSekunde:= iSek;
end;
{###############################################################################
#
###############################################################################}
Function TAnalogUhr.GetSekunde: Integer;
begin
Result:= iOSekunde;
end;
{###############################################################################
#
###############################################################################}
Procedure TAnalogUhr.SetFuelFarbe(clFarbe: TColor);
begin
if (clFarbe<>clOFuellFarbe)
then clOFuellFarbe:= clFarbe;
end;
{###############################################################################
#
###############################################################################}
Function TAnalogUhr.GetFuelFarbe: TColor;
begin
Result:= clOFuellFarbe;
end;
{###############################################################################
#
###############################################################################}
Procedure TAnalogUhr.SetTimer(byEinAus: Boolean);
begin
if (byEinAus<>byOEinAus)
then byOEinAus:= byEinAus;
FTimer.Enabled:= byOEinAus
end;
{###############################################################################
#
###############################################################################}
Function TAnalogUhr.GetTimer: Boolean;
begin
Result:= byOEinAus;
end;
{###############################################################################
#
###############################################################################}
destructor TAnalogUhr.Destroy;
begin
inherited Destroy;
end;
end.