home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sibdemo3.zip / SOURCE.DAT / SOURCE / ADDON / CALENDAR.PAS < prev    next >
Pascal/Delphi Source File  |  1998-05-02  |  6KB  |  275 lines

  1. Unit Calendar;
  2.  
  3. Interface
  4.  
  5. Uses
  6.   SysUtils, Classes, Forms, Grids;
  7.  
  8. {Declare new class}
  9. Type
  10.   TCalendar=Class(TGrid)
  11.     Private
  12.       FDate: TDateTime;
  13.       FMonthOffset: Integer;
  14.       FOnChange:TNotifyEvent;
  15.     Private
  16.       Function DayNum(Col,Row:LongInt):LongInt;
  17.       Function DaysThisMonth:LongInt;
  18.       Function GetYear:LongInt;
  19.       Function GetMonth:LongInt;
  20.       Function GetDay:LongInt;
  21.       Procedure SetYear(NewValue:LongInt);
  22.       Procedure SetMonth(NewValue:LongInt);
  23.       Procedure SetDay(NewValue:LongInt);
  24.       Function IsLeapYear:Boolean;
  25.       Procedure UpdateCalendar;
  26.       Procedure SetCalendarDate(NewValue:TDateTime);
  27.     Protected
  28.       Procedure SetupComponent; Override;
  29.       Procedure Resize; Override;
  30.       Procedure DrawCell(Col,Row:LONGINT;rec:TRect;AState:TGridDrawState); Override;
  31.       Procedure Change;Virtual;
  32.     Public
  33.       Destructor Destroy; Override;
  34.       Procedure NextYear;
  35.       Procedure PrevYear;
  36.       Procedure NextMonth;
  37.       Procedure PrevMonth;
  38.     Public
  39.       Property Year:LongInt read GetYear write SetYear;
  40.       Property Month:LongInt read GetMonth write SetMonth;
  41.       Property Day:LongInt read GetDay write SetDay;
  42.       Property CalendarDate:TDateTime read FDate write SetCalendarDate;
  43.     Published
  44.       Property OnChange:TNotifyEvent  read FOnChange write FOnChange;
  45.       Property Align;
  46.       Property Bottom;
  47.       Property DragCursor;
  48.       Property DragMode;
  49.       Property Enabled;
  50.       Property Font;
  51.       Property Height;
  52.       Property Left;
  53.       Property ParentFont;
  54.       Property ParentShowHint;
  55.       Property PopupMenu;
  56.       Property ShowHint;
  57.       Property TabOrder;
  58.       Property Visible;
  59.       Property Width;
  60.       Property ZOrder;
  61.  
  62.       Property OnCanDrag;
  63.       Property OnCommand;
  64.       Property OnDblClick;
  65.       Property OnDragDrop;
  66.       Property OnDragOver;
  67.       Property OnEndDrag;
  68.       Property OnEnter;
  69.       Property OnExit;
  70.       Property OnFontChange;
  71.   End;
  72.  
  73. Implementation
  74.  
  75. Procedure TCalendar.Change;
  76. Begin
  77.   IF FOnChange<>Nil Then FOnChange(Self);
  78. End;
  79.  
  80. Procedure TCalendar.SetCalendarDate(NewValue: TDateTime);
  81. Begin
  82.   FDate := NewValue;
  83.   UpdateCalendar;
  84.   Change;
  85. End;
  86.  
  87. Function TCalendar.GetYear:LongInt;
  88. Var AYear,AMonth,ADay:Word;
  89. Begin
  90.   DecodeDate(FDate, AYear, AMonth, ADay);
  91.   Result := AYear;
  92. End;
  93.  
  94. Function TCalendar.GetMonth:LongInt;
  95. Var AYear,AMonth,ADay:Word;
  96. Begin
  97.   DecodeDate(FDate, AYear, AMonth, ADay);
  98.   Result := AMonth;
  99. End;
  100.  
  101. Function TCalendar.GetDay:LongInt;
  102. Var AYear,AMonth,ADay:Word;
  103. Begin
  104.   DecodeDate(FDate, AYear, AMonth, ADay);
  105.   Result := ADay;
  106. End;
  107.  
  108. Procedure TCalendar.SetYear(NewValue:LongInt);
  109. Var AYear,AMonth,ADay:Word;
  110. Begin
  111.   If NewValue<0 Then exit;
  112.   DecodeDate(FDate, AYear, AMonth, ADay);
  113.   AYear:=NewValue;
  114.   FDate := EncodeDate(AYear, AMonth, ADay);
  115.   UpdateCalendar;
  116.   Change;
  117. End;
  118.  
  119. Procedure TCalendar.SetMonth(NewValue:LongInt);
  120. Var AYear,AMonth,ADay:Word;
  121. Begin
  122.   If NewValue<0 Then exit;
  123.   DecodeDate(FDate, AYear, AMonth, ADay);
  124.   AMonth:=NewValue;
  125.   FDate := EncodeDate(AYear, AMonth, ADay);
  126.   UpdateCalendar;
  127.   Change;
  128. End;
  129.  
  130. Procedure TCalendar.SetDay(NewValue:LongInt);
  131. Var AYear,AMonth,ADay:Word;
  132. Begin
  133.   If NewValue<0 Then exit;
  134.   DecodeDate(FDate, AYear, AMonth, ADay);
  135.   ADay:=NewValue;
  136.   FDate := EncodeDate(AYear, AMonth, ADay);
  137.   UpdateCalendar;
  138.   Change;
  139. End;
  140.  
  141. Procedure TCalendar.UpdateCalendar;
  142. Var AYear, AMonth, ADay: Word;
  143.     ADate:TDateTime;
  144. Begin
  145.   If FDate <> 0 Then
  146.   Begin
  147.     DecodeDate(FDate,AYear,AMonth,ADay);
  148.     ADate:=EncodeDate(AYear,AMonth,1);
  149.     FMonthOffset:=2-DayOfWeek(ADate);
  150.     Row:=(ADay-FMonthOffset) Div 7+1;
  151.     Col:=(ADay-FMonthOffset) Mod 7;
  152.   End;
  153.   Refresh;
  154. End;
  155.  
  156. Procedure TCalendar.SetupComponent;
  157. Begin
  158.   Inherited SetupComponent;
  159.   Name:='Calendar';
  160.   ColCount:=7;
  161.   RowCount:=7;
  162.   FixedCols:=0;
  163.   FixedRows:=1;
  164.   FDate:=Date;
  165.   Options:=Options-[goMouseSelect]+[goAlwaysShowSelection];
  166.   UpdateCalendar;
  167. End;
  168.  
  169. Destructor TCalendar.Destroy;
  170. Begin
  171.   Inherited Destroy;
  172. End;
  173.  
  174. Procedure TCalendar.Resize;
  175. Begin
  176.   Inherited Resize;
  177.   DefaultColWidth:=Width DIV 7;
  178.   DefaultRowHeight:=Height DIV 7;
  179. End;
  180.  
  181. Function TCalendar.DayNum(Col,Row:LongInt):LongInt;
  182. Begin
  183.   Result:=FMonthOffset+Col+(Row-1)*7;
  184.   If (Result<1)Or(Result>DaysThisMonth) Then Result :=-1;
  185. End;
  186.  
  187. Function TCalendar.DaysThisMonth:LongInt;
  188. Const
  189.   DaysPerMonth:Array[1..12] Of Integer =
  190.     (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  191. Begin
  192.   If FDate = 0 Then Result:=0
  193.   Else
  194.   Begin
  195.     Result := DaysPerMonth[Month];
  196.     If ((Month=2)And(IsLeapYear)) Then inc(Result);
  197.   End;
  198. End;
  199.  
  200. Function TCalendar.IsLeapYear:Boolean;
  201. Begin
  202.   Result:=(Year mod 4=0)And((Year mod 100<>0)Or(Year mod 400=0));
  203. End;
  204.  
  205. Procedure TCalendar.DrawCell(Col,Row:LONGINT;rec:TRect;AState:TGridDrawState);
  206. Var OldClip,Exclude:TRect;
  207.     X,Y,CX,CY:LongInt;
  208.     Cap:String;
  209.     Day:LongInt;
  210.     Back,Fore:TColor;
  211. Begin
  212.   SetupCellColors(Col,Row,AState,Back,Fore);
  213.   Canvas.Brush.Color:=Back;
  214.   Canvas.Pen.Color:=Fore;
  215.  
  216.   If Row=0 Then Cap:=ShortDayNames[Col+1] //Fixed
  217.   Else
  218.   Begin
  219.        Day:=DayNum(Col,Row);
  220.        If Day>=0 Then Cap:=tostr(Day)
  221.        Else Cap:='';
  222.   End;
  223.  
  224.   X:=rec.Left+2;
  225.   Y:=rec.Top-2-Canvas.Font.Height;
  226.   Canvas.GetTextExtent(Cap,CX,CY);
  227.   Canvas.TextOut(X,Y,Cap);
  228.  
  229.   OldClip:=Canvas.ClipRect;
  230.   Exclude.Left:=X;
  231.   Exclude.Right:=X+CX-1;
  232.   Exclude.Bottom:=Y;
  233.   Exclude.Top:=Y+CY-1;
  234.   Canvas.ClipRect:=rec;
  235.   Canvas.ExcludeClipRect(Exclude);
  236.   Inherited DrawCell(Col,Row,rec,AState);
  237.   Canvas.ClipRect:=OldClip;
  238. End;
  239.  
  240. Procedure TCalendar.NextYear;
  241. Begin
  242.   Year:=Year+1;
  243. End;
  244.  
  245. Procedure TCalendar.PrevYear;
  246. Begin
  247.   Year:=Year-1;
  248. End;
  249.  
  250. Procedure TCalendar.NextMonth;
  251. Begin
  252.   If Month=12 Then
  253.   Begin
  254.      Month:=1;
  255.      NextYear;
  256.   End
  257.   Else Month:=Month+1;
  258. End;
  259.  
  260. Procedure TCalendar.PrevMonth;
  261. Begin
  262.   If Month=1 Then
  263.   Begin
  264.      Month:=12;
  265.      PrevYear;
  266.   End
  267.   Else Month:=Month-1;
  268. End;
  269.  
  270. Initialization
  271.   {Register classes}
  272.   RegisterClasses([TCalendar]);
  273. End.
  274.  
  275.