软件系统集成灵活运用配置文件能节省我们很多开发时间,并可以给系统维护带来极大的便利。
下面以我最近做的一个小项目为例。
我接到一个小CASE,公司想把他们的两个产品做一个整合:把一个工具性的软件集成到公司开发的一个软件系统中去。这个工具箱软件暂且命名为:Tool_A.集成到的系统暂且命名为:AutoSystem
原来的时候Tool_A的一些参数都是要用户手动去输入的,因为AutoSystem可以自动扫描出这些Tool_A所要的数据。扫描出这些数据之后,AutoSystem存放在一个Access的文件中。
Solution_A:我是想把原来系统的代码全部移植到AutoSystem中,这个方案我花了很多时间,但是失败了。原因是我对这个Tool_A根本不了解。AutoSystem我也不了解。
我要全部了解这些东西无疑要花去很多时间,在试用期的我,怎么能花这么长时间呢。
我想到现在很多软件安装后,都有很多exe文件他们都可以独立的运行。
后来我想到了Solution_B的这个方法
Solution_B:两个系统我还是让他们分别独立。我改变了Tool_A的界面,界面画一个表格
这个是数据来源于系统AutoSystem。我在AutoSystem里面菜单下面加个一个该工具的菜单选项,并且加了一个快捷图标在。这样的话,我把原来的一些从界面上获取的参数,全部用表格里面的数据代替。
这样带来的一个问题是数据文件的路径怎么获取呢?
开始我测试用的是绝对路径,用过之后,我就考虑如何获取路径的问题了。
在AutoSystem中有个路径的全局变量
后面我就想把这个全局变量,但点击Tool_A这个菜单的时候,就会把这个全局变量保存到C盘下面的一个配置文件中DB.ini
当运行Tool_A的时候,我在初始化的时候,就从DB.ini中读取数据库的路径
这样就可以让程序无论拷贝到那个地方都可以正常的运行使用了。
主要的核心代码在下面做一些分享,这些代码其实都可以在网上搜索到。这里做一下小小总结:
代码一:MFC读取数据库文件核心代码
- void CAccessDBDlg::readFromDB()
- {
- CString DB_T=_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
- g_strDatabasefilepath=DB_T+_T("E:\\Alex\\AccessDB\\Debug\\Student.mdb");
- _ConnectionPtr m_pConnection;
- AfxOleInit();
- m_pConnection.CreateInstance(__uuidof(Connection));
- try
- {
- m_pConnection->Open(g_strDatabasefilepath.GetString(),"","",adModeUnknown);
- }
- catch(_com_error e)
- {
- //AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
-
- }
- _RecordsetPtr m_pRecordset;
- m_pRecordset.CreateInstance(__uuidof(Recordset));
- // 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
- // 因为它有时会经常出现一些意想不到的错误。jingzhou xu
- try
- {
- CString sql;
- sql.Format(_T("select * from student"));
- m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->ErrorMessage());
- }
-
- _variant_t var;
- CString strName,strAge;
- try
- {
- if(!m_pRecordset->EndOfFile)
- m_pRecordset->MoveFirst();
- else
- {
- AfxMessageBox(_T("表内数据为空"));
- return;
- }
- int i=0;
- while(!m_pRecordset->EndOfFile)
- {
- var = m_pRecordset->GetCollect("name");
- if(var.vt != VT_NULL)
- strName = (LPCSTR)_bstr_t(var);
- var = m_pRecordset->GetCollect("age");
- if(var.vt != VT_NULL)
- strAge = (LPCSTR)_bstr_t(var);
- m_list.InsertItem(i,strName);
- m_list.SetItemText(i,1,strAge);
- m_pRecordset->MoveNext();
- ++i;
- }
- }
- catch(_com_error *e)
- {
- AfxMessageBox(e->ErrorMessage());
- }
- }
下面一个代码是从表格中获取数据的属于listctl控件的用法
- int ROW=-1;
- CString str;
- for(int i=0; i<m_list.GetItemCount(); i++)
- {
- if( m_list.GetItemState(i, LVIS_SELECTED) ==LVIS_SELECTED )
- {
- str.Format(_T("选中了第%d行"), i);
- ROW=i;
- AfxMessageBox(str);
- }
- }
文件的写和读取
- CFile delFile;
- CStdioFile mFile;
- CFileException mExcept;
- CString g_strDatabasefilepath=_T("Hello,World");
- if (_access("DB.ini",0)!=-1)
- {
- delFile.Remove(_T("DB.ini"));
- mFile.Open(_T("DB.ini"), CFile::modeWrite|CFile::modeCreate, &mExcept);
- mFile.WriteString(g_strDatabasefilepath);
- mFile.Close();
- }
- else
- {
- mFile.Open(_T("DB.ini"), CFile::modeWrite|CFile::modeCreate, &mExcept);
- mFile.WriteString(g_strDatabasefilepath);
- mFile.Close();
- }
从文件中读取
- CStdioFile file;
- CFileException mExcept;
- file.Open(_T("DB.ini"),CFile::modeRead,&mExcept);
- file.ReadString(m_fileStr) ;
- file.Close();
- UpdateData(FALSE);
阅读(1522) | 评论(0) | 转发(0) |