MFC从一个自定义类访问另一个自定义窗口类的ListBox
MFC对话框程序,主对话框类叫CRouteDlg(classCRouteCalDlg:publicCDialogEx),用于计算的自定义类叫CRouteCalculato...
MFC对话框程序,主对话框类叫CRouteDlg(class CRouteCalDlg : public CDialogEx),用于计算的自定义类叫CRouteCalculator(非对话框类,纯粹用于计算),子对话框类叫CTableSelect(class CTableSelect : public CDialogEx,该类为自定义,包含一个ListBox控件,绑定变量TableList,DDX_Control(pDX, IDC_TABLELIST, TableList))。
在主对话框中生成就算类对象,在计算类对象中生成子对话框类对象,并且需要在计算类中对子对话框中的TableList控件进行AddString操作。
程序想实现的功能是,在计算类对象中通过ADO连接到数据库,获取数据库所有表名,在子对话框的ListBox中展示,供用户选择需要打开的表。
遇到的问题:运行时出现Debug Assertion Failed!错误在afxwin2.inl第810行。如下:
_AFXWIN_INLINE int CListBox::AddString(LPCTSTR lpszItem)
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }
求助!
CTableSelect::CTableSelect(CStringList* pListTableName)
{
for(int i = 0;i<pListTableName->GetCount();i++)
{
CString strtablename;
strtablename = pListTableName->GetAt(pListTableName->FindIndex(i));
AfxMessageBox(strtablename);//此处可检查正常
TableList.AddString(strtablename);//这里还是相同错误!!!
}
}
下面是调用:
CTableSelect TableSelectDlg(pListTableName);
TableSelectDlg.DoModal(); 展开
在主对话框中生成就算类对象,在计算类对象中生成子对话框类对象,并且需要在计算类中对子对话框中的TableList控件进行AddString操作。
程序想实现的功能是,在计算类对象中通过ADO连接到数据库,获取数据库所有表名,在子对话框的ListBox中展示,供用户选择需要打开的表。
遇到的问题:运行时出现Debug Assertion Failed!错误在afxwin2.inl第810行。如下:
_AFXWIN_INLINE int CListBox::AddString(LPCTSTR lpszItem)
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); }
求助!
CTableSelect::CTableSelect(CStringList* pListTableName)
{
for(int i = 0;i<pListTableName->GetCount();i++)
{
CString strtablename;
strtablename = pListTableName->GetAt(pListTableName->FindIndex(i));
AfxMessageBox(strtablename);//此处可检查正常
TableList.AddString(strtablename);//这里还是相同错误!!!
}
}
下面是调用:
CTableSelect TableSelectDlg(pListTableName);
TableSelectDlg.DoModal(); 展开
展开全部
子对话框还未生成,就对其控件进行操作是行不通的,修改各类变量创建顺序
更多追问追答
追问
源代码补充到了问题中,麻烦帮我分析一下!谢谢!
追答
代码中TableSelectDlg.DoModal()会调用CreateDlgIndirect,而后者会调用AfxDlgProc,然后在AfxDlgProc中调用OnInitDialog。
如果你把listbox的初始化代码放在CTableSelect的OnInitDialog中,按照上面的调用顺序,你会发现listbox没有初始化你就执行了AddString了。
展开全部
应该是窗口句柄无效所致,AddString的时候,列表框所在对话框必须是有效的窗口.
追问
请详述!如何解决?
追答
必须先创建listbox所在的对话框查看才可以调用AddString函数,如果仅仅是声明了istbox所在的对话框对象后就调用AddString函数是不行的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先创建子对话框
追问
源代码补充到了问题中,麻烦帮我分析一下!谢谢!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询