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();
展开
 我来答
faketamendie
2013-12-21 · 超过55用户采纳过TA的回答
知道小有建树答主
回答量:164
采纳率:0%
帮助的人:141万
展开全部
子对话框还未生成,就对其控件进行操作是行不通的,修改各类变量创建顺序
更多追问追答
追问
源代码补充到了问题中,麻烦帮我分析一下!谢谢!
追答
代码中TableSelectDlg.DoModal()会调用CreateDlgIndirect,而后者会调用AfxDlgProc,然后在AfxDlgProc中调用OnInitDialog。
如果你把listbox的初始化代码放在CTableSelect的OnInitDialog中,按照上面的调用顺序,你会发现listbox没有初始化你就执行了AddString了。
归悦欣cf
2013-12-21 · TA获得超过1444个赞
知道大有可为答主
回答量:4250
采纳率:59%
帮助的人:1331万
展开全部
应该是窗口句柄无效所致,AddString的时候,列表框所在对话框必须是有效的窗口.
追问
请详述!如何解决?
追答
必须先创建listbox所在的对话框查看才可以调用AddString函数,如果仅仅是声明了istbox所在的对话框对象后就调用AddString函数是不行的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
豪放又安静丶饼干438
2013-12-21 · 超过37用户采纳过TA的回答
知道小有建树答主
回答量:191
采纳率:0%
帮助的人:44.9万
展开全部
先创建子对话框
追问
源代码补充到了问题中,麻烦帮我分析一下!谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式