1、GetParent () 和 GetParentOwner() 使用 和ShowWindow()异常问题。
利用visual stuido .net 2003的MFC,建立 名称为 SP的项目。
详细谈论见:
http://community.csdn.net/Expert/topic/4766/4766624.xml?temp=.4831049
问题简单描述:mfc 单文档,一个对话框中能否调用另外一个对话框的窗口显示?ShowWindow 异常问题。
主要问题所在:对GetParent() 和 GetParentOwner() 理解不清楚,因此导致无法成功的调用父窗口,也导致了ShowWindow()异常。
问题描述:
MFC单文档程序:
CSPView类 中有2个指向子对话框窗口的指针:CDataDialog *m_pDataDlg;
//注:class CDataDialog:public CDialog{
CPasswordDialog *m_pPasswordDlg;
//注:class CPathDialog:public CDialog{
建立2个子窗口时,都把父窗口设为当前窗口。
if(NULL==m_pDataDlg) //have not created the dialog box
{ m_pDataDlg = new CDataDialog(m_pPointSet,m_pArcSet);
m_pDataDlg->Create(IDD_INPUT_DATA,this);//父窗口为当前窗口
}
if(NULL==m_pPathDlg) //have not created the dialog box
{ m_pPathDlg = new CPathDialog(m_pPointSet,m_pArcSet,m_pDataDlg);
m_pPathDlg->Create(IDD_PATH,this);//父窗口为当前窗口
}
问题:希望在对话框CPasswordDialog对象中显示 CDataDialog 对象。
这里利用到了 父窗口 CSPView 。下面为我的初步方案(错误方案):
void CPasswordDialog::OnBnClickedOk()
{ // TODO: 在此添加控件通知处理程序代码
CSPView *view=(CSPView *) GetParent() ; //调用父窗口
view->m_pDataDlg->ShowWindow(SW_SHOW); //异常
}
解决方法:
CSPView *view=(CSPView *) GetParent() ; //调用父窗口
//实际上,这里得到的是一个的是一个指向CMainFram对象 的指针,而非其父窗口CView 对象的指针。
应该将此句改为:
CSPView *view=(CSPView *) ( ( (CMainFrame *)GetParent() )->GetActiveView() ); //调用父窗口
2、利用MFC 以 ODBC 方式连接 SQL Server 2000数据库
详细谈论见:
http://community.csdn.net/Expert/topic/4759/4759165.xml?temp=.9848444
问题简单描述:如何分别读取数据库中两个表的数据?我的方法一个表可以成功读取出,另外一个表失败。
问题本质所在:“mfc :单文档+数据库支持”方式对于默认的 数据记录集 无形调用了
Open() 。 然而,当我们自己手动添加 数据记录集合,需要显式调用 Open()
问题描述:
我的方法是: mfc :单文档+数据库支持(不支持文件的数据库视图+ODBC+绑定所有列+动态集)。
利用向导 生成一类 class CPointSet:public CRecordSet。 (读取数据库中的表point).
利用,我手工建立一个类class CArcSet:public CRecordSet (读取数据库中的表arc).
一个记录集(向导生成的)可以正确读取,另外一个(手动生成的)数据读取却失败。
我的初始想法:
由于刚刚接触数据库,并且刚刚学会利用MFC中ODBC方式连接数据库,因此对于CRecordSet 本身理解的不是很透彻。
我是利用MFC向导(数据库支持)来生成程序。由于向导已经帮我生成了一个CRecordSet的派生类CPointSet,因此我模仿该CPointSet,也建立了一个CRecordSet的派生类CArcSet。
我尝试将程序中所有出现CPointSet的地方也同样添加类似的CArcSet程序代码。
然而,现实总是不尽人意!!!!这样子的后果是,出现了前文所提到的问题。
那么,应该如何解决这个问题呢?
我的原始程序代码片段:
void CSPView::OnInitialUpdate()
{ CView::OnInitialUpdate();
m_pPointSet = &GetDocument()->m_PointSet; //向导生成的代码
m_pArcSet = &GetDocument()->m_ArcSet; //我手动建立的代码
}
请注意:
CPointSet::CPointSet(CDatabase* pdb) : CRecordset(pdb) //已经默认调用了Open()函数
CArcSet::CArcSet(CDatabase* pdb) : CRecordset(pdb) //没有默认调用Open()函数!!!!
解决方法:
因此,我们需要将代码改动如下:
m_pPointSet = &GetDocument()->m_PointSet; //向导生成的代码
m_pArcSet = &GetDocument()->m_ArcSet; //我手动建立的代码
//仍然需要添加的代码
// m_pPointSet->IsOpen() 为真,而 m_pArcSet->IsOpen() 为假
if (!m_pArcSet|| ( !m_pArcSet->IsOpen() && !m_pArcSet->Open() )
{ AfxMessageBox("Connecting data base error.");
return;
}
