-
Notifications
You must be signed in to change notification settings - Fork 0
/
easter.pas
124 lines (111 loc) · 3.52 KB
/
easter.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//******************************************************************************
// Easter Component unit
// bb - sdtp May 2021
// Provides Easter dates and associated
// Parameters:
// EasterYear (Integer): Selected year for Easter dates
// Properties :
// InvalidYear (Boolean) True if year is invalid
// Easterdate (DateTime) : Easter date
// EasterMondaydate (TDateTime) : Easter monday date
// Ascensdate (TDateTime) : Ascension date
// Pentecdate (TDateTime) : Pentecost date
// PentecMondaydate (TDateTime) : Pentecost monday date
//******************************************************************************
unit Easter;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;
type
TEaster = class(TComponent)
private
fVersion: String;
fEasteryear: Integer;
fEasterdate: TDateTime;
fEasterMondaydate: TDateTime;
fAscensdate: TDatetime;
fPentecdate: Tdatetime;
fPentecMondaydate: Tdatetime;
fInvalidYear: Boolean;
procedure GetEaster;
procedure setEasteryear(value: Integer);
protected
public
constructor create(AOwner: TComponent); override;
property InvalidYear: Boolean read fInvalidYear;
property Easterdate : TDateTime read fEasterdate;
property EasterMondaydate : TDateTime read fEasterMondaydate;
property Ascensdate: TDateTime read fAscensdate;
property Pentecdate: TDateTime read fPentecdate;
property PentecMondaydate: TDateTime read fPentecMondaydate;
published
property Version: String read fVersion;
property EasterYear: Integer read fEasteryear write setEasteryear;
end;
procedure Register;
implementation
procedure Register;
begin
{$I easter_icon.lrs}
RegisterComponents('lazbbAstroComponents',[TEaster]);
end;
constructor TEaster.create(AOwner: TComponent);
begin
inherited Create(AOwner);
fVersion:= '1.0';
fEasteryear:= CurrentYear;
end;
procedure TEaster.setEasteryear(value: Integer);
begin
if fEasterYear<>value then
begin
fEasterYear:= value;
if not (csDesigning in ComponentState) then GetEaster;
end;
end;
procedure TEaster.GetEaster; // Wikipedia
var
nMonth, nDay, nMoon, nEpact, nSunday, nGold, nCent, nCorx, nCorz: Integer;
begin
fInvalidYear:= false;
nGold := (fEasteryear mod 19) + 1; // The Golden Number of the year in the 19 year Metonic Cycle
nCent := (fEasteryear div 100) + 1; // Calculate the Century
{ Number of years in which leap year was dropped in order... }
{ to keep in step with the sun: }
nCorx := (3 * nCent) div 4 - 12;
nCorz := (8 * nCent + 5) div 25 - 5; // Special correction to syncronize Easter with moon's orbit
nSunday := (Longint(5) * fEasteryear) div 4 - nCorx - 10; // Find Sunday
{ ^ To prevent overflow at year 6554}
{ Set Epact - specifies occurrence of full moon: }
nEpact := (11 * nGold + 20 + nCorz - nCorx) mod 30;
if nEpact < 0 then
nEpact := nEpact + 30;
if ((nEpact = 25) and (nGold > 11)) or (nEpact = 24) then nEpact := nEpact + 1;
{ Find Full Moon: }
nMoon := 44 - nEpact;
if nMoon < 21 then
nMoon := nMoon + 30;
{ Advance to Sunday: }
nMoon := nMoon + 7 - ((nSunday + nMoon) mod 7);
if nMoon > 31 then
begin
nMonth := 4;
nDay := nMoon - 31;
end
else
begin
nMonth := 3;
nDay := nMoon;
end;
try
fEasterdate := EncodeDate(fEasteryear, nMonth, nDay);
fEasterMondaydate:= feasterdate+1;
fAscensdate:= fEasterdate+39;
fPentecdate:= fEasterdate+49;
fPentecMondaydate:= fEasterdate+50;
except
fInvalidYear:= true;
end;
end;
end.