tvplanit: Refactor calculation of holidays in fulldemo

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8386 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-08-12 20:59:53 +00:00
parent b3d76d7f60
commit 6a2e34537d
2 changed files with 80 additions and 63 deletions

View File

@ -4,12 +4,12 @@ object MainForm: TMainForm
Top = 134
Width = 959
Caption = 'Turbo Power VisualPlanIt Demo'
ClientHeight = 576
ClientHeight = 596
ClientWidth = 959
Menu = MainMenu1
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
LCLVersion = '2.3.0.0'
OnDestroy = FormDestroy
object Panel1: TPanel
Left = 125
Height = 596
@ -81,31 +81,21 @@ object MainForm: TMainForm
Width = 357
ShowHint = True
ControlLink = VpControlLink1
Color = clWindow
ParentShowHint = False
Align = alBottom
TabStop = True
TabOrder = 0
DateLabelFormat = 'mmmm yyyy'
DayHeadAttributes.Color = clBtnFace
DayNameStyle = dsShort
DrawingStyle = dsFlat
EventDayStyle = [fsItalic]
HeadAttributes.Font.Height = -13
HeadAttributes.Font.Style = [fsItalic]
HeadAttributes.Color = clBtnFace
HolidayAttributes.Font.Color = clBlack
KBNavigation = True
SelectedDayColor = clRed
ShowEvents = True
ShowEventTime = False
TimeFormat = tf12Hour
TodayAttributes.Font.Color = clBlue
TodayAttributes.Color = 16761024
TodayAttributes.BorderPen.Color = clBlue
TodayAttributes.BorderPen.Width = 3
WeekendAttributes.Font.Color = clBlack
WeekStartsOn = dtSunday
OnHoliday = VpHoliday
end
object Splitter2: TSplitter
@ -124,13 +114,10 @@ object MainForm: TMainForm
Width = 357
ShowHint = True
ControlLink = VpControlLink1
Color = clWindow
Font.Height = -12
ParentFont = False
ParentShowHint = False
Align = alClient
ReadOnly = False
TabStop = True
TabOrder = 2
AllDayEventAttributes.BackgroundColor = clBtnShadow
AllDayEventAttributes.EventBorderColor = cl3DDkShadow
@ -191,13 +178,8 @@ object MainForm: TMainForm
001C000000C6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
005500000038FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
ShowResourceName = True
LineColor = clGray
GutterWidth = 5
DateLabelFormat = 'dddddd'
Granularity = gr30Min
DefaultTopHour = h_07
TimeFormat = tf12Hour
WrapStyle = wsNoFlow
OnHoliday = VpHoliday
end
@ -306,7 +288,6 @@ object MainForm: TMainForm
Width = 472
ShowHint = True
ControlLink = VpControlLink1
Color = clWindow
Font.Height = -12
ParentFont = False
ParentShowHint = False
@ -316,9 +297,7 @@ object MainForm: TMainForm
AllDayEventAttributes.Font.Height = -12
DateLabelFormat = 'dddd, mmmm dd, yyyy'
DayHeadAttributes.Color = clBtnFace
DayHeadAttributes.DateFormat = 'dddd mmmm, dd'
DayHeadAttributes.Font.Height = -13
DayHeadAttributes.Bordered = True
DrawingStyle = dsFlat
EventFont.Height = -12
HeadAttributes.Font.Height = -13
@ -326,11 +305,8 @@ object MainForm: TMainForm
HeadAttributes.Color = clBtnFace
LineColor = clGray
Layout = wvlHorizontal
TimeFormat = tf12Hour
ShowEventTime = True
WeekStartsOn = dtMonday
Align = alClient
TabStop = True
TabOrder = 2
OnHoliday = VpHoliday
end
@ -383,12 +359,9 @@ object MainForm: TMainForm
Top = 27
Width = 834
ControlLink = VpControlLink1
Color = clWindow
ParentFont = False
Align = alClient
TabStop = True
TabOrder = 1
ReadOnly = False
DisplayOptions.CheckBGColor = clWindow
DisplayOptions.CheckColor = cl3DDkShadow
DisplayOptions.CheckStyle = csCheck
@ -404,7 +377,6 @@ object MainForm: TMainForm
TaskHeadAttributes.Color = clSilver
TaskHeadAttributes.Font.Style = [fsItalic]
DrawingStyle = dsFlat
ShowResourceName = True
end
end
object Contacts: TPage
@ -427,14 +399,10 @@ object MainForm: TMainForm
Top = 0
Width = 794
ControlLink = VpControlLink1
Color = clWindow
ParentFont = False
Align = alClient
TabStop = True
TabOrder = 1
AllowInPlaceEditing = True
BarWidth = 1
BarColor = clSilver
ColumnWidth = 200
ContactHeadAttributes.Color = clSilver
ContactHeadAttributes.Bordered = True

View File

@ -9,13 +9,18 @@ uses
clocale,
{$ENDIF}
Classes, SysUtils, FileUtil, PrintersDlgs, Forms, Controls, Graphics, Dialogs,
ExtCtrls, StdCtrls, ComCtrls, LCLTranslator, Menus, Types, LCLVersion,
ExtCtrls, StdCtrls, ComCtrls, LCLTranslator, Menus, Types, LCLVersion, Contnrs,
CheckLst, VpBaseDS, VpDayView, VpWeekView, VpTaskList, VpAbout, VpContactGrid,
VpMonthView, VpResEditDlg, VpContactButtons, VpNavBar, VpData, VpPrtPrvDlg,
VpPrtFmtDlg, VpBase;
type
THoliday = class
Name: String;
Date: TDate;
constructor Create(AName: String; ADate: TDate);
end;
{ TMainForm }
TMainForm = class(TForm)
@ -109,6 +114,7 @@ type
procedure DaysTrackBarChange(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lbOtherResourcesClickCheck(Sender: TObject);
procedure MnuAboutClick(Sender: TObject);
procedure MnuEditPrintFormatsClick(Sender: TObject);
@ -134,6 +140,9 @@ type
FVisibleDays: Integer;
FResID: Integer;
FLanguageDir: String;
FHolidays: TFPObjectList;
FHolidaysYear: Integer;
procedure CalcHolidays(AYear: Integer);
procedure ConnectHandler(Sender: TObject);
procedure CreateResourceGroup;
function GetlanguageDir: String;
@ -317,6 +326,12 @@ begin
Result := dtSunday;
end;
constructor THoliday.Create(AName: String; ADate: TDate);
begin
Name := AName;
Date := ADate;
end;
function Easter(AYear: integer): TDateTime;
// Calculates the date of the Easter holiday
var
@ -382,6 +397,44 @@ begin
UpdateOtherResourcesList;
end;
procedure TMainForm.CalcHolidays(AYear: Integer);
var
d: TDate;
wd: Integer;
begin
FHolidays.Clear;
// New Year
FHolidays.Add(THoliday.Create('New Year', EncodeDate(AYear, 1, 1)));
// Easter & related
d := Easter(AYear);
FHolidays.Add(THoliday.Create('Good Friday', d-2));
FHolidays.Add(THoliday.Create('Easter', d));
FHolidays.Add(THoliday.Create('Whitsunday', d + 49));
// Independence day
d := EncodeDate(AYear, 7, 4);
wd := DayOfTheWeek(d);
if wd = DaySaturday then
d := d + 2
else
if wd = DaySunday then
d := d + 1;
FHolidays.Add(THoliday.Create('Indepencence Day (U.S.)', d));
// Labor Day
d := EncodeDayOfWeekInMonth(AYear, 9, 1, DayMonday); // 1st Monday in September
FHolidays.Add(THoliday.Create('Labor Day (U.S.)', d));
// Thanksgiving
d := EncodeDayOfWeekInMonth(AYear, 11, 4, DayThursday); // 4th Thursday in November
FHolidays.Add(THoliday.Create('Thanksgiving (U.S.)', d));
// Christmas
FHolidays.Add(THoliday.Create('Christmas', EncodeDate(AYear, 12, 25)));
end;
procedure TMainForm.Cb3DChange(Sender: TObject);
var
ds: TVpDrawingStyle;
@ -521,6 +574,8 @@ procedure TMainForm.FormCreate(Sender: TObject);
var
i: Integer;
begin
FHolidays := TFPObjectList.Create;
PopulateLanguages;
ReadIni;
@ -574,6 +629,11 @@ begin
if Components[i] is TLabel then TLabel(Components[i]).Transparent := true;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FHolidays.Free;
end;
procedure TMainForm.lbOtherResourcesClickCheck(Sender: TObject);
var
i, n: Integer;
@ -1183,34 +1243,23 @@ end;
procedure TMainForm.VpHoliday(Sender: TObject; ADate: TDateTime;
var AHolidayName: String);
var
d,m,y: Word;
tmp: Word;
easterDate: TDate;
i: Integer;
holiday: THoliday;
year: Integer;
begin
DecodeDate(ADate, y,m,d);
if (d=1) and (m=1) then
AHolidayName := 'New Year'
else
if (d = 25) and (m = 12) then
AHolidayName := 'Christmas'
else
if m = 9 then begin
tmp := 1;
while DayOfWeek(EncodeDate(y, m, tmp)) <> 2 do inc(tmp);
if tmp = d then
AHolidayName := 'Labor Day (U.S.)'; // 1st Monday in September
end
else begin
// Holidays depending on the date of Easter.
easterDate := Easter(y);
if ADate = easterDate - 2 then
AHolidayName := 'Good Friday'
else
if ADate = easterDate then
AHolidayName := 'Easter'
else
if ADate = easterDate + 49 then
AHolidayName := 'Whitsunday'
year := YearOf(ADate);
if year <> FHolidaysYear then
begin
FHolidaysYear := year;
CalcHolidays(year);
end;
for i := 0 to FHolidays.Count-1 do
begin
holiday := THoliday(FHolidays[i]);
if holiday.Date = ADate then begin
AHolidayName := holiday.Name;
exit;
end;
end;
end;