《武汉工程大学学报》  2014年06期 54-58   出版日期:2014-06-30   ISSN:1674-2869   CN:42-1779/TQ
无第三方软件支持的数据库应用程序开发


0引言 材料是压力容器与设备设计过程最重要的参数,它影响到压力容器与设备的设计、制造、安装与运行.GB150中提供了众多材料可供设计选择[1].这些材料能满足一般设计要求;但是随着材料技术的进步,新材料不断出现;国际贸易使得国外材料的选用也日益频繁.这些都要求能让用户方便地在设备强度计算软件包中增加新材料、删除淘汰的老材料.为此软件包必须提供“用户材料数据库管理”模块.其运行界面如图1所示.图1用户材料数据库管理系统界面Fig.1The interface of user material database management system 启动时左边列表中最后的材料处于选中状态,右边则表明该材料的名称、标准号及材料类型、力学性能等.用户点击左边不同的材料,右边各项相应做出改变.当点击“增加”按钮,则右边上部各控件清空,下方的表格也消失;当选中“强度数据类型”下的任一选项时,又会弹出表格,让用户输入材料力学性能,且表格上方的红色文字与选项相匹配.当点击“更新、保存”按钮,将该材料的各项参数写入文件中,并在列表最后增加一行.当点击“删除”按钮时,首先从列表中删除被选中的一行,然后从文件中删除这种材料的各项参数,最后将光标移到列表最后一行,右边显示该材料的各项参数.第6期蔡洪涛,等:无第三方软件支持的数据库应用程序开发武汉工程大学学报第36卷1用户材料数据库管理模块技术分析及编程思路从图1中可以看出,运行界面是一个有两个属性页的属性对话框,属性页名分别为“用户材料数据操作(1)”和“用户材料数据操作(2)”.第一页主要由名为“请选择材料:”的列表控件和4个成组框控件组成,这4个成组框的名称分别是“材料类型”、“材料类别”、“应力类别”和“强度数据类型”;右下角的是两个CMSFlexGrid型网格控件,都是10行、2列,用于材料在20个不同温度下的强度值的输入.第二页主要由两个成组框组成,名称分别是“基于弹性模量的材料分类”和“基于线膨胀系数的材料分类”. CMSFlexGrid网格控件是Visual C++提供的已注册的ActiveX控件,以表格的形式显示和操作数据.该控件在MSDN中有用于VB的详细的文档;但是用于VC的说明却没有.该控件不具备对网格的编辑功能.给CMSFlexGrid控件添加编辑功能的思路是[2]:设置一个编辑框控件,该控件可以在网格控件移动,并与某个单元格重合,在该编辑框控件中输入数据,并将该数据写入单元格中.在VC环境下开发数据库应用程序一般都要采用第三方软件如Microsoft Office Access、Microsoft Office Excel、Microsoft Visual FoxPro等形成数据文件,然后注册形成数据源[34],再通过ODBC、DAO或ADO技术操纵数据源以实现对数据的管理.本文利用MFC的文件读写功能在模块中形成数据文件,不需要第三方软件的支持.MFC的链表类包括CPtrList、CStringList、CobList[5],本文利用CptrList类创建链表对象.2用户材料数据库管理模块框架的编程实现首先启动VC++6.0,创建一个名为yhmaterial的单文档工程,该工程视类的基类是CFormView,其余保持默认选项不变.添加两个对话框资源,其ID分别为IDD_PROPPAGE1和IDD_PROPPAGE2.参照图1在两个对话框中添加各控件.对话框IDD_PROPPAGE1中添加各控件后,还要添加一个多余的编辑框控件“Edit”,用于网格控件的编辑化.右下角网格控件的添加方法是点击工程\添加到工程\Components and Controls,在弹出的对话框中选择Registered and ActiveX Controls文件夹,双击之,再选择Microsoft FlexGrid Control,version 6.0,点击insert按钮,弹出Confirm Class对话框.选中前面三项,点击OK.此时在控件工具箱中出现Microsoft FlexGrid Control的图标.并且在工程的ClassView区出现刚才选中的三个类:CMSflexGrid、CRowCursor和ColeFont,在工程的FileView区出现类的头文件msflexgrid.h、font.h和rowcursor.h及源文件msflexgrid.cpp、font.cpp和rowcursor.cpp.两次添加Microsoft FlexGrid Control到IDD_PROPPAGE1上.修改其ID分别为IDC_MSFLEXGRID1和IDC_MSFLEXGRID2.参照图1设置其属性,并适当调节网格控件所占范围的大小,使得后面设置的网格的高度与宽度既能完全显示出来,又无黑边.注意设置四个成组框控件下面第一个控件的“Group”属性.将列表控件设置为“Report”属性.为各控件绑定变量,为这两个对话框资源添加响应的类Cpage1和Cpage2,并创建属性对话框.此时编译运行,发现属性对话框要么完全显示出来,但是只占整个视区的一部分,要么占住整个视区,但是只显示了一部分,多了两个滚动条,需要滚动才能看到属性对话框的各个部位.要想将属性对话框完全嵌入视区,不出现滚动条,可以添加函数void CYhmaterialView::OnSize(UINT nType,int cx,int cy).void CYhmaterialView::OnSize(UINT nType,int cx,int cy) {CFormView::OnSize(nType,cx,cy);propSheet.SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE);CTabCtrl* m_tabctrl=propSheet.GetTabControl( );//m_tabctrl->SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE);//CRect rect;CSize size; GetClientRect(&rect);//获取当前客户区view大小 size.cx=rect.right-rect.left; size.cy=rect.bottom-rect.top;SetScrollSizes(MM_TEXT,size);//将CScrollView的大小设置为当前客户区大小 }再次编译运行,发现无滚动条,调节视区大小(用鼠标拖动),对话框的尺寸也跟着变化,视区与对话框大小同步.效果如图1所示.3用户材料数据库管理各功能的编程实现3.1网格控件的可编辑化编辑网格就是在单击单元格时能接受用户的输入.为此按第二节的思路进行.首先要响应FlexGrid控件的Click事件.利用类向导在类Cpage1中添加响应函数void Cpage1::OnClickMsflexgrid1()和void Cpage1::OnClickMsflexgrid2().当编辑完成释放焦点之后,将数据写回单元格.此时应该响应CEdit控件的EN_KILLFOCUS事件.利用类向导添加函数void Cpage1::OnKillfocusEdit(). 3.2建立材料参数结构体材料参数众多,其中最主要的是材料的力学性能指标.由于各种材料适用的温度范围不同,故力学性能的个数也不同.本章给出的温度等级数为20(参考GB150),当材料力学性能温度等级不够20时,以0补齐温度与力学性能.构建如下的结构体:struct CAILIAOCANSHU{ CString name;//材料名称CString biaozhun;//材料标准double houdumax,houdumin,wendumin,wendumax,cailiaomidu,sigma,qufu;//最小、最大尺寸,最高、最低适用温度,材料重度,常温抗拉强度及屈服极限int banfou,gangfou,gaoyinglifou,qiangdulei;//材料形式、材质类别、应力高低、应力类别double yingli[20];//应力等级值double wendu[20];//温度等级值};材料形式即板材、锻件等之分;材质类别有碳钢、不锈钢、铜、铝及钛材之分;应力高低即高应力与低应力.GB150对某些材料在同一个温度下给出了两种许用应力,应力较高者仅适用于允许产生微量永久变形的元件;对于法兰或其他有微量永久变形就引起泄漏或故障的场合则采用较低应力以增加元件的尺寸,增加安全可靠性.3.3用户材料数据库管理模块启动功能的实现图1是启动界面.可以看出启动时将文件中的各个材料名称读入属性页的列表控件中,光标处于最后一个材料,并将这个材料的参数显示在属性页的各个控件中.用户点击任意一个材料名称,则右边各控件数据跟着变化.如果文件为空,或不存在,则显示空白的界面,即各个控件为空.实现思路是:先将网格控件和列表控件初始化;打开文件,将数据读入材料参数结构体,形成一个链结点添加到链尾,直到文件读完.再遍历链表,将每一个结点中对应的材料名称数据及应力类别写到列表框,并将最后一个材料的参数写入各个编辑框中.这些工作可由函数BOOL Cpage1::OnInitDialog()完成.3.4用户材料数据库管理模块各按钮功能的实现“增加”按钮的功能实现.用户单击该按钮时,首先将网格控件隐藏,各控件数据清空,将此按钮变灰,等待用户输入数据,当选择材料力学性能单选按钮时,再弹出网格控件,并将网格控件上方的静态文本控件的标题做出相应的修改.在Cpage1类中添加“增加”按钮IDC_BUTTONADD单击消息响应函数OnButtonadd().在Cpage1类中添加单选按钮“温度下许用应力”、“温度下屈服极限”和“温度下持久极限”的单击消息响应函数,以修改网格控件上方的静态文本控件的标题.添加WM_CTLCOLOR消息响应函数HBRUSH Cpage1::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor) ,将静态文本标题颜色修改为红色.“更新、保存”按钮的功能实现.首先将用户输入的数据形成一个结构体,并得到新的链节点添加到链尾.此链是在函数OnInitDialog()中形成的.再将新增加的材料名称及应力类别数据写入列表框的最后面.最后将该材料的数据写入文件末尾;并将本按钮变灰,恢复“增加”按钮.“删除”按钮的功能实现.首先在列表框中捕获用户要删除的材料表项,将此表项删除,然后从链表中删除该材料对应的结点,并从文件中删除该材料的数据(实际上重写整个文件),并将最后一个结点的材料显示在各个控件中.最后还要添加列表框选中表项改变时的消息响应函数OnItemchangedList1(),并将对应的材料参数显示在各个控件中以便用户查看浏览.“更新、保存”按钮单击响应函数程序框图如图2所示.图2“更新、保存”按钮单击消息响应函数框图Fig.2The block diagram of message response function clicking update and save button4运行结果及结论本模块的运行界面如图1所示,在模块目录下生成一个文本文件.实践表明不需第三方软件的支持也可以进行数据库应用程序的开发.该方法不需要考虑数据源,也不需要考虑安装目录问题;只有一个运行文件.在数据量不太大的情况下,相比需要第三方软件的数据库开发方法,该方法简单、灵活.致谢本人在学习MFC编程的过程中得到武汉工程大学计算机科学与工程学院卢涛博士的指点,在此表示衷心的感谢!