程序具体设计思路及各实现过程的详细步骤:
1、建立工程框架
1.1在新建MFC项目向导的“数据源”中选中MS Access Database
1.2单击OK键弹出“选择数据源”对话框选定所需的数据库文件(*.mdb)
1.3然后选择一个表以后点击新建项目向导的Finish即可完成项目框架的建立。
2、建立数据库链接
2.1由于那种方法刚才建立的连接是使用默认数据源,每次在程序启动时都要弹出选择数据库的窗口,十分不便,所以在程序的CNCUApp类里添加了m_database及m_recordSet作为公用数据库及公用数据集,利用extern声明为全局变量,然后建立OpenDB()及其参数重载函数作为打开数据库的函数使用以便以后功能调用。(详见下一章对应源代码)
3、设计软件主界面及Tab布局
3.1由于单文档界面默认布局不美观,所以打算设计成Tab页面以在主窗口上显示所有窗口。 3.2新建对话框,按照设计要求制作出每个功能的界面,然后利用类向导为每个对话框新建类,新建时的Base Class选择CPropertyPage
3.3建立CPropertySheet类的对象m_sheet,以及指针*m_page,以指向当前打开的页面。 3.4建立打开Tab页的函数CreateTab()和关闭函数DestoryTab()(详见对应源代码) 3.5为侧面对应的按钮添加OnClick事件处理函数。
4、设计登录界面
4.1设计登录界面对话框 4.2为对话框建立类CLogin
16
4.3为注册和登录按钮添加单击事件处理函数。(详见对应源代码) 4.4在CNCUApp中的InitInstance()函数添加弹出登录窗口的相关代码。 4.5建立theUser字符串变量,在用户登录成功以后用来储存用户的ID值。
5、设计用户注册界面
5.1设计用户注册界面对话框并建立相关联的类 5.2为界面上的每个控件连接控制变量。 5.3添加确定按钮的OnClick事件处理函数。 5.3.1从界面各控件获得数据。
5.3.2判断各数据的合法性,其中用户名不能少于3个字节而且不能和已有的用户名重复;密码不能少于6位。
5.3.3若各数据合法,连接数据库并在User表中插入用户填写的相关信息,显示注册成功,提示用户返回登录界面。
6、设计用户设置界面
6.1在已经设计好的用户设置对话框中为各个控件添加控制变量。
6.1.1其中“收入类型”中采用ListControl,属性设置为No column header。 6.2为该对话框加入初始化函数。
6.2.1从数据库中依据theUser变量读取用户的相关信息。其中读取出的InType和OutType字符串经过分割以后存到对应字符串数组里。
6.2.2使用读取的数据初始化界面上的各个控件。
6.3为对话框的“收入类型”的“添加”按钮添加处理函数。 6.3.1判断文本框是否为空。
6.3.2若不为空的话向数据库的InType中添加新类别,然后同步更新储存TypeID的相关数组。 6.3.3同理制作“支出类型”的添加按钮。
6.4为对话框的“收入类型”的“删除”按钮添加处理函数。 6.4.1判断是否选中一条记录。 6.4.2获得该记录对应的行数。
6.4.3在列表框中删除该记录,并同步更新存储其ID的相关数组。 6.5为界面的“确定”按钮添加处理函数。
6.5.1从界面上的各控件获得数据并储存在变量中。 6.5.2判断各数值的有效性。 6.5.3判断登录密码是否为空
6.5.3.1若不为空则判断是否和确认密码相等,否则返回。 6.5.3.2判断密码的位数是否合法。
6.5.4判断用户名是否修改过,若修改过是否和已有的用户重复。 6.5.5对偏好设置的字符串进行处理,去掉“元”。
6.5.6根据储存收入支出类型ID的字符串数组生成typeID相关字符串。(用逗号隔开) 6.5.7根据获得的数据更新User数据表中相关记录。 6.6为界面的“取消”按钮添加代码。
6.6.1调用OnInitDialog();函数使对话框重新回到初始状态,还原用户修改过的设置。
7、设计银行帐户管理界面
7.1为设计好的对话框连接控件的控制变量 7.2为对话框的OnInitDialog();函数添加语句,获得数据库中用户关于银行帐户的相关信息并显示到界面上。
17
7.3建立RefleshList函数,刷新列表框。 7.4为列表框添加单击事件的处理函数。 7.4.1判断是否选中一行。
7.4.2获得行数,并把该行的相关信息显示到各控件中,以便用户修改。
7.4.3搜索出数据库中关于该账户的最后一条历史余额的记录,即最新当前余额显示到左下角的文本框中。
7.5添加“添加”按钮的单击事件处理函数。 7.5.1从各控件获得数据,并储存在相关变量中。 7.5.2判断各数据的合法性。
7.5.3把“账户余额”文本框设为有效,提示用户在里面输入新建账户的初始余额。返回。 7.5.4若用户输入完初始余额以后,按照获得的各项数据向数据库的Account表中添加新记录。 7.5.5刷新列表框。
7.6同理,添加“修改”按钮的处理函数。 7.7添加“删除”按钮的处理函数。
8、设计余额信息管理界面
8.1为界面个控件连接变量。
8.2从数据库中取出历史余额信息。 8.3初始化对话框各控件
8.3.1制作RefreshList()函数用来刷新列表框。
8.3.1.1函数带默认参数,在参数中获得SQL语句,以便在筛选功能时显示列表使用。 8.3.2从数据库中获得该用户的所有银行帐户显示到“查询”中的“账户”下拉列表框中。 8.4为“更新”按钮添加代码。 8.4.1判断是否选定一行。
8.4.2按照用户填写的信息更新数据库。 8.5为“筛选”按钮添加代码。 8.5.1获得起止时间及选定的账户
8.5.2根据获得的数据生成SQL语句。
8.5.3调用RefreshList(strSQL)对列表框的内容进行刷新。 8.6添加“取消”按钮的代码。
9、设计收支信息管理界面
9.1为各控件连接变量。
9.2从数据库中获取该用户的收支信息,并存入相关变量。 9.3根据变量来初始化对话框,显示各控件的内容。
9.3.1制作RefreshList函数用来根据参数获得的SQL语句读取数据库刷新列表。 9.3.2制作ListIn()函数来刷新收入类别的下拉列表框。 9.3.3制作ListOut()函数来刷新支出类别的下拉列表框。
9.3.4制作ListAll()函数来刷新“分类显示”部分的“所有类别”下拉列表框。 9.4添加单击列表框事件的处理函数。 9.4.1判断是否选中一行。
9.4.2根据选中行在相应控件上显示出数据。 9.4.2.1对“金额”进行处理以去掉符号。
9.4.2.2对时间进行处理,转化为CTime类型使其能够显示到TimeDatePicker控件上。 9.5添加单击收入/支出单选按钮时的事件。 9.5.1通过判断语句直接调用ListIn()或ListOut()
18
9.6添加“添加”按钮单击事件的处理函数。 9.6.1从界面控件上获得数据。 9.6.2判断各数据的有效性。
9.6.3向数据库的Input或Out表中添加新的收支记录。
9.6.4读取数据库中的Balance表获取该项收支记录对应账户的当前金额。 9.6.5把当前金额和新添加的收支记录的金额转化为浮点型。 9.6.6计算出添加以后的余额。
9.6.7把计算后的余额等相关信息添加到Balance表中,并以收支记录的注视或类型作为该记录的注释。
9.6.8调用Alarm(amount)函数判断收支是否超过规定,以进行合理的提醒。 9.7添加“修改”按钮单击事件的处理函数。 9.7.1从控件中获得数据 9.7.2判断有效性。
9.7.3更新Input或者Out数据表 9.7.4从数据库中取得当前余额。
9.7.5利用修改前后的差值计算出修改以后的当前余额。 9.7.6把计算后的余额信息添加到Balance表中。 9.7.7调用函数进行适当的提醒。
9.8添加“删除”按钮单击事件的处理函数。 9.9添加“查询”按钮单击事件的处理函数。 9.9.1从控件中获得数据。
9.9.2根据获得的数据生成相应的SQL语句
9.9.3利用RefreshList(strSQL)函数刷新列表框。
9.9.4获得从刷新列表框函数里算得的所有收入和所有支出的金额。 9.9.5从数据库中获得帐户的当前余额。
9.9.5.1若选定“所有账户”则遍历每个账户的余额,然后算出总余额。 9.10添加“取消”按钮单击事件的处理函数。 9.10.1使对话框的每个控件回到初始状态。
10、设计收支记录导出界面
10.1为界面控件连接变量。
10.2从数据库中获得相关的收支记录。 10.3利用收支记录初始化各控件。
10.4添加“筛选”按钮的代码。(同9.9) 10.5添加“导出”按钮的代码。
10.5.1调用“筛选”按钮确保列表处于最新状态。
10.5.2获得系统当前时间,以生成导出的文本文件的默认文件名。 10.5.3弹出导出文件对话框,让用户选择文件存放的目录及文件名。 10.5.3.1创建CArchive类型的ar对象,以便实现文件的写操作。 10.5.4根据theUser变量查询用户名,写到文件的第一行。 10.5.5显示文件的标题行。
10.5.6遍历列表框中的记录,导出每一项收支记录。
10.5.7获得用户的总收入/支出金额以及当前余额等信息,写到文件的最后一段。 10.5.8关闭文件,提示导出成功,返回。 10.6添加“取消”按钮的代码
10.6.1调用OnInitDialog();使对话框中的各控件回到初始状态。
19
八、源代码
NCU.h
//声明全局变量和全局函数 int SplitString(CString & str, TCHAR cTok, CStringArray& aryItem); void OpenDB(void);
void OpenDB(CString str);
void OpenDB(CDatabase &db,CRecordset &rs);
void SetDate(CString time,CDateTimeCtrl &timer); void DeleteAllColumn(CListCtrl &m_lstCtrl); CString FixValue(CString temp); CString FixTime(CString temp);
CString FixAccount(CString temp); CString FixInType(CString temp); CString FixOutType(CString temp);
int FindStr(CString str,CStringArray &strArr); long GetCount(CRecordset &rs,CString str); float GetBalance(CString accountID); extern CString cSQL; extern CString cPath;
extern CRecordset m_recordSet; extern CDatabase m_database; extern CString theUser;
NCU.cpp
//全局函数体
//////////分割字符串函数///////////
///用法:SplitString(\要分割的字符串\分隔符',用来保存分割后的字符串数组);
////////////////////////////////////
int SplitString(CString & str, TCHAR cTok, CStringArray& aryItem) { TCHAR* p = str.GetBuffer(0); TCHAR* e = p; TCHAR cEnd = *e; int nCount = 0; while(cEnd) { if(*e == _T('\\0')) cEnd = *e; else if(*e == cTok) *e = _T('\\0');
20
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库大学生个人理财管理系统(4)在线全文阅读。
相关推荐: