用VC++设计和实现文档管理系统_第1页
用VC++设计和实现文档管理系统_第2页
用VC++设计和实现文档管理系统_第3页
用VC++设计和实现文档管理系统_第4页
用VC++设计和实现文档管理系统_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

廖骎《用VC++设计和实现文档管理系统》第38页共48页PAGE381引言文档管理系统的应用,克服了企业传统文档管理方法的缺点,提高管理部门的日常办公效率,增强了企业内部协同合作的能力;随着科技的进步和时代的发展,文档管理系统的改革也日趋完善。文档管理系统的应用,方便管理者有效管理文档的同时,大大提高了文档查找效率,进而提高了企业的综合效率。2开发工具的介绍VisualC++6.0是Microsoft公司在1998年推出的基于Windows9X和WindowsNT的优秀集成开发环境。该环境为用户提供了良好的可视化编程环境,程序员可以里利用该开发环境轻松地访问C++源代码编辑器,资源编辑器和使用内部调试器,并且可以创建项目文件。VisualC++6.0不仅包括编译器,而且它还包括许多有用组件,通过这些组件的协同工作,可以在VisualC++6.0集成环境中轻松地完成创建源文件,编辑资源,以及对程序的编译,连接和调试等各项工作。VC++6.0是Windows95/98、XP或WindowsNT下的一个应用程序,本身对软硬件没有特殊要求。就是说它对环境的要求与Windows95/98、WindowsNT要求是一致的。硬件要求:一般在586以上的处理器、16MB以上内存、100MB以上的硬盘。软件要求:Windows95/98或WindowsNT3.51以上版本。VC++6.0系统可以在一张CD盘上,也可以在“VisualStudio(VisualC++、VisualFoxpro)”等产品的第一张CD盘上。一般都有一个VC的自动安装程序,也可以执行VC6目录下的setup.exe,在安装包的提示下进行,对初学者可采用“典型安装”方式。在安装好VC6.0系统后,有时根据需要添加或删除某些部件,可插入CD盘重新执行setup.exe安装程序,安装程序会检测当前系统安装VC6的足件,用户单击“添加/删除”按钮后,在“安装维护”对话框中选定要添加的部件或撤消选定要删除的部件。与一般的应用软件一样,有以下两种启动方式:(1)通过“开始”按钮,选择“程序”菜单,然后打开“MicrosoftVisualstudio6.0中文版”子菜单中的“MicrosoftVisualC++6.0中文版”程序。(2)用户也可以使用命令行启动VC。单击“开始”按钮后选择“运行”命令,在“运行”对话框中输入c:\ProgramFiles\MicrosoftVisualStudio\VC98\VC6.exe(按默认盘符和路径安装)即可。3系统需求分析3.1需求分析在做课程设计前,本人通过网络对文档管理系统的要求做了调查,根据市场的需求,要求系统具有以下功能:(1)可以处理大量的复合文档型的数据信息。(2)通过系统查看文档内容。(3)通过系统可以完成对文档一系列日常操作。(4)保证系统的安全性、可靠性。3.2开发及运行环境(1)系统开发平台:VisualC++6.0(2)数据库管理系统软件:SQLServer2000(3)运行平台:Windowsxp4项目设计4.1系统总体结构设计文档管理系统由基本信息、文档管理、系统设置等几个功能模块组成,规划系统功能模块如下(1)基本信息基本信息包括单位档案、文档类别2部分。(2)文档管理文档管理包括添加文档、修改文档、删除文档、文档浏览4部分。(3)系统设置系统设置包括用户管理、口令修改、日志管理、退出系统4部分。文档系统的功能结构如图4.1所示。图4.1文档管理功能图4.2设计目标本系统是根据中小企业的实际需求而开发的,完全能够实现企业对制度文档的自动化管理,通过本系统可以达到以下目标:(1)系统运行稳定,安全可靠。(2)界面设计美观,人机交互界面友好。(3)信息查询灵活、方便、快捷、准确,数据存储安全可靠。(4)操作员可以随时修改自己的口令。(5)对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。(6)数据保密性强,为每个用户设置相应的权限级别。4.3数据库设计(1)数据库概念设计概念设计中自顶向下的实体分析方法,即常用的实体联系模型(简称E-R模型),对具体数据进行抽象加工,将实体集合抽象成实体类型。用实体间联系反映现实世界事物间的内在联系。E-R模型是建立概念性数据模型的有力工具。数据库中包括单位表、类别表、文档表、日志表、用户表5个数据表。图4.2所示的即为本系统中数据库中的数据表结构图,该数据表结构图包含系统所有数据表。可以清晰地反应数据库信息。图4.2数据表结构图2主要数据表的结构数据库中包括单位表、类别表、文档表、日志表、用户表5个数据表。表4.1单位表字段名数据类型长度描述DWbhint4单位编号DWmcvarchar50单位名称Lxrvarchar50联系人Lxdhvarchar50联系电话Lxdzvarchar50联系地址Memovarchar200备注表4.2类别表字段名数据类型长度描述DWbhint4员工编号LBbhint4类别编号LBmcvarchar50类别名称5主要功能模块设计5.1建立工程框架在VisualC++中建立文档管理系统的基本框架,步骤如下:(1)单击菜单“File-->New”命令,打开“New”对话框,单击“Projects”选项卡,选择“MFCAppWizard(exe)”,输入工程名,并设置路径,如图5.1所示。图5.1“New”对话框(2)单击“OK”按钮,弹出“MFCAppWizard-Step1”对话框,如图5.2所示。图5.2“MFCAppWizard-Step1”对话框(3)选择“Dialogbase”选项,单击“Next”按钮,在弹出的“MFCAppWizard-Step2of4”对话框中,输入对话框标题,如图5.3所示。图5.3“MFCAppWizard-Step2of4”对话框(4)单击“Next”按钮,在接下来弹出的对话框中默认原有的选择项,最后设置好的对话框的属性如图5.4所示,单击“OK”按钮,新建工程成功。图5.4对话框的属性5.2封装数据库(1)添加ADO连接类本实例采用ADO来连接SQLServer数据库,在使用ADO技术时,需要导入一个ADO动态链接库msado15.dll,该动态库位于系统盘下的“ProgramFiles\CommonFiles\System\ado\”目录下。例如,如果您的系统盘为C盘,则该文件位于“C:\ProgramFiles\CommonFiles\System\ado\”目录。在VisualC++中,需要使用预处理命令#import,将动态库导入到系统中,代码如下。#import"C:\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespacerename("EOF","adoEOF")rename("BOF","adoBOF")添加一个用来连接的ADO的类。在系统菜单中选择“Insert-->NewClass”选项,打开“NewClass”窗口,选择“GenericClass”,然后输入类名,即完成了类的添加。代码如下。创建ADO连接类。classADOConn{public: //添加一个指向Connection对象的指针 _ConnectionPtrm_pConnection; //添加一个指向Recordset对象的指针 _RecordsetPtrm_pRecordset;public:ADOConn();virtual~ADOConn(); //初始化--连接数据库 voidOnInitADOConn(); //执行查询 _RecordsetPtr&GetRecordSet(_bstr_tbstrSQL); //执行SQL语句 BOOLExecuteSQL(_bstr_tbstrSQL); //断开数据库连接 voidExitConnect();};实现ADO连接类函数和程序代码如下。voidADOConn::OnInitADOConn(){ //初始化OLE/COM库环境 ::CoInitialize(NULL); try { //创建connection对象 m_pConnection.CreateInstance("ADODB.Connection"); //设置连接字符串 _bstr_tstrConnect="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurity Info=False;InitialCatalog=WenDGL;DataSource=MRLZJ"; //SERVER和UID,PWD的设置根据实际情况来设置 m_pConnection->Open(strConnect,"","",adModeUnknown); } //捕捉异常 catch(_com_errore) { //显示错误信息 AfxMessageBox(e.Description()); }}_RecordsetPtr&ADOConn::GetRecordSet(_bstr_tbstrSQL){ try { //连接数据库,如果connection对象为空,则重新连接数据库 if(m_pConnection==NULL) OnInitADOConn(); //创建记录集对象 m_pRecordset.CreateInstance(__uuidof(Recordset)); //取得表中的记录m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); }catch(_com_errore) { e.Description(); } //返回记录集 returnm_pRecordset;}BOOLADOConn::ExecuteSQL(_bstr_tbstrSQL){ _variant_tRecordsAffected; try { //是否已连接数据库if(m_pConnection==NULL) OnInitADOConn(); //connection对象的Execute方法(_bstr_tCommandText,//VARIANT*RecordsAffected,longOptions) //其中CommandText是命令字符串,通常是SQL命令 //参数RecordsAffected是操作完成后所影响的行数 //参数Options表示CommandText的类型,adCmdText-文本命令,adCmdTable-表名 //adCmdProc-存储过程,adCmdUnknown-未知m_pConnection->Execute(bstrSQL,NULL,adCmdText); returntrue; } catch(_com_errore) { e.Description(); returnfalse; }}voidADOConn::ExitConnect(){ //关闭记录集和连接if(m_pRecordset!=NULL) m_pRecordset->Close(); m_pConnection->Close(); //释放环境 ::CoUninitialize();}5.3主窗口设计(1)菜单资源设计主窗口菜单设置的主要步骤如下:①单击“ResourceView”选项卡,右键单击“WordGLXTResources”选项,在快捷菜单中选择“Insert”菜单项,弹出“InsertResource”窗口,如图5.5所示。图5.5“InsertResource”窗口②选择“Menu”文件夹,单击“New”按钮,在WordGLXTResources目录下新增一个Menu目录项,菜单ID为IDR_MENU1。然后,双击此菜单,对此菜单项的属性进行设计,如图5.6所示。图5.6“InsertResource”窗口(2)客户区设计①打开对话框IDD_WORDGLXT_DIALOG属性窗口,在对话框中添加1个TreeControl和1个RichEdit控件,右键单击TreeControl控件,将Hasbuttons/Haslines/Clientedge/Linesatroot选中,属性设置如表5.1所示。IDMemberVariables TypeMemberIDC_TREE1CtrrCtrlm_treeID_RICHEDITICRichEditCtrlm_tichedit表5.1属性表②预先在下边留出状态栏,声明Ctime、CstatusBarCtrl类对象实体,程序代码如下。CTimet; CStatusBarCtrlm_StatusBar;在程序中,引用外部变量。 externCWordGLXTApptheApp;在头文件中定义程序变量,代码如下。 CStringstr; CStringstrWord; CStringstrText; voidAddtoTree(HTREEITEMm_node); HTREEITEMarrays[10],brrays[20],hitem[100]; HTREEITEMm_root,temp; CDwxxbdwb; CZdmlbmlb; CZdxxbxxb; CRizhibzhi; CImageListm_treeImageList;③在OnInitDialog成员函数中,添加状态栏以及给Tree控件定义图标,添加数据,代码如下所示。//TODO:Addextrainitializationhere dwb.Load_dep(); mlb.Load_dep(); xxb.Load_dep(); m_treeImageList.Create(16,16,ILC_MASK,4,1); m_treeImageList.Add(theApp.LoadIcon(IDI_ROOTICON)); m_treeImageList.Add(theApp.LoadIcon(IDI_CHILDICON1)); m_treeImageList.Add(theApp.LoadIcon(IDI_CHILDICON2)); m_treeImageList.Add(theApp.LoadIcon(IDI_CHILDICON4)); m_tree.SetImageList(&m_treeImageList,LVSIL_NORMAL); m_root=m_tree.InsertItem("基本信息管理",0,0); AddtoTree(m_root); m_tree.Expand(m_root,TVE_EXPAND); m_StatusBar.EnableAutomation(); m_StatusBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,0); intwidth[]={200,400}; m_StatusBar.SetParts(4,&width[0]); m_StatusBar.SetText("xxxxx公司",0,0); CStringStatusText; StatusText.Format("当前用户:%s",user.GetUsername()); m_StatusBar.SetText(StatusText,0,1); t=CTime::GetCurrentTime(); CStringstrdate; strdate.Format("当前日期:%s",t.Format("%y-%m-%d")); m_StatusBar.SetText(strdate,0,2); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol④定义AddtoTree函数,将各表中数据按层次结构添加到Tree控件中,代码如下。voidCWordGLXTDlg::AddtoTree(HTREEITEMm_node){ inti,j; for(i=0;i<dwb.a_DWbh.GetSize();i++) {arrays[i]=m_tree.InsertItem(dwb.a_DWmc.GetAt(i),1,1,m_node); for(j=0;j<mlb.a_DWbh.GetSize();j++) { if(atoi(dwb.a_DWbh.GetAt(i))==atoi(mlb.a_DWbh.GetAt(j))) { brrays[j]=m_tree.InsertItem(mlb.a_LBmc.GetAt(j),2,2,arrays[i]); } } } for(i=0;i<xxb.a_WDbh.GetSize();i++) { for(j=0;j<mlb.a_DWbh.GetSize();j++) { if(atoi(xxb.a_DWbh.GetAt(i))==atoi(mlb.a_DWbh.GetAt(j))&&atoi(xxb.a_LBbh.GetAt(i))==atoi(mlb. a_LBbh.GetAt(j))) { hitem[i]=m_tree.InsertItem(xxb.a_WDmc.GetAt(i),3,3,brrays[j]); } } } m_tree.SetRedraw();}⑤为Tree控件添加OnDblclkTree1双击事件,程序代码如下。voidCWordGLXTDlg::OnDblclkTree1(NMHDR*pNMHDR,LRESULT*pResult){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstrWjian=""; //读取当前节点 temp=m_tree.GetSelectedItem(); //将当前节点子节点付给temp temp=m_tree.GetChildItem(temp); if(temp!=NULL) { while(temp!=NULL) { //取出temp中的文本 strText=m_tree.GetItemText(temp); strWjian+=strText+"\n"; //RichEdit控件显示数据 m_richedit.SetWindowText(strWjian); //将temp的兄弟节点付给temp temp=m_tree.GetNextItem(temp,TVGN_NEXT); } } else { temp=m_tree.GetSelectedItem(); for(inti=0;i<xxb.a_WDbh.GetSize();i++) { if(temp==hitem[i]) { //取出temp对应的文档路径 strWord=xxb.a_WJlj.GetAt(i); } } //word应用程序 _Applicationapp; //初始化连接 app.CreateDispatch("word.Application"); Documentsdoc; CComVarianta(_T(strWord)),b(false),c(0),d(true),aa(0),bb(1); _Documentdoc1; doc.AttachDispatch(app.GetDocuments()); doc1.AttachDispatch(doc.Add(&a,&b,&c,&d)); Rangerange; //求出文档的所选区域 range=doc1.GetContent();//取出文件内容 str=range.GetText(); m_richedit.SetWindowText(str); //关闭 app.Quit(&b,&c,&c); //释放环境 app.ReleaseDispatch(); } *pResult=0;}⑥在Menu组合框中选择IDR_MENU1。单击工具栏中的“运行”按钮,看到系统的主界面如图5.7所示。图5.7系统运行界面⑦打开ClassWizard窗口,为菜单项ID_MENULIULWD添加代码,实现文档浏览功能。voidCWordGLXTDlg::OnMenuliulwd(){ //TODO:Addyourcommandhandlercodehere CStringstrd,strs; for(inti=0;i<xxb.a_WDbh.GetSize();i++) { strd=xxb.a_WDmc.GetAt(i); strs+=strd+"\n"; m_richedit.SetWindowText(strs); }}⑧为菜单项ID_MENURZGL添加代码,实现日志管理功能。voidCWordGLXTDlg::OnMenurzgl(){ //TODO:Addyourcommandhandlercodehere ADOConnm_AdoConn;m_AdoConn.OnInitADOConn(); CStringsql,sqlzd="用户名\t登录时间\t动作\n"; sql.Format("select*fromRizhib"); m_AdoConn.GetRecordSet((_bstr_t)sql); while(m_AdoConn.m_pRecordset->adoEOF==0) { sqlzd+=(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("name"); sqlzd+="\t"; sqlzd+=(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("DLsj"); sqlzd+="\t"; sqlzd+=(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("dz"); sqlzd+="\n"; m_AdoConn.m_pRecordset->MoveNext(); m_richedit.SetWindowText(sqlzd); } m_AdoConn.ExitConnect();}⑨为菜单项ID_EXIT添加代码,程序调用OnOK()函数关闭对话框,退出系统。voidCWordGLXTDlg::OnExit(){ //TODO:Addyourcommandhandlercodehere OnOK();}5.4登陆模块设计(1)实现目标登录模块功能是完成用户登录本系统的操作,用户登录对话框的设计如图5.8所示。图5.8用户登录对话框(2)设计步骤①向项目中添加一个新Dialog资源,资源ID为IDD_DIALOGIN。在IDD_DLALOGIN对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“DialogProperties”对话框。在“DialogProperties”对话框中选择General选项卡,更改其“Caption”文本框内容为“用户登录”。②从Controls面板上向Dialog资源中添加2个Static、2个Edit,更改资源的属性,并为资源设置相对应的变量,如表5.2所示。IDPropertiesMemberVariablesTypeMemberIDC_EDIT1默认CStringm_nameIDC_EDIT2PassWordTRUECStringm_pwdIDOKCaption登录IDCANCELCaption退出表5.2资源设置(3)代码分析①引用函数外部的变量。externCUsersuser;②在头文件定义程序变量。CStringjb;CRizhibzhi;CTimet;③响应“登录”按钮的程序代码如下。voidCDialogin::OnOK(){ //TODO:Addextravalidationhere //将对话框中编辑框的数据读取到成员变量中 UpdateData(true); //检查数据有效性 if(m_name=="") { MessageBox("请输入用户名"); return; } //如果读取数据和用户输入不同,则返回 if(user.HaveCzy(m_name,m_pwd)!=1) { MessageBox("用户名或密码错误!"); return; } user.SetUsername(m_name); //判断用户级别 jb="1"; if(user.HaveCzyjb(m_name,m_pwd,jb)==1) { user.SetJB(jb); } else { user.SetJB("0"); } //读取当前系统时间 t=CTime::GetCurrentTime(); //将登录动作记录到日志表 zhi.SetDLsj(t.Format("%y-%m-%d")); zhi.SetName(user.GetUsername()); zhi.SetDZ("登录"); zhi.sql_insert(); CDialog::OnOK();}下面在主对话框中添加代码,使对话框在启动时首先打开登录对话框。在主窗口选择OnInitDialog函数,该函数将打开登录对话框,如果用户不是通过单击“登录”按钮关闭对话框,则调用OnOK函数关闭主对话框,具体代码如下。BOOLCWordGLXTDlg::OnInitDialog(){ CDialog::OnInitDialog();...//TODO:Addextrainitializationhere CDialogingin; if(gin.DoModal()!=IDOK) OnOK(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}5.5文档管理模块设计(1)实现目标用于查看、添加、修改、删除文档信息,文档管理对话框的设计如图5.9所示。图5.9文档管理对话框(2)设计步骤①向项目中添加一个新Dialog资源,资源IDD_WDgldlg。在IDD_WDgldlg对话框资源中单击鼠标右键,执行弹出快捷菜单的“Properties”菜单命令,打开“DialogProperties”对话框。在“DialogProperties”对话框中选择General选项卡,更改其“Caption”文本框内容为“文档管理”。②从Controls面板上向Dialog资源中添加7个Static、7个Edit、2个Button、2个Radio、1个Tab、1个ListControl、1个Combo、1个Group控件,更改资源的属性,并为资源设置相对应的变量,如表5.3所示。IDPropertiesMemberVariablesTypeMemberIDC_EDIT1默认CStringm_dwmcIDC_EDIT2默认CStringm_wdlbIDC_EDIT3默认intm_wdbhIDC_EDIT4默认CStringm_wdmcIDC_EDIT5默认CStringm_gjzIDC_EDIT6默认CEditm_wjljIDC_EDIT7默认CStringm_memoIDC_TAB1默认CTabCtrlm_tabIDC_LIST1View:Report;Align:leftCListCtrlm_listIDC_RADIO1Caption添加IDC_RADIO2Caption修改IDC_STATIC8Caption选择IDC_COMBO1默认CComboBoxm_comboIDC_WJLJXZCaptionIDOKCaption保存IDCANCELCaption退出IDC_BUTTONDELCaption删除表5.3资源设置(3)代码分析①使用函数外部的变量。externCUsersuser;②在头文件定义的变量。 intwdbh; intlbbh; intdwbh; intstr;//单选按钮 CStringstrText; CDwxxbdwb; CZdmlbmlb; CZdxxbxxb; CRizhibzhi; CTimet; UINTtabindex;③添加OnInitDialog函数,此函数用于初始化Tab控件、为ListControl控件赋值,其代码如下:BOOLCWDgldlg::OnInitDialog(){ CDialog::OnInitDialog(); m_hIcon=AfxGetApp()->LoadIcon(IDI_CHILDICON4); //TODO:Addextrainitializationhere SetIcon(m_hIcon,TRUE); TC_ITEMtci; tci.mask=TCIF_TEXT; tci.pszText="基本信息"; m_tab.InsertItem(0,&tci); tci.pszText="信息删除"; m_tab.InsertItem(1,&tci); dwb.Load_dep(); mlb.Load_dep(); xxb.Load_dep(); t=CTime::GetCurrentTime(); UpdateData(true); for(inti=0;i<xxb.a_WDbh.GetSize();i++) { m_combo.AddString(xxb.a_WDmc.GetAt(i)); } m_list.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_list.InsertColumn(0,"单位名称",LVCFMT_LEFT,100,0); m_list.InsertColumn(1,"文档类别",LVCFMT_LEFT,100,1); m_list.InsertColumn(2,"文档编号",LVCFMT_LEFT,100,2); m_list.InsertColumn(3,"文档名称",LVCFMT_LEFT,100,3); m_list.InsertColumn(4,"关键字",LVCFMT_LEFT,100,4); m_list.InsertColumn(5,"文档路径",LVCFMT_LEFT,100,5); m_list.InsertColumn(6,"备注",LVCFMT_LEFT,100,6); CStringdwmc[100],wdlb[100],pp; //根据单位编号返回单位名称 for(i=0;i<xxb.a_WDmc.GetSize();i++) { for(intj=0;j<dwb.a_DWbh.GetSize();j++) { if(atoi(xxb.a_DWbh.GetAt(i))==atoi(dwb.a_DWbh.GetAt(j))) { dwmc[i]=dwb.a_DWmc.GetAt(j); } } //根据类别编号返回类别名称 for(j=0;j<mlb.a_DWbh.GetSize();j++) { if(atoi(xxb.a_DWbh.GetAt(i))==atoi(mlb.a_DWbh.GetAt(j))&&atoi(xxb.a_LBbh.GetAt(i))==atoi(mlb.a_LBbh.GetAt(j))) { wdlb[i]=mlb.a_LBmc.GetAt(j) } } } ADOConnm_AdoConn; m_AdoConn.OnInitADOConn(); CStringsql; sql.Format("select*fromZdxxborderbywdbhdesc"); m_AdoConn.GetRecordSet((_bstr_t)sql); while(m_AdoConn.m_pRecordset->adoEOF==0) { m_list.InsertItem(0,""); m_list.SetItemText(0,0,dwmc[i-1]); m_list.SetItemText(0,1,wdlb[i-1]); m_list.SetItemText(0,2,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("wdbh")); m_list.SetItemText(0,3,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("wdmc")); m_list.SetItemText(0,4,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("gjz")); m_list.SetItemText(0,5,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("wjlj")); m_list.SetItemText(0,6,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("memo")); i--; m_AdoConn.m_pRecordset->MoveNext(); } m_AdoConn.ExitConnect(); //根据菜单选项使不同的单选按钮处于选中状态 if(str==0) { CButton*tempbutton=(CButton*)GetDlgItem(IDC_RADIO1); tempbutton->SetCheck(1); } else { CButton*tempbutton=(CButton*)GetDlgItem(IDC_RADIO2); tempbutton->SetCheck(1); } //调用SetCurTab() SetCurTab(tabindex); m_wdbh=1; UpdateData(false); returnTRUE;controlFALSE}④为“…”按钮添加如下代码,使其查找文件路径。voidCWDgldlg::OnWjljxz(){ //TODO:Addyourcontrolnotificationhandlercodehere CFileDialogfile(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"All Files(*.*)|*.*||",AfxGetMainWnd()); if(file.DoModal()==IDOK) { strText=file.GetPathName(); m_wjlj.SetWindowText(strText); }}⑤当用户单击“保存”按钮时,将执行OnOK函数,代码如下。voidCWDgldlg::OnOK(){ //TODO:Addextravalidationhere UpdateData(true); if(m_dwmc=="") { MessageBox("单位名称不能为空"); return; } if(m_wdlb=="") { MessageBox("文档类别不能为空"); return; } if(m_wdmc=="") { MessageBox("文档名称不能为空"); return; } CStringwjlj; m_wjlj.GetWindowText(wjlj); if(wjlj=="") { MessageBox("文档路径不能为空"); return; } intdw=0,lb=0; for(inti=0;i<dwb.a_DWbh.GetSize();i++) { if(m_dwmc==dwb.a_DWmc.GetAt(i)) { dwbh=atoi(dwb.a_DWbh.GetAt(i)); dw++; } } for(i=0;i<mlb.a_DWbh.GetSize();i++) { if(dwbh==atoi(mlb.a_DWbh.GetAt(i))&&m_wdlb==mlb.a_LBmc.GetAt(i)) { lbbh=atoi(mlb.a_LBbh.GetAt(i)); lb++; } } if(dw==0) { MessageBox("单位名称不存在"); return; } if(lb==0) { MessageBox("文档类别不存在"); return; } if(xxb.HaveId(dwbh,lbbh,m_wdbh)==1) { MessageBox("文档已存在"); return; } xxb.SetDWbh(dwbh); xxb.SetLBbh(lbbh); xxb.SetWDbh(m_wdbh); xxb.SetWDmc(m_wdmc); xxb.SetGJz(m_gjz); xxb.SetWJlj(strText); xxb.SetMemo(m_memo); xxb.SetTjrxm(user.GetUsername()); switch(str) { case0: xxb.sql_insert(); zhi.SetDLsj(t.Format("%y-%m-%d")); zhi.SetName(user.GetUsername()); zhi.SetDZ("添加文档"); zhi.sql_insert(); break; case1: xxb.sql_update(m_wdbh); zhi.SetDLsj(t.Format("%y-%m-%d")); zhi.SetName(user.GetUsername()); zhi.SetDZ("修改文档"); zhi.sql_insert(); break; } dw=0; lb=0; CDialog::OnOK();}⑥为Radio控件添加消息响应函数,代码如下。voidCWDgldlg::OnRadio1(){ //TODO:Addyourcontrolnotificationhandlercodehere str=0;}voidCWDgldlg::OnRadio2(){ //TODO:Addyourcontrolnotificationhandlercodehere str=1;}⑦当用户单击“删除”按钮时,将执行OnButtondel函数,代码如下。voidCWDgldlg::OnButtondel(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(true); CStringwdmc; m_combo.GetLBText(m_combo.GetCurSel(),wdmc); for(inti=0;i<xxb.a_WDbh.GetSize();i++) { if(wdmc==xxb.a_WDmc.GetAt(i)) { wdbh=atoi(xxb.a_WDbh.GetAt(i)); } } xxb.sql_delete(wdbh); zhi.SetDLsj(t.Format("%y-%m-%d")); zhi.SetName(user.GetUsername()); zhi.SetDZ("文档删除"); zhi.sql_insert(); UpdateData(false);}⑧通过SetCurTab()函数,根据菜单的消息响应确定显示Tab标签控件的第几页voidCWDgldlg::SetCurTab(UINTm_index){ m_tab.SetCurSel(m_index); if(m_index==0) { GetDlgItem(IDC_LIST1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_COMBO1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_BUTTONDEL)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT7)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC3)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC4)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC5)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC6)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC7)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC8)->ShowWindow(SW_SHOW); GetDlgItem(IDC_WJLJXZ)->ShowWindow(SW_SHOW); GetDlgItem(IDOK)->ShowWindow(SW_SHOW); GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW); GetDlgItem(IDC_RADIO1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_RADIO2)->ShowWindow(SW_SHOW); } else { GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT4)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT7)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC3)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC4)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC5)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC6)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC7)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC8)->ShowWindow(SW_HIDE); GetDlgItem(IDC_WJLJXZ)->ShowWindow(SW_HIDE); GetDlgItem(IDOK)->ShowWindow(SW_HIDE); GetDlgItem(IDCANCEL)->ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_RADIO2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_LIST1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_COMBO1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_BUTTONDEL)->ShowWindow(SW_SHOW); }}6结束语 在本次课程设计过程中,具体看上去功能简单,可实现起来却有各种各样的具体要求得完成。在这次的设计中,我懂得了许多。在开发之前,要准确和详细的分析软件的功能需求,如果功能需求分析的不准确,就会影响到下面的操作步骤。根据功能的需要,构思软件的设计框架。这让我在设计是大大的加快开发进度。经过这次的课程设计,在设计中不断完善中,我知道要做好一件事首先要理清思路,弄懂到底要解决什么问题及相应的步骤,采取的方法和开发工具,以及对一些可能的程序异常或是常见问题的容错检测和修正方案等。7致谢在课程设计过程中,我熟悉了VC++编程语言,同时也培养了我的团队协作精神。在这次设计中,我遇到了一些难题,是我的指导老师和我旁边的同学指导和帮助我,我感谢老师和帮助我的同学。同时我也要感谢那些提供我资料的网站,让我能过找到一些我想要的资料。参考文献[1].《VisualC++精彩编程200例》机械工业出版社赛奎春、高春艳等2003年1月 [2].《VisualC++工程应用与项目实践》机械工业出版社张雨、阮伟良等2005年1月[3].《VisualC++管理信息系统完整项目实例剖析》人民邮电出版社2005年7月 [4].《VisualC++数据库系统开发完全手册》人民邮电出版社王端、于速、张雨2006年3月[5].《VisualC++教程》机械工业出版社郑阿奇丁有和2007年12月[6].《C程序设计(第二版)》清华大学出版社2000年2月[7].《VisualC++程序员基础教程》青岛出版社丁有和1999年10月[8].《VisualC++数据开发技术》机械工业出版社1999年9月课程设计附件源代码/ADOConn.cpp:implementationoftheADOConnclass.////////////////////////////////////////////////////////////////////////#include"stdafx.h"#include"WordGLXT.h"#include"ADOConn.h"#ifdef_DEBUG#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#definenewDEBUG_NEW#endif////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////ADOConn::ADOConn(){}ADOConn::~ADOConn(){}voidADOConn::OnInitADOConn(){ //初始化OLE/COM库环境::CoInitialize(NULL); try { //创建connection对象m_pConnection.CreateInstance("ADODB.Connection"); //设置连接字符串 _bstr_tstrConnect="Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurityInfo=False;InitialCatalog=WenDGL;DataSource=."; //SERVER和UID,PWD的设置根据实际情况来设置 m_pConnection->Open(strConnect,"","",adModeUnknown); } //捕捉异常 catch(_com_errore) { //显示错误信息 AfxMessageBox(e.Description()); }}_RecordsetPtr&ADOConn::GetRecordSet(_bstr_tbstrSQL){try { //连接数据库,如果connection对象为空,则重新连接数据库 if(m_pConnection==NULL)OnInitADOConn(); //创建记录集对象 m_pRecordset.CreateInstance(__uuidof(Recordset)); //取得表中的记录m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); }catch(_com_errore) { e.Description(); } //返回记录集 returnm_pRecordset;}BOOLADOConn::ExecuteSQL(_bstr_tbstrSQL){ _variant_tRecordsAffected; try { //是否已连接数据库if(m_pConnection==NULL) OnInitADOConn(); //connection对象的Execute方法(_bstr_tCommandText,//VARIANT*RecordsAffected,longOptions) //其中CommandText是命令字符串,通常是SQL命令 //参数RecordsAffected是操作完成后所影响的行数 //参数Options表示CommandText的类型,adCmdText-文本命令,adCmdTable-表名 //adCmdProc-存储过程,adCmdUnknown-未知m_pConnection->Execute(bstrSQL,NULL,adCmdText); returntrue; } catch(_com_errore) { e.Description(); returnfalse; }}voidADOConn::ExitConnect(){ //关闭记录集和连接if(m_pRecordset!=NULL) m_pRecordset->Close(); m_pConnection->Close(); //释放环境 ::CoUninitialize();}voidCDwxxb::sql_insert(){ADOConnm_AdoConn; CStringstrDWbh; strDWbh.Format("%d",DWbh); _bstr_tvSQL; vSQL="INSERTINTODwxxb(DWbh,DWmc,Lxr,Lxdh,Lxdz,Memo)VALUES(" +strDWbh+",'"+DWmc+"','"+Lxr+"','"+Lxdh+"','"+Lxdz+"','"+Memo+"')";m_AdoConn.ExecuteSQL(vSQL);m_AdoConn.ExitConnect();}voidCDwxxb::sql_update(intiDWbh){ADOConnm_AdoConn; CStringstrDWbh; strDWbh.Format("%d",iDWbh); _bstr_tvSQL; vSQL="UPDATEDwxxbSETDWmc='"+DWmc+"',Lxr='"+Lxr+"',Lxdh='" +Lxdh+"',Lxdz='"+Lxdz+"',Memo='"+Memo+"'WHEREDWbh="+""+strDWbh+"";m_AdoConn.ExecuteSQL(vSQL); m_AdoConn.ExitConnect();}BOOLCWDgldlg::OnInitDialog(){ CDialog::OnInitDialog(); m_hIcon=AfxGetApp()->LoadIcon(IDI_CHILDICON4); //TODO:Addextrainitializationhere SetIcon(m_hIcon,TRUE); TC_ITEMtci; tci.mask=TCIF_TEXT; tci.pszText="基本信息"; m_tab.InsertItem(0,&tci); tci.pszText="信息删除"; m_tab.InsertItem(1,&tci); dwb.Load_dep(); mlb.Load_dep(); xxb.Load_dep(); t=CTime::GetCurrentTime(); UpdateData(true); for(inti=0;i<xxb.a_WDbh.GetSize();i++) { m_combo.AddString(xxb.a_WDmc.GetAt(i)); } m_list.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_list.InsertColumn(0,"单位名称",LVCFMT_LEFT,100,0); m_list.InsertColumn(1,"文档类别",LVCFMT_LEFT,100,1); m_list.InsertColumn(2,"文档编号",LVCFMT_LEFT,100,2); m_list.InsertColumn(3,"文档名称",LVCFMT_LEFT,100,3); m_list.InsertColumn(4,"关键字",LVCFMT_LEFT,100,4); m_list.InsertColumn(5,"文档路径",LVCFMT_LEFT,100,5); m_list.InsertColumn(6,"备注",LVCFMT_LEFT,100,6); CStringdwmc[100],wdlb[100],pp; //根据单位编号返回单位名称 for(i=0;i<xxb.a_WDmc.GetSize();i++) { for(intj=0;j<dwb.a_DWbh.GetSize();j++) { if(atoi(xxb.a_DWbh.GetAt(i))==atoi(dwb.a_DWbh.GetAt(j))) { dwmc[i]=dwb.a_DWmc.GetAt(j); } } //根据类别编号返回类别名称 for(j=0;j<mlb.a_DWbh.GetSize();j++) { if(atoi(xxb.a_DWbh.GetAt(i))==atoi(mlb.a_DWbh.GetAt(j))&&atoi(xxb.a_LBbh.GetAt(i))==atoi(mlb.a_LBbh.GetAt(j))) { wdlb[i]=mlb.a_LBmc.GetAt(j); } } } ADOConnm_AdoConn; m_AdoConn.OnInitADOConn(); CStringsql; sql.Format("select*fromZdxxborderbywdbhdesc"); m_AdoConn.GetRecordSet((_bstr_t)sql); while(m_AdoConn.m_pRecordset->adoEOF==0) { m_list.InsertItem(0,""); m_list.SetItemText(0,0,dwmc[i-1]); m_list.SetItemText(0,1,wdlb[i-1]); m_list.SetItemText(0,2,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("wdbh")); m_list.SetItemText(0,3,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("wdmc")); m_list.SetItemText(0,4,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("gjz")); m_list.SetItemText(0,5,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("wjlj")); m_list.SetItemText(0,6,(char*)(_bstr_t)m_AdoConn.m_pRecordset->GetCollect("memo")); i--; m_AdoConn.m_pRecordset->MoveNext(); } m_AdoConn.ExitConnect(); //根据菜单选项使不同的单选按钮处于选中状态 if(str==0) { CButton*tempbutton=(CButton*)GetDlgItem(IDC_RADIO1); tempbutton->SetCheck(1); } else { CButton*tempbutton=(CButton*)GetDlgItem(IDC_RADIO2); tempbutton->SetCheck(1); } //调用SetCurTab() SetCurTab(tabindex); m_wdbh=1; UpdateData(false); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCWDgldlg::OnWjljxz(){ //TODO:Addyourcontrolnotificationhandlercodehere CFileDialogfile(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"AllFiles(*.*)|*.*||",AfxGetMainWnd()); if(file.DoModal()==IDOK) { strText=file.GetPathName(); m_wjlj.SetWindowText(strText); }}voidCWDgldlg::OnSelchangeTab1(NMHDR*pNMHDR,LRESULT*pResult){ //TODO:Addyourcontrolnotificationhandlercodehere switch(m_tab.GetCurSel()) { case0: GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT4)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT5)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT6)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT7)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC3)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC4)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC5)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC6)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC7)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC8)->ShowWindow(SW_SHOW); GetDlgItem(IDC_WJLJXZ)->ShowWindow(SW_SHOW); GetDlgItem(IDOK)->ShowWindow(SW_SHOW); GetDlgItem(IDCANCEL)->ShowWindow(SW_SHOW); GetDlgItem(IDC_RADIO1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_RADIO2)->ShowWindow(SW_SHOW); break; case1: GetDlgItem(IDC_LIST1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_COMBO1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_BUTTONDEL)->ShowWindow(SW_SHOW); break; } *pResult=0;}voidCWDgldlg::OnSelchangingTab1(NMHDR*pNMHDR,LRESULT*pResult){ //TODO:Addyourcontrolnotificationhandlercodehere switch(m_tab.GetCurSel()) { case0: GetDlgItem(IDC_EDIT1)->ShowWindow

温馨提示

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

评论

0/150

提交评论