返回
{***************************************************************}
{*** FVision Unit Version1.0 ***}
{*** 蓝蚂蚁工作室 ***}
{***************************************************************}
{*** 日历单元 ***}
{***************************************************************}
{$F+,O+,X+,S-,D-}
Unit FCalenda;
Interface
Uses
Dos,Graph,FView,FEvent,FGraph,FMouse,FWrite,FTool;
Type
PCalendarView = ^TCalendarView;
TCalendarView = object(TView)
Year, Month, Days: Word;
CurYear, CurMonth, CurDay : Word;
Constructor Init(x,y: Integer);
Procedure HandleEvent(var Event: TEvent); virtual;
Procedure Paint;virtual;
Procedure Draw; virtual;
Procedure MoveTo(x,y:Integer);virtual;
end;
Function CalendarWindow:PWindow;
Implementation
Const
WeekStr: array[0..6] of string[2]=
('日','一','二','三','四','五','六');
DaysInMonth: array[1..12] of Byte =
(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
MonthStr: array[1..12] of string[20] =
('一月 January ',
'二月 February ',
'三月 March ',
'四月 April ',
'五月 May ',
'六月 June ',
'七月 July ',
'八月 August ',
'九月 September ',
'十月 October ',
'十一月 November ',
'十二月 December ');
Function CalendarWindow:PWindow;
var
R:TRect;
P:PWindow;
begin
AssignRect(R, 0, 0, 325, 210);
P:=New(PWindow,Init(R,'日历',True));
P^.Option:=P^.Option or opAligen8;
P^.Insert(New(PButton,Init(270 ,35,285,55,#30,kbUp,cmPrev)));
P^.Insert(New(PButton,Init(290 ,35,305,55,#31,kbDown,cmNext)));
P^.Insert(New(PCalendarView, Init(20,61)));
P^.Next;
P^.Center;
CalendarWindow:=P;
end;
{ TCalendarView }
Constructor TCalendarView.Init(x,y:Integer);
var
H: Word;
begin
Inherited Init;
Option:=Option+opCantSelect;
GetDate(CurYear, CurMonth, CurDay, H);
Year := CurYear;
Month := CurMonth;
Origin.x:=x;
Origin.y:=y;
Size.x:=7*40+4;
Size.y:=7*18+4;
end;
Function DayOfWeek(Day, Month, Year: Integer) : Integer;
var
Century, Yr, Dw: Integer;
begin
if Month < 3 then
begin
Inc(Month, 10);
Dec(Year);
end
else
Dec(Month, 2);
Century := Year div 100;
Yr := Year mod 100;
Dw := (((26 * Month - 2) div 10) + Day + Yr + (Yr div 4) +
(Century div 4) - (2 * Century)) mod 7;
if Dw < 0 then DayOfWeek := Dw + 7
else DayOfWeek := Dw;
end;
Procedure TCalendarView.MoveTo;
begin
Origin.x:=x;
Origin.y:=y;
end;
Procedure TCalendarView.Paint;
var
i:Integer;
begin
HideMouse;
DrawBroad(Origin.x-2,Origin.y-2,Origin.x+Size.x+2,Origin.y+Size.y+2,0);
SetColor(0);
for i:=0 to 7 do
Line(Origin.x+2+i*40,Origin.y+2,Origin.x+2+i*40,Origin.y+2+7*18);
for i:=0 to 7 do
Line(Origin.x+2,Origin.y+2+i*18,Origin.x+2+7*40,Origin.y+2+i*18);
for i:=0 to 6 do
signbroad(Origin.x+3+i*40,origin.y+3,origin.x+41+i*40,origin.y+19,1);
for i:=0 to 6 do
Writecs(Origin.x+16+i*40,Origin.y+4,WeekStr[i],0);
Draw;
end;
Procedure TCalendarView.Draw;
const
Width = 20;
var
i, j, DayOf, CurDays: Integer;
S: String;
B: array[0..Width] of Word;
Color, BoldColor, SpecialColor: Byte;
Dlt:Integer;
function Num2Str(I: Integer): String;
var
S:String;
begin
Str(i:2, S);
Num2Str := S;
end;
begin
HideMouse;
Full(Origin.x,Origin.y-22,Origin.x+240,Origin.y-5,7);
Writecs(origin.x,origin.y-22,MonthStr[Month],0);
Writecs(origin.x+180,origin.y-22,IntStr(Year)+'年',0);
DayOf := DayOfWeek(1, Month, Year);
Days := DaysInMonth[Month] + Byte((Year mod 4 = 0) and (Month = 2));
CurDays := 1 - DayOf;
for i := 1 to 6 do
begin
for j := 0 to 6 do
begin
full(Origin.x+16+j*40,Origin.y+4+i*18,Origin.x+32+j*40,Origin.y+18+i*18,7);
if (CurDays > 0) and (CurDays <= Days) then
begin
if CurDays<10 then Dlt:=4 else Dlt:=0;
{ if it is the current day }
if (Year = CurYear) and (Month = CurMonth) and
(CurDays = CurDay) then
Writecs(Origin.x+16+j*40+Dlt,Origin.y+4+i*18,Intstr(CurDays),10)
else if j=0 then
Writecs(Origin.x+16+j*40+Dlt,Origin.y+4+i*18,Intstr(CurDays),4)
else
Writecs(Origin.x+16+j*40+Dlt,Origin.y+4+i*18,Intstr(CurDays),0);
end;
Inc(CurDays);
end;
end;
ShowMouse;
end;
Procedure TCalendarView.HandleEvent(var Event: TEvent);
begin
Inherited HandleEvent(Event);
case Event.What of
evCommand:case Event.Command of
cmNext:begin
Inc(Month);
if Month > 12 then
begin
Inc(Year);
Month := 1;
end;
Draw;
end;
cmPrev:begin
Dec(Month);
if Month < 1 then
begin
Dec(Year);
Month := 12;
end;
Draw;
end;
end;
end;
end;
end.