MFC文本编辑器ADO连接数据库.docx
《MFC文本编辑器ADO连接数据库.docx》由会员分享,可在线阅读,更多相关《MFC文本编辑器ADO连接数据库.docx(35页珍藏版)》请在冰豆网上搜索。
MFC文本编辑器ADO连接数据库
C++面向对象程序设计
实践设计报告
设计题目:
文本编辑器的实现(数据库)
院系:
桂林电子科技大学信息科技学院
信息工程系
学生专业:
计算机科学与技术(软件)
学生姓名:
学生学号:
*******
日期:
2013.1.4
桂林电子科技大学信息科技学院
一、应用程序的名称
MFC文本编辑器
二、应用程序概述
2.1应用程序的主题
“MFC文本编辑器”主要是实现对txt格式的文本进行编辑的功能,主要涉及对文本进行保存、打开、编辑、查找、替换、字数统计等功能。
在实现基本功能的基础上做到界面美观,清晰,操作简便,还增加的更多人性化功能便于用户使用。
2.2设计目的
本题目设计目的是训练学生的基本编程能力,了解文件编辑系统的开发流程,熟悉C++语言对文件、数据库的各种基本操作,还有运用MFC编写可视化窗口的基本操作。
本程序中涉及数据库、文件、MFC中Dialog类库的运用等方面的知识。
通过本程序的训练,使学生能对C++语言对数据库操作和文件操作有一个更深刻的了解,掌握利用数据库实现对数据保存的原理,还掌握了MFC中对文件操作的方法,为进一步开发出高质量的办公化软件打下坚实的基础。
三、程序简介
3.1基本结构
3.2基本内容
文件模块:
提供新建、打开、保存、另存为、退出功能。
编辑模块:
提供撤销、复制、剪切、粘贴、删除、清空、查找/替换、转到、全选、时间与日期功能
格式模块:
提供字体功能
查看模块:
提供使用功能、字数统计功能
关于模块:
版权声明
3.3运行环境
Windows操作系统、需要SQLSever2005以上版本的SQL数据库
四、详细设计
4.1数据库设计
4.1.1数据表设计
字段数据类型属性
idint主键、自增、非空
timedatetime默认值getdate()、非空
operatevarchar(50)非空
4.2程序部分
4.2.1图标设计
通过引入将图标文件引入项目中,起名IDI_ICON
通过设置CMFCDlg函数中的LoadIcon实现改变图标
CMFCDlg:
:
CMFCDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMFCDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMFCDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDI_ICON);
}
4.2.2主界面
设计灵感来源微软的记事本
4.2.2.1主界面载入前的初始化
通过ADO的方法对数据库进行连接,并且通过Insert语句对数据库增加访问数据。
相关代码:
MFC文本编辑器Dlg.h
//连接数据库变量
_ConnectionPtrm_pConnection;
_RecordsetPtrm_pRecordset;
MFC文本编辑器Dlg.cpp
BOOLCMFCDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//增加访问记录
try
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pConnection->Open((_bstr_t)"Driver={SQLServer};Server=Melon-PC\\SQL2005;Database=note;UID=sa;PWD=123456","","",adModeUnknown);
m_pRecordset=m_pConnection->Execute("insertintoOperateRecord(operate)values('登陆')",NULL,adCmdText);
}
catch(_com_errore)
{
AfxMessageBox(e.Description());
}
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
4.2.2.2主界面关闭最后处理
通过ADO的方法对数据库进行连接,并且通过Insert语句对数据库增加登出数据,之后关闭数据库连接和记录集,并释放。
相关代码:
MFC文本编辑器Dlg.h
//连接数据库变量
_ConnectionPtrm_pConnection;
_RecordsetPtrm_pRecordset;
MFC文本编辑器Dlg.cpp
voidCMFCDlg:
:
PostNcDestroy()
{
//增加访问记录
try
{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pConnection->Open((_bstr_t)"Driver={SQLServer};Server=Melon-PC\\SQL2005;Database=note;UID=sa;PWD=123456","","",adModeUnknown);
m_pRecordset=m_pConnection->Execute("insertintoOperateRecord(operate)values('登出')",NULL,adCmdText);
}
catch(_com_errore)
{
AfxMessageBox(e.Description());
}
m_pConnection->Close();
m_pRecordset->Close();
m_pConnection.Release();
m_pRecordset.Release();
CDialog:
:
PostNcDestroy();
}
4.2.2.3主界面关闭第一处理
根据判断文本是否被修改,决定是否进行保存处理。
相关代码:
MFC文本编辑器Dlg.h
//保存
BOOLisNew;
CStringSavePath;
BOOLisModified;
MFC文本编辑器Dlg.cpp
//关闭判断
voidCMFCDlg:
:
OnClose()
{
isModified=m_edit.GetModify();
CStringstring;
m_edit.GetWindowText(string);
if(isNew&&string.IsEmpty())
{
CDialog:
:
OnClose();
}
elseif(isModified)//被修改
{
intQuitChoice=MessageBox("当前文本已被修改,想保存吗?
","系统提示",
MB_YESNOCANCEL|MB_ICONQUESTION);
if(QuitChoice==IDYES)//选是
{
OnSava();
if(isModified=FALSE)
CDialog:
:
OnClose();
}
elseif(QuitChoice==IDNO)//选否
{
CDialog:
:
OnClose();
}
else
{
return;
}
}
else//没被修改
{
CDialog:
:
OnClose();
}
}
4.2.2.4菜单设计
通过对话框属性设置添加主界面的MENU。
相关名称与函数:
菜单名菜单ID对应函数
新建(&N)\tCtrl+NIDR_NEWOnNew
打开(&O)...\tCtrl+OIDR_OPENOnOpen
保存(&S)\tCtrl+SIDR_SAVAOnSava
另存为(&A)...IDR_ASOnAs
退出(&X)IDR_EXITOnExit
撤销(&Z)\tCtrl+ZIDR_UNDOOnUndo
剪切(&X)\tCtrl+XIDR_CUTOnCut
复制(&C)\tCtrl+CIDR_COPYOnCopy
粘贴(&V)\tCtrl+VIDR_PASTEOnPaste
删除(&D)\tCtrl+DIDR_DELOnDel
清空IDR_ClearOnClear
查找/替换(&F)\tCtrl+FIDR_FINDOnFind
转到(&G)...\tCtrl+GIDR_GOOnGo
全选(&A)\tCtrl+AIDR_ALLOnAll
时间和日期IDR_TIMEOnTime
字体(&F)...IDR_FONTOnFont
使用记录IDR_ADOOnAdo
字数统计IDR_COUNTOnCount
关于(&A)关于(&A)OnAbout
4.2.3文件模块
4.2.3.1新建
先对正在打开的文档进行判断,若文档经过修改后没有进行保存,则询问用户是否保存,若文档是空的或者已经保存未被修改,则直接清除文档中的内容,达到新建目的。
相关代码:
MFC文本编辑器Dlg.h
//保存
BOOLisNew;
BOOLisModified;
MFC文本编辑器Dlg.cpp
//新建
voidCMFCDlg:
:
OnNew()
{
isModified=m_edit.GetModify();
CStringstring;
m_edit.GetWindowText(string);
if(isNew&&string.IsEmpty())
{
;
}
elseif(isModified)//被修改
{
intChoice=MessageBox("当前文本已被修改,想保存吗?
","系统提示",
MB_YESNO|MB_ICONQUESTION);
if(Choice==IDYES)//选是
{
OnSava();
}
}
//新建
m_edit.SetSel(0,-1);
m_edit.Clear();
isNew=TRUE;
m_edit.SetModify(FALSE);
}
4.2.3.2打开
先对正在打开的文档进行判断,若文档经过修改后没有进行保存,则询问用户是否保存,若文档是空的或者已经保存未被修改,用CFileDialog类建立打开对话框,按照用户的在对话框中的选择打开文件并且显示在编辑框中,并且设置文件地址,以便保存功能。
相关代码:
MFC文本编辑器Dlg.h
//保存
BOOLisNew;
CStringSavePath;
BOOLisModified;
MFC文本编辑器Dlg.cpp
//打开功能
voidCMFCDlg:
:
OnOpen()
{
isModified=m_edit.GetModify();
CStringstring;
m_edit.GetWindowText(string);
if(isNew&&string.IsEmpty())
{
;
}
elseif(isModified)//文本被修改
{
intChoice=MessageBox("当前文本已被修改,想保存吗?
","系统提示",MB_YESNO|MB_ICONQUESTION);
if(Choice==IDYES)
{
OnSava();
}
}
//打开
charszFileFilter[]="文本(*.txt)|*.txt|";
charszFileExt[]="txt";
CFileDialogdlg(true,szFileExt,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFileFilter,AfxGetMainWnd());
CStringstrPath;
if(dlg.DoModal()==IDOK)
{
CStdioFileFile;
CStringstrText,strLine;
strPath=SavePath=dlg.GetPathName();
File.Open(dlg.GetPathName(),CFile:
:
modeReadWrite);
while(File.ReadString(strLine))
{
strLine+="\r\n";
strText+=strLine;
}
m_edit.SetWindowText(strText);
File.Close();
m_edit.SetModify(FALSE);
isNew=FALSE;
}
}
4.2.3.3保存
先对文档是否是新建的进行判断,若是新建的则跳转到另存为。
若不是则提取出编辑框中的内容,再从SavePath变量中获取路径,进行保存处理。
相关代码:
MFC文本编辑器Dlg.h
//保存
BOOLisNew;
CStringSavePath;
BOOLisModified;
MFC文本编辑器Dlg.cpp
//保存功能
voidCMFCDlg:
:
OnSava()
{
charszFileFilter[]="文本(*.txt)|*.txt|";
charszFileExt[]="txt";
if(isNew)
{
OnAs();
}
else
{
CStdioFileFile;
CStringstr;
m_edit.GetWindowText(str);
File.Open(_T(SavePath),CFile:
:
modeCreate|CFile:
:
modeReadWrite);
File.WriteString(str);
File.Close();
m_edit.SetModify(FALSE);
}
m_edit.SetSel(0,0);
}
4.2.3.4另存为
建立另存为对话框,通过用户在对话框中的选择进行判断。
若文件存在,则提示用户是否替换按用户选择采取对应的操作;若文件不存在,则设置SavePath变量为用户设置的路径,再提取编辑框中的内容进行存储。
相关代码:
MFC文本编辑器Dlg.h
//保存
BOOLisNew;
CStringSavePath;
BOOLisModified;
MFC文本编辑器Dlg.cpp
//另存为
voidCMFCDlg:
:
OnAs()
{
CFileStatusfs;//文件存在状态
charszFileFilter[]="文本(*.txt)|*.txt|";
charszFileExt[]="txt";
CFileDialogdlg(FALSE,szFileExt,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFileFilter,AfxGetMainWnd());
CStringstrPath;
if(dlg.DoModal()==IDOK)//按下另存为
{
strPath=dlg.GetPathName();
if(CFile:
:
GetStatus(_T(strPath),fs))//文件存在
{
CStringinfo=strPath;
info+="已存在。
\r\n要替换它吗?
";
intnChoice=MessageBox(info,"另存为",MB_ICONWARNING|MB_YESNO);
if(nChoice==IDYES)//确认替换
{
SavePath=strPath;
CStdioFileFile;
CStringstr;
m_edit.GetWindowText(str);
File.Open(_T(strPath),CFile:
:
modeCreate|CFile:
:
modeReadWrite);
File.WriteString(str);
File.Close();
isNew=FALSE;
m_edit.SetModify(FALSE);
}
else//不替换
{
OnAs();
}
}
else//文件不存在
{
SavePath=strPath;
CStdioFileFile;
CStringstr;
m_edit.GetWindowText(str);
File.Open(_T(strPath),CFile:
:
modeCreate|CFile:
:
modeReadWrite);
File.WriteString(str);
File.Close();
isNew=FALSE;
m_edit.SetModify(FALSE);
}
}
m_edit.SetSel(0,0);
}
4.2.3.5退出
进入OnClose函数进行是否需要保存的询问。
相关代码:
MFC文本编辑器Dlg.cpp
//退出
voidCMFCDlg:
:
OnExit()
{
OnClose();
}
4.2.4编辑模块
4.2.4.1撤销、剪切、复制、粘贴、删除
运用编辑框类中的函数进行操作。
相关代码:
MFC文本编辑器Dlg.cpp
//撤销
voidCMFCDlg:
:
OnUndo()
{
m_edit.Undo();
}
//粘贴
voidCMFCDlg:
:
OnPaste()
{
m_edit.Paste();
}
//删除
voidCMFCDlg:
:
OnDel()
{
m_edit.Clear();
}
//剪切
voidCMFCDlg:
:
OnCut()
{
m_edit.Cut();
}
//复制
voidCMFCDlg:
:
OnCopy()
{
m_edit.Copy();
}
4.2.4.2清空
将文本框中的内容设置为空,并且恢复光标焦点。
相关代码:
MFC文本编辑器Dlg.cpp
//清除
voidCMFCDlg:
:
OnClear()
{
m_edit.SetWindowText("");
m_edit.SetFocus();
}
4.2.4.3全选
运用编辑框的SetSel函数进行全选。
相关代码:
MFC文本编辑器Dlg.cpp
//全选
voidCMFCDlg:
:
OnAll()
{
m_edit.SetSel(0,-1);
}
4.2.4.4时间和日期
通过建立SYSTEMTIME类型的变量,并且通过GetLocalTime获取本地时间,在通过ReplaceSel函数将时间插入编辑框。
相关代码:
MFC文本编辑器Dlg.h
//插入时间变量
intnstar,nend;
MFC文本编辑器Dlg.cpp
//添加时间
voidCMFCDlg:
:
OnTime()
{
SYSTEMTIMEst;
GetLocalTime(&st);
CStringsTime;
sT