autor implementacji w środowisku Lazarus: Stanisław - e-Swoi

Transkrypt

autor implementacji w środowisku Lazarus: Stanisław - e-Swoi
unit zegarj1;
{ autor implementacji w środowisku Lazarus: Stanisław Ubermanowicz }
{$mode objfpc}{$H+}
interface
uses
Classes, Forms, ExtCtrls, SysUtils, DateUtils;
{ należy dopisać DateUtils }
type
{ UWAGA! Obiekty tworzone są Interfejsem Graficznym w zintegrowanym środowisku Lazarus }
{ W Inspektorze obiektów należy ustawić wielkość Okna Height:=250 i Width:= 250
oraz właściwości BorderStyle:= bsNone i Position:= poScreenCenter }
{ W obsłudze aktywacji Okna, w zakładce Zdarzenia przy OnActivate ustawić wywołanie TimerTimer,
aby przed wyświetleniem Okna kamienie zostały ustawione w położeniu wskazującym czas }
{ W Oknie umieszczamy obiekt Timer oraz 9 obiektów TImage z odpowiednimi obrazkami,
z nazwami i właściwościami jak niżej }
TOkno = class(TForm)
{ Rozmiary i początkowe położenia obiektów }
{ 250x250 Left 0;
Top 0;
tarcza zegara }
Cyferblat: TImage;
o_Granat: TImage;
{ 24x24
Left 113; Top 113; oś }
s_Brylant: TImage;
{ 24x24
Left 113; Top 7;
wsk. sekund }
m_Szafir: TImage;
{ 30x30
Left 110; Top 31; wsk. minut }
g_Tanzanit: TImage; { 40x40
Left 105; Top 67; wsk. godzin }
Peridot: TImage;
{ 38x38
Left 7;
Top 7 }
Topaz: TImage;
{ 38x38
Left 205; Top 7 }
Ametyst: TImage;
{ 38x38
Left 7;
Top 205 }
{ 38x38
Left 205; Top 7 }
Rubin: TImage;
Timer: TTimer;
procedure TimerTimer(Sender: TObject);
procedure TopazClick(Sender: TObject);
{ Dla obiektu Topaz, w zakładce Zdarzenia przy OnClick ustawić wywołanie funkcji TopazClick
aby poprzez kliknięcie na tym kamieniu możliwe było zamykanie okna Zegara }
end;
var
Okno: TOkno;
Czas: TDateTime; { Zmienna do której pobierany jest czas systemowy }
pSek: Integer;
{ Pozycja wskazówki sekundowej, numery od 0 do 59, zmiana co sekundę }
pMin: Integer;
{ Pozycja wskazówki minutowej, numery od 0 do 239, zmiana co 15 sekund }
pGodz: Integer; { Pozycja wskazówki godzinowej, numery od 0 do 119, zmiana co 6 minut }
x, y: Integer;
{ Zmienne pomocnicze do obliczania położenia obiektów }
Start: Boolean; { Zmienna określająca czy zegar wystartował i wskazówki są ustawione}
implementation
procedure TOkno.TimerTimer(Sender: TObject);
{ Procedura zegara wywoływana co sekundę }
begin
Czas:= Now(); { Pobranie czasu systemowego do zmiennej wskazującej w danej chwili
stan godzin, minut i sekund ze zmiennej określającej datę i czas }
pSek:= SecondOf(Czas);
{ Pobranie stanu sekund i pozycji wskazówki sekundowej }
x:= 113+Round(106*Sin(pSek*Pi/30));
{ środek okręgu 113, promień okręgu 106 }
y:= 113-Round(106*Cos(pSek*Pi/30));
{ współrzędne XY z obrotu o kąt 6° * Pi/180° }
s_Brylant.Left:= x; s_Brylant.Top:= y;
{ Przesuń kamień wskazujący sekundy }
If (pSek Mod 15 = 0) Or Not Start then
begin
{ Co 15 sekund ustal położenie wskazówki minutowej }
pMin:= Trunc(4*(MinuteOf(Czas) + pSek/60)); { Oblicz pozycję wskazówki minutowej }
x:= 110+Round(79*Sin(pMin*Pi/120));
{ środek okręgu 110, promień okręgu 79 }
y:= 110-Round(79*Cos(pMin*Pi/120));
{ współrzędne XY z obrotu o kąt 1.5° * Pi/180° }
m_Szafir.Left:= x; m_Szafir.Top:= y;
{ Przesuń kamień wskazujący minuty }
If (pMin Mod 24 = 0) Or Not Start then
begin
{ Co 6 minut ustal położenie wskazówki godzinowej }
pGodz:= Trunc(10*(HourOf(Czas) Mod 12 + pMin/240)); { Oblicz pozycję wskazówki godzin }
x:= 105+Round(38*Sin(pGodz*Pi/60)); { środek okręgu 105, promień 38 }
y:= 105-Round(38*Cos(pGodz*Pi/60)); { współrzędne XY z obrotu o 3° * Pi/180° }
g_Tanzanit.Left:= x; g_Tanzanit.Top:= y; { Przesuń kamień wskazujący godziny }
Start:= True;
{ Zegar wystartował, wskazówki są już ustawione }
end;
end;
end;
{ Kliknięcie na kamień Topaz zamyka Okno }
procedure TOkno.TopazClick(Sender: TObject);
begin
Okno.Close
end;
{$R *.lfm}
end.

Podobne dokumenty