石河子大学--Delphi课程设计 2012年11月2日
④ 连接成功之后会出现如图3-13所示的选择数据库对象的对话框,在这里我们选择groupInfo,然后单击确定按钮,随后MFC会自动生成类CGroupInfo的代码。
图3-13 选择数据库对象
⑤ 参考上述生成类CGroupInfo的步骤,生成记录集类CPeople和Cuser的代码。
石河子大学--Delphi课程设计 2012年11月2日
4 系统的实现
4.1 主窗口设计
4.1.1 主窗口信息显示
本系统采用了以对话框为主体的界面方案,在建立了程序框架及扩展了相关记录集后就可以开始进行具体功能上的实现了。
通讯录最重要的功能便是显示教师信息,因此主窗口的主要功能也应当是查询及显示教师信息。根据此前对系统需求的分析,教师的信息应包含姓名、性别、工作单位、办公电话、住址、住宅电话、手机、邮箱、QQ、MSN及备注信息,教师的分组列表则可以用树控件进行显示,所以主窗口中应显示上述全部信息。
基于上述考虑,在资源视图中更改对话框(即ID为ID_ADDRESSLIST_DIALOG 的对话框)的大小并按图4-1所示添加相应控件。其中有一个树控件,然后是多个静态文本和编辑框,一个单选按钮,数个按钮用来实现增删改查的功能。
石河子大学--Delphi课程设计 2012年11月2日
图 4-1 主界面
控件添加好了之后,分别对它们进行添加变量,具体方法如下:
① 右键单击某个控件,在弹出的菜单中选择“添加变量”。
② 此时会弹出一个对话框,在里面可以选择变量的类型和类别,然后输入变量名,最后单击完成按钮即可完成一个变量的添加。如图4-2所示。
图 4-2 添加变量
③ 重复上述步骤,添加其他变量。
在上述步骤中定义的变量在MFC中是如何与相应的控件联系起来的呢?通过在类CAddressListDlg中找到函数DODataExchange,可以发现MFC正是在这个函数中为变量和控件建立了映射关系,其代码如下:
void CAddressListDlg::DoDataExchange(CDataExchange* pDX)
石河子大学--Delphi课程设计
{
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAddressListDlg)
2012年11月2日
DDX_Control(pDX, IDC_TREE_LIST, m_tree_list); DDX_Text(pDX, IDC_EDIT_ADDRESS, m_address); DDX_Text(pDX, IDC_EDIT_COMPANY, m_company); DDX_Text(pDX, IDC_EDIT_MAIL, m_mail); DDX_Text(pDX, IDC_EDIT_MEMORY, m_memory); DDX_Text(pDX, IDC_EDIT_MOBILE, m_mobile); DDX_Text(pDX, IDC_EDIT_MSN, m_msn);
DDX_Text(pDX, IDC_EDIT_PHONEATHOME, m_phoneInHome); DDX_Text(pDX, IDC_EDIT_PHONEINCOMPANY, m_phoneInCompany); DDX_Text(pDX, IDC_EDIT_QQ, m_qq); DDX_Radio(pDX, IDC_RADIO_MAN, m_sex); DDX_Text(pDX, IDC_EDIT_NAME, m_name); //}}AFX_DATA_MAP
DDX_Control(pDX, IDC_About, m_About);
}
程序启动后,显示主窗口时需要对左侧的树控件进行初始化,它应显示当前
石河子大学--Delphi课程设计 2012年11月2日
系统中所有的分组及隶属于不同组的教师成员。树控件初始化的工作由函数InitTreeList完成,它将在初始化函数OnInitDialog中被调用。函数InitTreeList首先调用树控件的DeleteAllItems方法清空控件中原有的项目,然后从数据库中查询组信息,并依次将组名插入到树控件中,在每插入一个组后,立即将隶属于该组的教师添加到该组下。
由MFC向导生成的记录集类在生成实例时需要传入一个CDatabase类型的引用参数,因此在使用类CGroupInfo及CPeople之前需要先构建CDatabase类的实例,然后将它的引用作为参数构建类CGroupInfo及CPeople的实例。在产生记录集的实例后(函数InitTreeList中的实例名分别为gi和people),将查询SQL语句传入其Open方法打开记录集,然后通过树控件的InsetItem方法将组名或教师姓名作为树控件的一个条目插入,为了能够在控件中唯一地标识每一个组及教师,还需要调用SetItemData方法将组ID或教师ID绑定到控件中的相应条目上。在对数据库的操作方面,函数中还出现了记录集的MoveNext方法及数据库的Close方法,它们的作用分别是移动记录集指针到下一条记录,以及关闭当前数据库连接。InitTreeList()函数如下所示。
void CAddressListDlg::InitTreeList() {
m_tree_list.DeleteAllItems(); CString strPeoPleQuery;
strPeoPleQuery = \; CDatabase db1; CGroupInfo gi(&db1);
gi.Open(AFX_DB_USE_DEFAULT_TYPE, strPeoPleQuery);