定义了两个基于对话框的类,问题在调用的时候出现了问题,具体描述如下:
第一个类个关键代码:
void CGradeModify::OnBtnTest() 
{
int index;
index=m_stuCollege.GetCurSel();
m_stuCollege.GetLBText(index,m_strCollege);
index=m_stuClass.GetCurSel();
m_stuClass.GetLBText(index,m_strClass);
CTestDlg m_testDlg;
// m_testDlg.AddDataToList();
if(m_testDlg.DoModal()!=IDOK)
{
return ;
}
m_pRec1.CreateInstance(_uuidof(Recordset));
m_pRec4.CreateInstance(_uuidof(Recordset));
CString strSql;
CString strTemp;
_variant_t var;
CString str;
index=0;
try
{
strSql.Format("select * from Info_stu where collegename='%s'and classname='%s'",m_strCollege,m_strClass);
m_pRec1->Open(strSql.AllocSysString(),
theApp.m_pConn.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
while(!m_pRec1->adoEOF)
{
var=m_pRec1->GetCollect("sno");
strTemp=(LPCTSTR)_bstr_t(var);

strSql.Format("select * from Info_all where sno='%s'",strTemp);
m_pRec4->Open(strSql.AllocSysString(),
theApp.m_pConn.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);

long lData[5];
var=m_pRec4->GetCollect("sno");
str=(LPCTSTR)_bstr_t(var);

var=m_pRec4->GetCollect("ziyu");
lData[0]=long(var);

var=m_pRec4->GetCollect("deyu");
lData[1]=long(var);

var=m_pRec4->GetCollect("tiyu");
lData[2]=long(var);

var=m_pRec4->GetCollect("fujiafen");
lData[3]=long(var);

var=m_pRec4->GetCollect("sum_all");
lData[4]=long(var);
                          // 下面这个函数调用出现了问题
m_testDlg.AddDataToList(str,lData[0],lData[1],lData[2],lData[3],lData[4],index);
     m_pRec1->MoveNext();
index++;
m_pRec4->Close();
}
 m_pRec1->Close();
  }
catch(_com_error e)
{
AfxMessageBox(e.Description());
return ;
}

}
这段代码的意思是从相关的数据库中选择适合条件的数据,调用AddDataToList函数添加到CListCtrl空间中,这个调用出现了问题
被调用的函数代码:
void CTestDlg::AddDataToList(CString stuNo,long strDeyu,long strTiyu,long Ziyu,long strFujiafen,long strZfen, int index)
{ m_InfoList.DeleteAllItems();
m_InfoList.InsertItem(index,stuNo);
m_InfoList.SetItemText(index,1,"strDeyu");
m_InfoList.SetItemText(index,2,"strTiyu");
m_InfoList.SetItemText(index,3,"Ziyu");
m_InfoList.SetItemText(index,4,"strFujiafen");
m_InfoList.SetItemText(index,5,"strZfen");
}
说明:m_InfoList是一个绑定为value类型的空间变量,即CListCtrlvoid CTestDlg::AddDataToList(CString stuNo,long strDeyu,long strTiyu,long Ziyu,long strFujiafen,long strZfen, int index)
{ m_InfoList.DeleteAllItems();
m_InfoList.InsertItem(index,stuNo);
m_InfoList.SetItemText(index,1,"strDeyu");
m_InfoList.SetItemText(index,2,"strTiyu");
m_InfoList.SetItemText(index,3,"Ziyu");
m_InfoList.SetItemText(index,4,"strFujiafen");
m_InfoList.SetItemText(index,5,"strZfen");
}
说明:m_InfoList是一个绑定为value类型的空间变量,即CListCtrl的绑定变量,注意这里的所有代码的语法是没有任何问题的,问题出现在运行的时候,还有就是这两个类是基于对话框的,而列表对话框上面的第二个类中定义,有m_InfoList表示。跟踪显示m_infolist没有有效的值,不知道这是为什么,请各位网上的高手交流经验。希望也有高手和我QQ交流:416197844.希望能彼此交流经验.

解决方案 »

  1.   

    如果你知道 变量位于类的偏移......
    比如类C中有个成员变量 int a; 知道位于偏移 0x4
    则 
    int b = *(int*)(&C + 0x4);
    就能访问了.....
    公有,私有的都无所谓.其次控件变量 一半我绑定为控件类型.....如果绑定为value 查看是否有调用
    Updatedata  参数TRUE 把控件的值传给 变量,
    参数 FALSE 取出变量的值到控件.
      

  2.   

    if(m_testDlg.DoModal()!=IDOK) 

    return ; 

    ==
    你的这个m_testDlg是用DoModal调出来的,在这个函数结束后,这个对话框中的资源已经被释放掉了。
    因此,在你调用这个对话框的AddDataToList函数时,由于该函数需要操作对话框的列表控件,但此时控件对象已经被释放,自然会失败。
    看样子你这个testDlg需要用非模式方式运行。
      

  3.   

    2楼的说法是正确的!对话框的资源生存期和m_testDlg这个变量的生存期是不一样的!
      

  4.   

    不是这样的问题,当我把domodal放到下面的时候,还是一样的问题,是不是如果调用的对话框双方都不是系统的对话框,其数据是不能传输的?