VB程序设计课程论文题目:万年日历程序分析系别:机电工程系专业:机械设计制造及其自动化姓名:指导教师:题目类型:理论研究实验研究工程设计工程技术研究软件开发前言在日常生活和工作中,人们经常用到农历和公历来查询。日历在人们的生活中相当重要。目前流行的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基础于该程序所开发的各种应用程序中的日历程序。然而,这些程序都千篇一律的局限在一个很短的时间范围内。(Windows各个版本一般都局限在1980年至2099年这一范围内),但是,在很多情况下,一个时间跨度较大的日历程序是很有参考价值的,本程序在这种背景下开始编辑,其中集成了国际通用日历和中国农历,此外还可以显示星期和加载了部分节日,显示本机准确日期等功能。设计思想:众所周知,地球绕太阳公转,公转一周历时365天5小时48分46秒。现代国际上普遍采用罗马历法,在罗马历法中人为地规定一年365天,也就是我们所说的平年,为了弥补每一年多出的5小时48分46秒,同时又规定4年中有一年是闰年,闰年为366天(平年的2月份为28天,而闰年的2月份为29天),这样4年有365*3+366=1461天,而地球绕太阳公转4周历时1460天23小时15分4秒,这样,每4年又产生了44分56秒的误差,为了减小影响,历法上又规定,每400年中只存在97个闰年,这样400年中共有365*400+97=146097天,而地球绕太阳公转400周历时146096天21小时6分40秒,较好的弥补了这一缺陷,这样几乎3300年才产生一天的误差。所以在历法规定:年份能被4整除的(即年份为4的倍数)都是闰年,不过,年份以“00”结尾的但年份不能被400整除的不是闰年,即公元100、200、300等都不是闰年,公元400、800、1200等是闰年。这一规定适合于公元后的任何年份,但是不适合于公元前的年份,同时现代历法也认为,不存在公元0年,公元前1年的第二年为公元1年,并不存在公元0年。实现年月日及时间的查询与修改,功能类似于Windows的时间和日期。同时具备了阴阳历的转换功能,能显示所要查日期的星期和一些纪念日等的功能。实现过程:我设计该程序用的是VisualBasic6.0。首先,创建一个空白窗体,然后加入了一个Tab控件,用来切换时间和日期与阴阳历。在时间和日期Tab中,加入两个Frame,一个用来存放显示日期的控件,一个用来存放显示时间的控件。在日期Frame中,添加一个ComboBox控件,用来显示月份,添加一个Text用来显示年,再在下面加一个Picture控件,在里面放入42个个文本框控件,此处用的是控件数组,用来放日期。在时间Frame框中存放的是一个表面和三条不同粗细的直线,以及几个文本框,用来显示时间。三条直线分别表示时分秒针,此处考虑到指针的位置的变化,算法中因整个表面一周是360度,可是设置一个Timer控件,每一秒钟刷新一次,同时调整三个指针的终端的位置,秒针每秒转360*(1/60)度,而分针则转360*(1/(60*60)度,时针因为变化较小,没有必要再按秒转动了,可以根据分针的值来变化位置。几个文本框同时也显示系统的时间。如果想要设置新时间时,只要改变三个文本框中的值,再点应用或者确定,系统时间就随着变为当前设置的时间了。改变系统的日期的方法也是类似,只要改变了日期中的年月日,再点确定就可以了。另一个Tab中同时显示阴历和阳历。用的控件和第一个中的差不多,只是显示日期的控件数组要多一倍,用来显示阴历中的日期。右边的纪念日栏中用来显示一些特别的日子,如:“日期为一月一日的时候,纪念日中的文本框中会显示‘元旦’。”由于特别的日子并不是很多,所以在设计的时候直接用了一个SelectCase语句。下面是程序中的主要功能的实现代码:1.主窗体加载的代码:PrivateSubForm_Load()DimiAsIntegerTimer1.Enabled=TrueCom_Month.ListIndex=Month(Now)-1Txt_Year=Year(Now)OldValue=VScroll1.Value''记录年的变化''显示日期表中的数据Fori=Txt_Day.LBoundToTxt_Day.UBoundTxt_Day(i).BackColor=RGB(255,255,255)Txt_Day(i).ForeColor=RGB(0,0,0)NextiLocalDay=Day(Now)''日期表中的数据''第一个标签中的项目ChangeDateYear(Now),Month(Now),Day(Now)''*********************************************''公历中的显示Com_MonthGL.ListIndex=Month(Now)-1Txt_YearGL=Year(Now)''显示日期表中的数据Fori=Txt_Day.LBoundToTxt_Day.UBoundTxtGongLi(i).BackColor=RGB(255,255,255)TxtGongLi(i).ForeColor=RGB(0,0,0)NextiChangeNongLiYear(Now),Month(Now),Day(Now)ChangeGongLiYear(Now),Month(Now),Day(Now)EndSub2.Timer控件中对时间显示的控件的代码:PrivateSubTimer1_Timer()''时间设置Txt_Hour=Hour(Now)If(Minute(Now)=9)ThenTxt_Minute=0&Minute(Now)ElseTxt_Minute=Minute(Now)EndIfIf(Second(Now)=9)ThenTxt_Second=0&Second(Now)ElseTxt_Second=Second(Now)EndIf''钟表的变化DimSecJiaoAsDouble,MinJiaoAsDouble,HourJiaoAsDoubleSecJiao=Second(Now)/60*3.1415926*2Line_Second.X2=1000+800*Sin(SecJiao)Line_Second.Y2=200+800*(1-Cos(SecJiao))MinJiao=(Minute(Now)*60+Second(Now))/3600*3.1415926*2Line_Minute.X2=1000+650*Sin(MinJiao)Line_Minute.Y2=350+650*(1-Cos(MinJiao))HourJiao=(Hour(Now)*3600+Minute(Now)*60+Second(Now))/43200*3.1415926*2Line_Hour.X2=1000+500*Sin(HourJiao)Line_Hour.Y2=500+500*(1-Cos(HourJiao))EndSub3.当更改日期时控件的变化:SubChangeDate(iYearAsInteger,iMonthAsInteger,iDayAsInteger)DimLocalWeekAsInteger,DaysAsIntegerDimFirstDayAsIntegerDimiAsInteger''清空Fori=Txt_Day.LBoundToTxt_Day.UBoundTxt_Day(i).Text=NextiFori=Txt_Day.LBoundToTxt_Day.UBoundTxt_Day(i).BackColor=RGB(255,255,255)Txt_Day(i).ForeColor=RGB(0,0,0)Nexti''记录当前的时间并在日期栏中做相应的显示LocalWeek=Week(iYear,iMonth,iDay)FirstDay=Week(iYear,iMonth,1)Days=SomeDay(Txt_Year.Text,Com_Month.ListIndex+1)Fori=FirstDayToDays+FirstDay-1Txt_Day(i).Text=i-FirstDay+1NextiTxt_Day(LocalDay-1+FirstDay).BackColor=RGB(0,0,255)Txt_Day(LocalDay-1+FirstDay).ForeColor=RGB(255,255,255)EndSubSubChangeGongLi(iYearAsInteger,iMonthAsInteger,iDayAsInteger)DimLocalWeekAsInteger,DaysAsIntegerDimFirstDayAsIntegerDimiAsInteger''清空Fori=TxtGongLi.LBoundToTxtGongLi.UBoundTxtGongLi(i).Text=NextiFori=TxtGongLi.LBoundToTxtGongLi.UBoundTxtGongLi(i).BackColor=RGB(255,255,255)TxtGongLi(i).ForeColor=RGB(0,0,0)Nexti''记录当前的时间并在日期栏中做相应的显示LocalWeek=Week(iYear,iMonth,iDay)FirstDay=Week(iYear,iMonth,1)Days=SomeDay(Txt_YearGL.Text,Com_MonthGL.ListIndex+1)Fori=FirstDayToDays+FirstDay-1TxtGongLi(i).Text=i-FirstDay+1NextiTxtGongLi(LocalDay-1+FirstDay).BackColor=RGB(0,0,255)TxtGongLi(LocalDay-1+FirstDay).ForeColor=RGB(255,255,255)'纪念日JiNianEndSubSubChangeNongLi(iYearAsInteger,iMonthAsInteger,iDayAsInteger)''农历的设置DimLocalWeekAsInteger,DaysAsIntegerDimFirstDayAsIntegerDimiAsInteger''清空Fori=TxtNongLi.LBoundToTxtNongLi.UBoundTxtNongLi(i).Text=NextiFori=TxtNongLi.LBoundToTxtNongLi.UBoundTxtGongLi(i).BackColor=RGB(255,255,255)TxtGongLi(i).ForeColor=RGB(0,0,0)Nexti''记录当前的时间并在日期栏中做相应的显示LocalWeek=Week(iYear,iMonth,iDay)FirstDay=Week(iYear,iMonth,1)Days=SomeDay(Txt_YearGL.Text,Com_MonthGL.ListIndex+1)Fori=FirstDayToDays+FirstDay-1TxtNongLi(i).Text=GetNongLi(iYear,iMonth,i-FirstDay+1)NextiEndSub5.判断是当前月的第一天是星期几PublicFunctionWeek(iYearAsInteger,iMonthAsInteger,iDayAsInteger)AsIntegerDimiAsIntegerDimTotalAsLongTotal=0'计算当前天离1900年1月1日共有几天Fori=BaseYearToiYear-1If(IsLeapYear(i))ThenTotal=Total+366ElseTotal=Total+365EndIfNextiFori=1ToiMonth-1If((i=1)Or(i=3)Or(i=5)Or(i=7)Or(i=