哈尔滨理工大学学士学位论文
打开默认主对话框的属性窗口,在MENU组合框中选择IDR_MENU1,运行系统,可以看到系统的主界面如图3-1所示:
图3-1系统主界面示意图
为菜单项IDR_EXIT添加代码,对应函数为CPostalSpDlg::OnExit(),代码如下:
void CPostalSpDlg::OnExit() { exit(0); }
程序调用exit(0)函数关闭对话框,退出系统。
从系统界面上可以看到,由于本系统面对的是中小规模的邮寄业务,所以功能较为简单,仅仅设置了一些必须的功能。这对于使用人员的培训和使用都将十分有益。
3.1.2 为表添加类
本文为系统数据库的每一个表都创建了一个类,类的成员变量对应类的列,类的成员函数是对成员变量和表的操作。在系统中为各个表添加相应的类,并设置类名,类的命名规则是大写字母“C”加上表名,例如表Users对应的类名就是CUsers。
- 7 -
哈尔滨理工大学学士学位论文
在通常情况下类的成员变量与对应的表的列名相同。绝大多数成员函数的编码格式都是非常相似的,所以本节中只介绍每个类的成员函数的基本功能,并不对所有的成员函数进行具体的代码分析。 3.1.2.1 CPostals类
CPostals类用来管理表Postals的数据库操作,它的成员函数如表3-3所示。
成员函数声明 CPostals() int HaveName() 表3-3 CPostals类的成员变量 具体说明 初始化成员变量 判断指定的邮件编号是否已经在数据库中,参数cPid表示指定的邮件的编号。返回-1表示不存在,返回1表示存在 读取邮件编号为cPid的邮件的所有信息 删除指定的邮件记录。参数cPid表示要删除的邮件的编号 修改指定的邮件记录。参数cPid表示要修改的邮件的编号 插入新的邮件记录 设置邮件编号 获取相应的邮件编号 设置邮件邮寄日期 获取邮件邮寄日期 设置邮件发送地邮编 获取邮件发送地邮编 设置邮件接收地邮编 获取邮件接收地邮编 设置邮件分拣箱编号 获取邮件分拣箱编号 void GetData() void sql_delete() void sql_update() void sql_insert() void SetPid() CString GetPid() void SetPostDate() CString GetPostDate() void SetBeginPlace() CString GetBeginPlace() void SetPostPlace() CString GetPostPlace() void SetPostid() CString GetPostid() 在HaveName()函数中程序使用m_AdoConn.GetRecordSet()函数执行SELECT语句,将结果返回到m_pRecordset对象中。如果m_pRecordset->adoEOF等于-1,则结果集为空;否则表示记录中存在指定的邮件编号。 3.1.2.2 CBoxes 类
CBoxes类用来管理表Boxes的数据库操作,他的成员函数如表3-4所示:
- 8 -
哈尔滨理工大学学士学位论文
函数名 CBoxes() void SetBoxId() void SetBoxName() CString GetBoxId() CString GetBoxName() int HaveName() void sql_insert() void sql_update() void sql_delete() 表3-4 CBoxes类的成员函数 具体说明 初始化成员变量 设置分拣箱编号 设置分拣箱对应的邮编 返回分拣箱编号 返回分拣箱对应的邮编 判断指定分拣箱是否存在 插入新的分拣箱记录 修改指定的分拣箱记录 删除指定的分拣箱记录 3.1.2.3 CUsers类
CUsers类用来管理表Users的数据库操作,它的成员函数如表3-5所示:
函数名 Cusers() void sql_insert() void sql_update() void sql_delete() void sql_updatePwd() void SetUserType() void SetPwd() void SetUserName() CString GetUserName() CString GetPwd() CString GetUser_type() 表3-5 CUsers类的成员函数 具体说明 初始化成员变量 插入新的用户记录 修改指定的用户记录 删除指定的用户记录 修改指定用户的密码 设置用户类型 设置用户密码 设置用户名 获取用户名 获取用户密码 获取用户类型 类的设计是VC++设计工作的重点之一,除了以上三个针对数据库表的类,在设计过程中对于系统的对话框或者系统资源的使用等都要涉及到类的设计与调用,合理的成员函数设计以及恰到好处的成员变量加入对于系统各功能的实现极其重要,做好类的设计工作将十分有利于系统下一步的设计工作。
3.1.3 设计登录模块
登陆界面是系统自我保护的第一层防线,他的设计与系统用户直接相关。用户要使用本系统,首先必须通过系统的身份认证,这个过程叫做登陆。本节将介绍登录模块的实现过程。
当前用户的数据应该是全局有效的,在工程的任何位置都可以访问
- 9 -
哈尔滨理工大学学士学位论文
它。添加一个类CGlobal,用于保存全局变量。在CGlobal.h和CGlobal.cpp中添加如下代码: #include “Users.h” CUsers curuser;
在StdAfx.h中添加: #include” CGlobal.h”.因为StdAfx.h包含在很多程序中,这样这些程序就可以直接访问curuser对象了。在访问之前添加如下命令:extern CUsers curuser; 引入外部变量。
添加一个对话框,属性设置如表3-6所示:
属性 ID Captiion Font name Font size 表3-6 设置主对话框的属性 设置值 具体说明 IDD_LOGIN_DIALOG 对话框的ID值 登录对话框 对话框的标题条文本 宋体 设置对话框的字体 9 设置对话框的字号 系统运行时的登陆对话框如图3-2所示:
图3-2 登陆对话框的界面
按照如图所示添加控件,注意在密码控件中选中编辑框的Password属
性,这样用户在输入数据时编辑框只能显示“*”。为对话框建立一个类,并给两个编辑框分别制定一个成员变量m_UserName和m_Pwd.最后在主对话框中添加CPostalSpDlg::OnInitDialog()函数,使对话框在启动时首先打开登陆对话框。代码如下: LoginDlg dlg;
if (dlg.DoModal()!=IDOK) { exit(0); } else
curUser.GetData(dlg.m_UserName);
程序将打开登录对话框,如果用户不是通过单击“确定”按钮关闭对话框则调用exit(0)函数关闭对话框。在登录对话框的代码中,用户只有通
- 10 -
哈尔滨理工大学学士学位论文
过身份验证后才能调用exit(0)函数关闭对话框。因此可以判断,如果 dlg.DoModal()的返回值为IDOK,则表示用户已经通过了身份验证。为了保护系统的安全,我们默认每个用户最多只能连续登陆3次,超过3次系统将在提示用户后自动退出[4]。
3.2 邮件分拣信息处理模块设计
邮件分拣信息处理模块包括“手动输入与查询”和“自动输入”两部分。前者主要用于邮件信息无法正常读取时人工输入信息以及对邮件分拣信息的添加、修改、删除和打印功能。后者则是启动相关的分拣算法,使邮件信息随着系统硬件的运行自动输入信息到数据库中。
3.2.1 邮件信息添加对话框设计
此对话框主要用于添加邮件分拣信息和修改指定的邮件分拣信息。系统运行时,此界面如图3-3所示:
图3-3 邮件分拣信息添加框
按照上图所示添加各种控件之后,并设置相应的属性值,如表3-7表所示:
控件类型 Edit Box Edit Box Edit Box Edit Box Edit Box Button Button 表3-7 控件属性设置表 属性 属性值 说明 ID IDC_PID_EDIT 编辑邮件编号 ID IDC_POSTDATE_EDIT 编辑邮寄日期 ID IDC_PPLACE_EDIT 编辑邮件发出地址邮编 ID IDC_GPLACE_EDIT 编辑邮件接收地邮编 ID IDC_CID_EDIT 选择邮件分拣箱编号 ID IDOK 确定按钮 Caption 确定 ID IDCANCEL 取消按钮 Caption 取消 - 11 -