22+Windows+开发实例:日程提醒程序.ppt_第1页
22+Windows+开发实例:日程提醒程序.ppt_第2页
22+Windows+开发实例:日程提醒程序.ppt_第3页
22+Windows+开发实例:日程提醒程序.ppt_第4页
22+Windows+开发实例:日程提醒程序.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第22章WindowsForm开发实例日程提醒程序,本章将带领大家一起完成一个WindowsForm的开发实例日程提醒程序的设计与开发。本实例中综合应用了前面讲述的知识,主要采用了Windows窗体和控件技术、菜单与工具栏设计等技术、数据访问ADO.NET技术及数据绑定控件DataGridView等。该系统主要完成事务管理和自动提醒两大功能,支持开机自动运行。事务管理功能支持事务的添加、删除、修改和查询。自动提醒功能支持提醒任务设置,任务到期时会自动提醒。,章节内容,22.1开发背景22.2系统分析22.3系统设计22.4功能实现22.5运行结果,22.1开发背景,现代生活,工作节奏快,事务繁杂。很多习惯使用纸质记事本的人发现记事本越来越厚,且不容易查找和管理。随着计算机在办公和日常生活中的使用普及,越来越多的人都倾向于使用计算机、PDA、移动电话等电子设备管理和安排自己的事务和行程,日程提醒程序就应运而生。,本章的日程提醒程序源自某集团企业协同办公系统中的一个模块,解决日常办公中的日程安排问题。现在笔者将其剥离出来,利用VB.NET重新加以设计和实现,使其可以独立运行,但项目过程的几个重要环节仍然保留下来,以便读者从软件工程的角度来理解软件开发过程。,22.2系统分析,22.2.1需求分析功能需求:,数据库需求分析,根据功能需求分析,任务信息和过期任务信息都需要持久化。从性能考虑,我们将其分别存储在不同表中。,环境需求分析,开发环境分析运行环境分析,22.2.2可行性分析,可行性分析的目的是对于项目是否可进行以及项目进行过程的各种主要影响因素的评估。从技术、经济、社会与法律和风险方面进行说明。,技术方面,整个程序属于一个规模比较大的企业协同办公系统的子模块,从这个子模块技术构成上来看,其基本操作还是对存在数据库进行添加、删除、查找、编辑等,这在.NET平台上可以使用ADO.NET组件方便地实现。另外,提醒功能用到的计时器、多线程操作等也可以使用Timer类实现。又因为是WindowsForm程序,所以可以简化到用Timer控件实现。,经济方面,因为Windows应用程序是运行在客户机本地的,所以可以利用本地PC机高性能的计算能力和存储能力来完成大多数业务处理,这是采用WindowsForm程序作为程序客户端的重要原因。除工作流任务外,用户通常都是都是自己定制自己的日程安排,互不影响,从这点上讲,数据完全可以存储在用户本地计算机上,而且数据量不会太大(100000记录)。因此我们采用桌面级数据库Access作为数据库。它经济小巧,又能满足业务需要。,社会与法律方面,整个系统用VisualStudio2008、VB.NET语言开发,运行在可以免费分发的.NETFramework平台上,所以软件本身不存在法律上的版权争议。当然VisualStudio2008正式版开发软件是需要微软公司授权的。另外,只要用户拥有本地Office正版使用权,那么可以自由使用Access数据库。,风险方面,用户的需求并不稳定,有可能会将该功能扩展到其他业务中,这需要以书面方式确定本程序功能边界。使用WindowsVista操作系统版本以下的用户(如Windows2000,WindowsXP等)还需要单独安装.NETFramework运行库,这需要培训与指导。,22.3系统设计,系统功能设计、界面设计以及数据库设计,其中系统功能设计主要是根据业务处理功能来决定系统的模块结构,而数据库设计与程序运行的效率有着密切的关系。,界面设计,采用软件工程中的原型法,即通过形象具体的界面来引导甲乙双方的需求理解。原型中的界面并不包括逻辑代码,即并不包括核心的业务实现代码。,主界面,提醒窗体,数据库设计,任务信息表,22.4功能实现,22.4.1任务管理程序文件包括:任务列表窗体(MainForm.vb)实现任务的浏览显示功能;添加任务窗体(AddTask.vb)实现记录新任务的功能。,MainForm.vb中显示所有任务逻辑是由RefreshList方法实现的,代码如下。1PrivateSubRefreshList()2DimsqlAsString=select*fromtask3DataGridView1.DataSource=db.DoSelect(sql)4EndSub只要取出task表中所有数据,并绑定到DataGridView控件上即可。,AddTask.vb中单击【保存】按钮时保存任务,其主要逻辑就是组装Insert语句,代码如下。1PrivateSubbtSave_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtSave.Click2设置语句3DimsqlAsString=insertintotask(id,title,cycle,begintime)values(id,title,cycle,begintime)4设置参数5Dimparams(3)AsSystem.Data.OleDb.OleDbParameter6params(0)=NewSystem.Data.OleDb.OleDbParameter(id,IDManager.GetIssueID(),7params(1)=NewSystem.Data.OleDb.OleDbParameter(title,tbTitle.Text)8params(2)=NewSystem.Data.OleDb.OleDbParameter(cycle,cbCycle.SelectedItem.ToString()9params(3)=NewSystem.Data.OleDb.OleDbParameter(begintime,DateTimePicker1.Value.ToString(yyyy-MM-ddHH:mm:ss)10执行11Ifdb.DoUpdate(sql,params)=1Then12Me.DialogResult=Windows.Forms.DialogResult.OK13Else14MessageBox.Show(db.Message)15EndIf1617EndSub,删除任务的主要逻辑就是组织Delete语句,代码如下。1PrivateSubcmsDeleteTask_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlescmsDeleteTask.Click2DimsqlAsString=deletefromtaskwhereid=id3Dimparams(0)AsSystem.Data.OleDb.OleDbParameter4params(0)=NewSystem.Data.OleDb.OleDbParameter(id,SelectedTask)5DimrowsAsInteger=db.DoUpdate(sql,params)6Ifrows=1Then7DataGridView1.Rows.Remove(DataGridView1.SelectedRows(0)8EndIf9EndSub,22.4.2自动提醒,程序的自动提醒实现原理是某个线程不断检测是否有提醒任务,如果有则发出相应信号,然后会调用提醒窗口提醒用户。,下面这段代码是一个检测是否有可提醒任务的实现。12获取提醒345PrivateSubGetAlerts()6DimtasksAsDataTable=task.CheckTask()7如果没有任务则中断执行8IftasksIsNothingThen9ExitSub10EndIf11用于判断是否有新提醒12DimisDiff=False,13第一次加载14IfAlertForm.Instance.DataIsNothingThen15isDiff=True16Else17判断是否发生了改变18ForEachdrAsDataRowIntasks.Rows19如果新的任务没有出现过,则表示为数据源发生了变化20Dimfilter=id=&dr(id)&21IfAlertForm.Instance.Data.Select(filter).Count=0Then22isDiff=True23ExitFor24EndIf25Next26EndIf27如果不同就提示28IfisDiffThen29调用提醒窗口30AlertForm.Instance.Data=tasks31AlertForm.Instance.Show()32EndIf33EndSub,分析:过程GetAlerts中为了避免反复提醒影响到用户其他工作,采用isDiff开关来保证只有新任务出现时才再次刷新提醒窗口内容。判断是否有新任务实际上就是将从数据库提取出来的任务与提醒窗口AlertForm已有的任务进行比对,如果发现有AlertForm窗口中所没有的任务则表示有新任务。,接下来,我们使用Timer组件TimerOnce来定时执行GetAlerts过程,该控件包含了分线程和计时执行的功能,可谓一举两得。这里为了减少程序CPU占用率,将Interval属性设置为10000,即10秒。1PrivateSubTimerOnce_Tick(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesTimerOnce.Tick2GetAlerts()3EndSub,TimerOnce的启动操作是在窗体Load事件发生时进行的,代码如下。1PrivateSubMainForm_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load2DataGridView1.AutoGenerateColumns=False列表不自动产生列3RefreshList()4TimerOnce.Start()启动检测5EndSub,注意,当程序退出时要停止Timer,这里我们将这步操作放到主窗体关闭时进行,代码如下。1PrivateSubMainForm_FormClosing(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.FormClosingEventArgs)HandlesMyBase.FormClosing2TimerOnce.Stop()3EndSub,实现提醒任务的显示,由于我们希望提醒窗口只有一个,如果有新的任务就体现到窗口的列表中,而不是新开一个窗口。所以我们用单例设计模式(Singleton)来实现这种效果。单例窗体的实现需要以下两个步骤。(1)屏蔽构造函数。这是防止他人使用构造函数实例化多个窗体对象的手段。我们将构造函数New访问修饰符降低到Private即可。(2)提供自定义构造方法。强制使用者在应用该窗体时使用,并在方法中实现单例控制。注意代码中的Instance属性,只能通过该属性来获取窗体实例。,12提醒窗体345PublicClassAlertForm6DimtaskAsTaskClass=NewTaskClass()7PrivateShared_InstanceAsAlertForm=Nothing89窗体实例1011单例模式12PublicSharedReadOnlyPropertyInstance()AsAlertForm13Get14If_InstanceIsNothingThen15_Instance=NewAlertForm()16EndIf17Return_Instance18EndGet19EndProperty,2021选择的任务2223PrivateReadOnlyPropertySelectedTask()AsString24Get25IfDataGridView1.SelectedRows.Count=0Then26ReturnString.Empty27Else28ReturnDataGridView1.SelectedRows(0).Cells(colID).Value.ToString()29EndIf30EndGet31EndProperty32,33屏蔽构造函数New3435这是实现单例窗体的一个步骤36PrivateSubNew()37此调用是Windows窗体设计器所必需的。38InitializeComponent()39在InitializeComponent()调用之后添加任何初始化。40关闭列表的自动产生列41DataGridView1.AutoGenerateColumns=False4243EndSub,4445提醒任务数据4647用于传递48PublicPropertyData()AsDataTable49Set(ByValvalueAsDataTable)50DataGridView1.DataSource=value51EndSet52Get53ReturnDataGridView1.DataSource54EndGet55EndProperty56,57隐藏窗体585960PrivateSubAlertForm_FormClosing(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.FormClosingEventArgs)HandlesMyBase.FormClosing61e.Cancel=True62Me.Hide()63EndSub6465解除任务6667PrivateSubbtRelease_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtRelease.Click68task.ReleaseTask(SelectedTask)69EndSub70EndClass,解除任务实际上就是将任务从任务从Task表中移除,使检测线程不再检测到这个任务。由于被解除任务还要保存下来备份,所以这里就涉及到两个表达更新操作,我们使用ADO.NET中的事务控制来实现,详细代码如下。12解除任务34任务ID5将任务转移到matured表6PublicSubReleaseTask(ByValidAsString)7SQL集合8DimsqlListAsList(OfString)=NewList(OfString)()9将要存档的任务取出10Dimsql1AsString=selecttitle,content,cycle,begintimefromtaskwhereid=&id&11DimdtAsDataTable=db.DoSelect(sql1),12参数13Dimparams(5)AsOleDbParameter14params(0)=NewOleDbParameter(id,id)15params(1)=NewOleDbParameter(title,dt.Rows(0)(title)16params(2)=NewOleDbParameter(content,dt.Rows(0)(content)17params(3)=NewOleDbParameter(cycle,dt.Rows(0)(cycle)18params(4)=NewOleDbParameter(begintime,dt.Rows(0)(begintime)19params(5)=NewOleDbParameter(restarttime,)周期性任务开始时间重设20复制到matured表21Dimsql2AsString=insertintomaturedtask(id,title,content,cycle,begintime)values(id,title,content,cycle,begintime)22sqlList.Add(sql2),23从task表中删除24Dimsql3AsString=deletefromtaskwhereid=id25Ifdt.Rows(0)(cycle).ToString()无周期Then26sql3=updatetasksetbegintime=restarttimewhereid=id27params(5)=NewOleDbParameter(restarttime,DateTime.Now.ToShortTimeString()28EndIf29sqlList.Add(sql3)30执行31db.DoBatUpdate(sqlList,params)32EndSub,22.4.3设置自动运行,在Windows操作系统中要设置程序在操作系统启动时自动执行,可以考虑如下两种常用方法。(1)“启动”文件夹。(2)“Run”注册表。,这里我们采用修改注册表的方法来实现。,“HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersion”下有多个子键可以设置自动运行。,“设置”窗体Setting.vb中对于设置自动启动的实现。首先SetAutoRun过程用于根据界面选择来设置注册表;GetAsAut

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论