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.