Dates.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit Dates;
  2. interface
  3. uses
  4.   Classes, SysUtils;
  5. type
  6.   TDate = class
  7.   private
  8.     fDate: TDateTime;
  9.     FOnChange: TNotifyEvent;
  10.     function GetYear: Integer;
  11.     function GetDay: Integer;
  12.     function GetMonth: Integer;
  13.     procedure SetDay(const Value: Integer);
  14.     procedure SetMonth(const Value: Integer);
  15.     procedure SetYear(const Value: Integer);
  16.   protected
  17.     procedure DoChange; dynamic;
  18.   public
  19.     constructor Create; overload;
  20.     constructor Create (y, m, d: Integer); overload;
  21.     procedure SetValue (y, m, d: Integer); overload;
  22.     procedure SetValue (NewDate: TDateTime); overload;
  23.     function LeapYear: Boolean;
  24.     procedure Increase (NumberOfDays: Integer = 1);
  25.     procedure Decrease (NumberOfDays: Integer = 1);
  26.     function GetText: string; virtual;
  27.     property Day: Integer read GetDay write SetDay;
  28.     property Month: Integer read GetMonth write SetMonth;
  29.     property Year: Integer read GetYear write SetYear;
  30.     property Text: string read GetText;
  31.     property OnChange: TNotifyEvent
  32.       read FonChange write FOnChange;
  33.   end;
  34.   TNewDate = class (TDate)
  35.   public
  36.      function GetText: string; override;
  37.   end;
  38.   // custom exception
  39.   EDateOutOfRange = class (Exception)
  40.   end;
  41. implementation
  42. procedure TDate.SetValue (y, m, d: Integer);
  43. begin
  44.   fDate := EncodeDate (y, m, d);
  45.   // fire the event
  46.   DoChange;
  47. end;
  48. function TDate.LeapYear: Boolean;
  49. begin
  50.   // compute leap years, considering "exceptions"
  51.   if (GetYear mod 4 <> 0) then
  52.     LeapYear := False
  53.   else if (GetYear mod 100 <> 0) then
  54.     LeapYear := True
  55.   else if (GetYear mod 400 <> 0) then
  56.     LeapYear := False
  57.   else
  58.     LeapYear := True;
  59. end;
  60. procedure TDate.Increase (NumberOfDays: Integer = 1);
  61. begin
  62.   fDate := fDate + NumberOfDays;
  63.   // fire the event
  64.   DoChange;
  65. end;
  66. function TDate.GetText: string;
  67. begin
  68.   GetText := DateToStr (fDate);
  69. end;
  70. procedure TDate.Decrease (NumberOfDays: Integer = 1);
  71. begin
  72.   fDate := fDate - NumberOfDays;
  73.   // fire the event
  74.   DoChange;
  75. end;
  76. constructor TDate.Create (y, m, d: Integer);
  77. begin
  78.   fDate := EncodeDate (y, m, d);
  79. end;
  80. constructor TDate.Create;
  81. begin
  82.   fDate := Date;
  83. end;
  84. function TDate.GetYear: Integer;
  85. var
  86.   y, m, d: Word;
  87. begin
  88.   DecodeDate (fDate, y, m, d);
  89.   Result := y;
  90. end;
  91. procedure TDate.SetValue(NewDate: TDateTime);
  92. begin
  93.   fDate := NewDate;
  94.   // fire the event
  95.   DoChange;
  96. end;
  97. function TDate.GetDay: Integer;
  98. var
  99.   y, m, d: Word;
  100. begin
  101.   DecodeDate (fDate, y, m, d);
  102.   Result := d;
  103. end;
  104. function TDate.GetMonth: Integer;
  105. var
  106.   y, m, d: Word;
  107. begin
  108.   DecodeDate (fDate, y, m, d);
  109.   Result := m;
  110. end;
  111. procedure TDate.SetDay(const Value: Integer);
  112. begin
  113.   if (Value < 0) or (Value > 31) then
  114.     raise EDateOutOfRange.Create ('Invalid month');
  115.   SetValue (Year, Month, Value);
  116. end;
  117. procedure TDate.SetMonth(const Value: Integer);
  118. begin
  119.   if (Value < 0) or (Value > 12) then
  120.     raise EDateOutOfRange.Create ('Invalid month');
  121.   SetValue (Year, Value, Day);
  122. end;
  123. procedure TDate.SetYear(const Value: Integer);
  124. begin
  125.   SetValue (Value, Month, Day);
  126. end;
  127. procedure TDate.DoChange;
  128. begin
  129.   if Assigned (FOnChange) then
  130.     FOnChange (Self);
  131. end;
  132. { TNewDate }
  133. function TNewDate.GetText: string;
  134. begin
  135.   GetText := FormatDateTime ('mmmm, dd yyyy', fDate);
  136. end;
  137. end.