CfileDialog的使用方法与注意事项及多选打开对话框的创建

注意事项:

一、             最重要的一点:CfileDialog::DoModal()后会将当前的工作路径改变为打开文档处的路径,所以对于那些用相对路径定位的数据库连接操作或dll导入操作都是致命的,解决的最佳办法是在CfileDialog未创建的时候保存当前的工作路径,在CfileDialog::DoModal()==IDOK后,将工作路径改回来

二、             在最后注意空间的释放

三、             下面是多选打开对话框的实现

CString currentDirectory=L"";
TCHAR currentDir[1024]={0};
GetCurrentDirectory(1024,currentDir);
currentDirectory=currentDir;//将工作路径保存起来,因为在CFileDlg::DoModal()后会更改当前的工作路径,由于我们程序全部用的相对路径,所以后面的各种应用都会报错

CFileDialog fd(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT ,_T("Excel files(*.xls)|*.xls|"));

DWORD MAXFILE = 40000;                  //初始化空间大小,若超过初始化空间,程序fd.DoModal()会自己返回IDCANCEL值
fd.m_ofn.nMaxFile = MAXFILE;
TCHAR * pc = new TCHAR[MAXFILE];          //定义为T类型,可避免转换
USES_CONVERSION; 
fd.m_ofn.lpstrFile = pc;
fd.m_ofn.lpstrFile[0] = NULL;              //对文件选择对话框初始化

CString  parth=_T("1");            //The SHBrowseForFolder Dialog Box    选择文件夹类
int i;
int len;
if (IDOK == fd.DoModal())
{
POSITION pos=fd.GetStartPosition();
CString t_strFormat;
while(pos!=NULL)
{
parth=fd.GetNextPathName(pos);
this->m_fileDirArray.Add(parth); //保存每个文件的完整路径
len=parth.GetLength();
i=parth.ReverseFind('\\');
i=len-i;
parth=parth.Right(i-1);
m_excelList.AddString(parth);       //得到所有文件名
t_strFormat=parth;
parth.Format(_T("添加文件:%s"),t_strFormat);
this->m_status.SetWindowTextW(parth);
// ::SendMessageA(this->m_hWnd,WM_PAINT,0,0);//发送重绘消息
}
this->m_status.SetWindowTextW(_T("搜索完成"));
}
delete []pc;  //注意删除

::SetCurrentDirectoryW(currentDir);  //将工作路径设置回来,因为第一次点击CFileDlg::DoModal()后会将工作路径变为选择文档的工作路径

 

最后,项目心情记,与技术无关

由于在点击CFileDlg的OK按钮后,工作路径就会变为选择文件的路径,由于在ImportDlg中,使用的是GetCurWorkingDir来连接数据库的由于数据库连接函数是写在初始化函数中,所以改变当前工作路径对第一个对话框是没有影响的,但对于再次产生的对话框就死翘翘了,所以在致使在再次生成同样的对话框时,原应该是根本连不上数据库,但更悲催的事来了,在打开文档的那个文件夹内有一个同名的数据库mdb2.db,所以连上了,这就错过了最初的问题存在点,但到最后执行一个数据库语句时,就始终报错,我原以为是语句写错了,就这样试了一遍又一遍,换各种方法的试,就这样弄了一个下午,去吃饭,走在路上的时候,才想到应该是导入对话框的问题,因为第一次执行是一点问题没有的,所以坚决地拿出原来的开发阶段,有这块功能的最初版本,把代码一点点的注释掉,到最后定位到一句代码上,CFileDlg::DoModal(),该死的MSDN,根本没说改变工作路径这一回事啊

你可能感兴趣的:(工作,数据库,null,delete,文档,dialog)