在对话框里执行下面语句总是出现Debug Assertion Failed!而在视图类就很正常

zhongnan92 2011-12-14 12:45:58
class CGridDlg : public CDialog
{
public:
CMyDoc* GetDocument();
CMySet* m_pSet;
CGrid(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CGrid)
enum { IDD = IDD_GRID };
CMSFlexGrid m_MSFGrid;

BOOL CGridDlg::OnInitDialog()
{

CDialog::OnInitDialog();
m_pSet = &GetDocument()->m_mySet;
while(!m_pSet->IsEOF()) m_pSet->MoveNext();
m_pSet->MoveFirst();
m_MSFGrid.SetCols(m_pSet->m_nFields+1);
m_MSFGrid.SetRows(m_pSet->GetRecordCount()+1);

m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(0);
m_MSFGrid.SetText("记录号");
m_MSFGrid.SetCellAlignment(4); //单元格对齐方式,4表示水平和垂直居中
CODBCFieldInfo field;
for (UINT i=0; i<m_pSet->m_nFields; i++)
{
m_MSFGrid.SetRow(0); m_MSFGrid.SetCol(i+1);
m_pSet->GetODBCFieldInfo(i,field); // 获取指定字段信息
m_MSFGrid.SetText(field.m_strName);
m_MSFGrid.SetCellAlignment(4);
}
int iRow=1;
while (!m_pSet->IsEOF())
{ // 将表的记录内容显示在单元格中
CString str;
str.Format("记录%d",iRow);
m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(0);
m_MSFGrid.SetText(str);
m_MSFGrid.SetCellAlignment(4);
for (UINT i=0; i<m_pSet->m_nFields; i++)
{
m_MSFGrid.SetRow(iRow); m_MSFGrid.SetCol(i+1);
m_pSet->GetFieldValue(i, str); // 获取指定字段值,并自动转换成字符串

m_MSFGrid.SetText(str);
m_MSFGrid.SetCellAlignment(4);
}
iRow++;
m_pSet->MoveNext();
}
m_MSFGrid.SetRow(1); m_MSFGrid.SetCol(1);
m_pSet->MoveFirst();

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
上面的初始化函数在View类里运行的很正常,但在我自定义的CGridDlg类里就出现Debug Assertion Failed
File:objcore.cpp Line:43
File:objcore.cpp Line:45
忽略这两个之后,Microsoft基础类应用程序服务已停止工作的对话框


...全文
176 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongnan92 2011-12-16
  • 打赏
  • 举报
回复
大虾,能告诉我怎么在对话框里获得记录集的指针吗
tauke_wang 2011-12-15
  • 打赏
  • 举报
回复
可以在对话框中用编辑框
zhongnan92 2011-12-15
  • 打赏
  • 举报
回复
我改成m_MyView.m_pSet = &m_MyView.GetDocument()->m_mySet之后,还是出现那个断言的错误
Eleven 2011-12-15
  • 打赏
  • 举报
回复
Debug下call stack看函数调用堆栈,找到出错的函数先~
zhongnan92 2011-12-15
  • 打赏
  • 举报
回复
那怎样才能是在view里调用啊?大虾能告诉我怎么在对话框里添加MSFlexGrid控件后,能把数据库里的数据显示在MSFlexGrid控件里?
xqlu2007 2011-12-15
  • 打赏
  • 举报
回复
对话框类是没有GetDocument()这个函数的,只有CView类或其派生类才有。因为你这个调用语语是在对话框类中调用,前面又没有加类限制符,所以默认就在对话框类找这个函数了。要解决的话可在GetDocument()函数调用前加m_MyView.限制符。
xqlu2007 2011-12-15
  • 打赏
  • 举报
回复
(m_MyView.GetDocument())->m_mySet
看下行不行?
yyps 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dsbz2011 的回复:]
我改成m_MyView.m_pSet = &m_MyView.GetDocument()->m_mySet之后,还是出现那个断言的错误
[/Quote]这样也不等同于在view里调用。
zhongnan92 2011-12-14
  • 打赏
  • 举报
回复
关机是执行m_pSet = &GetDocument()->m_mySet这句话时要用视图类里的GetDocument()函数啊
wltg2001 2011-12-14
  • 打赏
  • 举报
回复
CMyView m_MyView;
==========
我很奇怪你为什么非要加个视图类呢?你的CMySet* m_pSet;直接放在对话框类里不行吗?
zhongnan92 2011-12-14
  • 打赏
  • 举报
回复
哦,是这样的。我在CGridDlg 类里定义了一个视图类的成员变量,删去CMyDoc* GetDocument();
还是出现那种问题。下面是我新定义的
class CMyGridDlg : public CDialog
{
// Construction
public:
CMyView m_MyView;
CMyGridDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CMyGridDlg)
enum { IDD = IDD_GRID };
CMSFlexGrid m_MSFGrid;
wltg2001 2011-12-14
  • 打赏
  • 举报
回复
class CGridDlg : public CDialog
{
public:
CMyDoc* GetDocument();

对话框类没这个的,视图类才有。
zhouzhipen 2011-12-14
  • 打赏
  • 举报
回复
对话框有Document吗?
zhongnan92 2011-12-14
  • 打赏
  • 举报
回复
经过调试,发现是执行m_pSet = &GetDocument()->m_mySet这句话时调用下面下面的函数出错
CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
oyljerry 2011-12-14
  • 打赏
  • 举报
回复
单步调试,看具体出错语句,可能控件初始化等有问题

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧