现在文档类中有字符串数组变量strappname,基于数据表的对话框CRsCgDlg中有字符串数组变量appname[10],对话框类是通过视图类中双及我画的矩形来出现的,现在我想在对话框中调用文档类中的strappname变量和appname进行值交换,如何用代码来实现?这是在矩形中调用对话框的代码,供参考
            CClientDC dc(this);                        if(shape->IsRectangle())
{
CRsCgDlg dlg;
this->ShowWindow(SW_HIDE);
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}

解决方案 »

  1.   

    这是两个对话框交换数据的例子
    //1:利用这个方法直接给CFatherDlg中的控件赋值
    //((CFatherDlg*)(CDialog*)GetParent())->SetDlgItemInt(IDC_EDIT_VALUE,m_nValue);
    //2:直接从父对话框中获得变量,传到子对话框
    //((CFatherDlg*)(CDialog*)GetParent())->GetDlgItem(IDC_EDIT_VALUE)->GetWindowText(m_strValue);m_strValue是CSonDlg的成员变量;可以直接看到变化;
    //m_nYear=((CFatherDlg*)(CDialog*)GetParent())->m_nValue
      

  2.   

    请: memory_xj再帮我看看,详细的在我和你讨论多的地方有一份。如有发现者,可以提供意见。不行呀,我的对话框和视图关系如上贴所示,现在有一个怪现象,只要我在CRsCgDlg头文件中加上: CKnowModelView  *m_pView;并且后面作了m_pView = (CKnowModelView *)pParent;
    在CRsCgDlg中马上出现六个错误,而且将它注释掉了之后,这六个错误是无法消除的,这是怎么回事?将这个对话框代码贴出来你帮我看看:
    class CCustomRs : 
    public CADORecordBinding
    {
    ......};//
    // TODO : These definitions should be moved to the resource header.
    //
    /////////////////////////////////////////////////////////////////
    // CRsCgDlg dialogclass CRsCgDlg : 
    public CDialog, 
    public CCustomRs
    {
    // serializepublic:
    CRsCgDlg(CWnd* pParent = NULL);
    ~CRsCgDlg(); BOOL OnInitDialog();// Dialog Data
    //{{AFX_DATA(CRsCgDlg)

    //}}AFX_DATA
    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CRsCgDlg)
    public:
    virtual void Serialize(CArchive& ar);
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    public:
    int s;

    CString appnumber[20];
        CString appname[20];
    CString appcontext[20];
    CString appsubject[20];
    public:
    CKnowModelView  *m_pView;protected:
    void GenerateError(HRESULT hr, PWSTR pwszDescription); _RecordsetPtr m_pRs;
    _ConnectionPtr m_DBCnt;
       //CStringArray strappnumber,strappname,strappcontext,strappsubject;
    /* struct astru
    {
    // char appnumber[50];
     char appname[50];
     char appcontext[100];
     char appsubject[50];
    }appstru[10];*/ //_ConnectionPtr m_cNt; CString m_strConnection;
    CString m_strCmdText; // Generated message map functions
    //{{AFX_MSG(CRsCgDlg)
    ......
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };
    实现文件中:
    CRsCgDlg::CRsCgDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CRsCgDlg::IDD, pParent)
    {
    ......
    m_pRs = NULL;
    m_DBCnt=NULL;
    s=0;
      m_pView = (CKnowModelView *)pParent;


    }
    我都烦死了,帮帮我吧。
      

  3.   

    我按你说的作了,错误还是内存不能为读,代码如下(原来可以执行的)void CRsCgDlg::OnSavearecord() 
    {
       
    // TODO: Add your control notification handler code here
    //two
        m_pView->GetDocument()->strappnumber.RemoveAll();  //将数组清空
        m_pView->GetDocument()->strappname.RemoveAll(); 
        m_pView->GetDocument()->strappcontext.RemoveAll();  
        m_pView->GetDocument()->strappsubject.RemoveAll(); m_pRs=NULL;

    try
    {
       HRESULT hr=NOERROR;
    if(FAILED(hr=m_pRs.CreateInstance(__uuidof(Recordset))))
    _com_issue_error(hr); m_pRs->Open("AppearKnow",(LPCTSTR)m_strConnection, adOpenStatic, 
    adLockOptimistic, adCmdTable);//open database and table      int i=0;
           _variant_t Holder;   while(!m_pRs->EndOfFile)
      {
      //fetch fields value put to struct appstru
    Holder=m_pRs->GetCollect("number");
    if(Holder.vt!=VT_NULL)
        m_pView->GetDocument()->strappnumber.Add((char*)(_bstr_t)Holder); //将CString添加至strappnumber中。 // appnumber[i]=(char*)(_bstr_t)Holder;        Holder=m_pRs->GetCollect("name");
    if(Holder.vt!=VT_NULL)
        m_pView->GetDocument()->strappname.Add((char*)(_bstr_t)Holder); //将CString添加至strappnumber中。 //appname[i]=(char*)(_bstr_t)Holder;        Holder=m_pRs->GetCollect("context");
    if(Holder.vt!=VT_NULL)
        m_pView->GetDocument()->strappcontext.Add((char*)(_bstr_t)Holder); //将CString添加至strappnumber中。 // appcontext[i]=(char*)(_bstr_t)Holder;
        

    Holder=m_pRs->GetCollect("subject");
        m_pView->GetDocument()->strappsubject.Add((char*)(_bstr_t)Holder); //将CString添加至strappnumber中。          //appsubject[i]=(char*)(_bstr_t)Holder;
    m_pRs->MoveNext();
    ++i;   } 
      //strappnumber[0]=appnumber[0];
      s=m_pRs->GetRecordCount();      // AfxMessageBox(appnumber[0]);   
         m_pRs->Close();
    }
    catch(_com_error& e)
    {
    MessageBox(e.ErrorMessage());
    return;
    }
           AfxMessageBox(appnumber[0]);/* for(int i=0;i<s;i++) 
    {
        m_pView->GetDocument()->strappnumber.Add(appnumber[i]); //将CString添加至strappnumber中。
        m_pView->GetDocument()->strappname.Add(appname[i]); 
        m_pView->GetDocument()->strappcontext.Add(appcontext[i]); 
        m_pView->GetDocument()->strappsubject.Add(appsubject[i]); 
    }*/
        }
      

  4.   

    问题出在这一句上:      m_pView->GetDocument()->strappnumber.GetAt(0); 
    我用一个button映射就这一句出现的错误和上面一段的错误提示是一样,这是不是m_pView的相关调 用出了问题,我用的多文档,这个视图的调用中间的关节上有没有问题?
      

  5.   

    调试句在:004049b5 mov ecx,[eax+40]
      

  6.   

    呵呵,有可能是你的文档类中的m_pView->GetDocument()->strappnumber中根本就没有元素啊。
      

  7.   

    这个问题再想想,顺便帮我想想在VC/MFC 图形处理/算法 中的这一贴:点上面的图形怎么得到显示与它相关的图形呢?
      

  8.   

    可以这样,直接得到文档类的指针,而不用视图指针过渡.我试过了可以的。1)在对话框类中声明一个CYouDocument *pDoc; //注意加上文档类头文件
    2)在对话框的OnInitDialog()中这样:注意加上文档类头文件
    CRsCgDlg::CRsCgDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CRsCgDlg::IDD, pParent)
    {
      POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
      CDocTemplate * pTemplate = AfxGetApp()->GetNextDocTemplate(pos);
      POSITION pos1 = pTemplate->GetFirstDocPosition();
      CTest1Doc *pDoc = (CTest1Doc *)pTemplate->GetNextDoc(pos1);
    }3)在OInitDialog()中可以这样:
    BOOL CRsCgDlg::OnInitDialog()
    {
      CDialog::OnInitDialog();
      for(int i=0;i<=m_pDoc->strappnumber.GetSize();i++)
     {
         CString sTemp = m_pDoc->strappnumber.GetAt(i); 
         appnumber[i] = sTemp;//将CString保存至字符数组中。
     }
      return TRUE;
    }其它类似
      

  9.   

    呵呵,2)写法有误,是改写构造函数而不是OnInitDialog()
      

  10.   

    你可以在文档中试着向strappnumber添加一个CString,如可以在文档类的构造函数中
    strappnumber.Add("test");
    而在CRsCgDlg类的构造函数中:
    POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
      CDocTemplate * pTemplate = AfxGetApp()->GetNextDocTemplate(pos);
      POSITION pos1 = pTemplate->GetFirstDocPosition();
      CKnowModelDoc *pDoc = (CKnowModelDoc *)pTemplate->GetNextDoc(pos1);
      CString test = pDoc->strappnumber.GetAt(0);
      AfxMessageBox(test);如果是"test"就是正确的
      

  11.   

    这个没问题,对话框反映的是“test"
      

  12.   

    仔细检查你的数据库打开和操作语句,非常抱歉,我不能完全帮你。execuse me!!
      

  13.   

    这个说明在这儿文档指针是调用过来了,在我的void CRsCgDlg::OnSavearecord() 和void CRsCgDlg::OnFiledatatotable()里应该可以调用文档指针对它的变量进行操作呀,对话框中的变量是有值的呀,为什么出现那种内存问题呢?
      

  14.   

    啊,数据源和程序放在一块,在控制面板中用我的数据库表注册一个数据源ConKnowA就行了,数据库操作我试了很多次,没有问题的呀
      

  15.   

    啊,配个用户DSN,选择我的那个数据库就行了
      

  16.   

    POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
      CDocTemplate * pTemplate = AfxGetApp()->GetNextDocTemplate(pos);
      POSITION pos1 = pTemplate->GetFirstDocPosition();
      CKnowModelDoc *pDoc = (CKnowModelDoc *)pTemplate->GetNextDoc(pos1);哈哈应该是:
    POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
      CDocTemplate * pTemplate = AfxGetApp()->GetNextDocTemplate(pos);
      POSITION pos1 = pTemplate->GetFirstDocPosition();
      m_pDoc = (CKnowModelDoc *)pTemplate->GetNextDoc(pos1); //这句错误了我上面的例子只是个例子,试想你不将m_pDoc赋值,这个值当然不能用了。sorry !
      

  17.   

    按我所说的修改一下就可以了,我执行将数据库的数据读至文档类中,没有问题,好了,我要下线了,good lucky!
      

  18.   

    在void CRsCgDlg::OnFiledatatotable() 中这段代码执行时出错for(int i=0;i<=m_pDoc->strappnumber.GetSize();i++)
     {
         CString sTemp1= m_pDoc->strappnumber.GetAt(i); 
         appnumber[i] = sTemp1;//将CString保存至字符数组中。    CString sTemp2 = m_pDoc->strappname.GetAt(i); 
         appname[i] = sTemp2;     CString sTemp3 = m_pDoc->strappcontext.GetAt(i); 
         appcontext[i] = sTemp3;     CString sTemp4 = m_pDoc->strappsubject.GetAt(i); 
         appsubject[i] = sTemp4; }
    错误信息:Debug Assertion Failed
    program D:\tj\KnowModel32\Debug\KnowModel.exe
    File:afxcoll.inl
    Line: 222
    调试行错误:77F813B2
    你找一找,然后看加入数据库有没问题
      

  19.   

    应该是for(int i=0;i < m_pDoc->strappnumber.GetSize();i++){}。不能用<=
      

  20.   

    void CRsCgDlg::OnSavearecord()  //出错
    {......
    for(int i=0;i<s;i++)  //最后一个for中语句明显有错误,应该为:
    {
       m_pDoc->strappnumber.Add(appnumber[i]);
       m_pDoc->strappname.Add(appname[i]);
       m_pDoc->strappcontext.Add(appcontext[i]);
       m_pDoc->strappsubject.Add(appsubject[i]); }
    }上面的修改完后我都调试通了,如果还有什么问题,将KnowModel.ncb删除重新编译一遍
      

  21.   

    抱歉,还有:
    CRsCgDlg::CRsCgDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CRsCgDlg::IDD, pParent)
    {
    m_strConnection = _T("Provider=MSDASQL.1;Persist Security Info=False;Data Source=ConKnowA");
    m_strCmdText = _T("AppearKnow"); m_pRs = NULL;
    m_DBCnt=NULL;
    s=0; // POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
     // CDocTemplate * pTemplate = AfxGetApp()->GetNextDocTemplate(pos);
     // POSITION pos1 = pTemplate->GetFirstDocPosition();
     // m_pDoc = (CKnowModelDoc *)pTemplate->GetNextDoc(pos1);
    // AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()
    m_pDoc = (CKnowModelDoc *)((CMainFrame *)(AfxGetApp()->GetMainWnd()))->MDIGetActive()->GetActiveView()->GetDocument(); // 应该用这句!!!!
      int iii = m_pDoc->strappnumber.GetSize();

    //{{AFX_DATA_INIT(CRsCgDlg)
    m_strDlgnumber = _T("");
    m_strDlgname = _T("");
    m_strDlgcontext = _T("");
    m_strDlgsubject = _T("");
    //}}AFX_DATA_INIT
    }
      

  22.   

    向数据库中写入的操作语句也有误:
    void CRsCgDlg::OnFiledatatotable() 
    {
    ......
     for( int m=0;m<s;m++)
    {
    m_pRs->AddNew();
        m_pRs->PutCollect("number",_variant_t(appnumber[m]));
        m_pRs->PutCollect("name",_variant_t(appnumber[m]));
        m_pRs->PutCollect("context",_variant_t(appcontext[m]));
        m_pRs->PutCollect("subject",_variant_t(appsubject[m]));
    m_pRs->Update();
    }
    ......
    }
      

  23.   

    多谢了。
     现在我还是和昨天说的一个地方出错,就是你写的文档类的字符变量加进对话框类的变量哪个for语句,提示错误和昨天一样。
      现在我在找.ncb文件,在debug里没看到
      

  24.   

    是个.rar压缩文件,解压后打开.dsw文件就可以了。是不是文件损坏了?
      

  25.   

    打开后还是一个页面文件,大小有2.9M但是用VC什么文件都发现不了
      

  26.   

    呵呵,thank you.有机会我们再合作