现在文档类中有字符串数组变量strappname,基于数据表的对话框CRsCgDlg中有字符串数组变量appname[10],对话框类是通过视图类中双及我画的矩形来出现的,现在我想在对话框中调用文档类中的strappname变量和appname进行值交换,如何用代码来实现?这是在矩形中调用对话框的代码,供参考
CClientDC dc(this); if(shape->IsRectangle())
{
CRsCgDlg dlg;
this->ShowWindow(SW_HIDE);
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
CClientDC dc(this); if(shape->IsRectangle())
{
CRsCgDlg dlg;
this->ShowWindow(SW_HIDE);
dlg.DoModal();
this->ShowWindow(SW_SHOW);
}
//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
在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;
}
我都烦死了,帮帮我吧。
{
// 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]);
}*/
}
我用一个button映射就这一句出现的错误和上面一段的错误提示是一样,这是不是m_pView的相关调 用出了问题,我用的多文档,这个视图的调用中间的关节上有没有问题?
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;
}其它类似
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"就是正确的
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 !
{
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
你找一找,然后看加入数据库有没问题
{......
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删除重新编译一遍
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
}
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();
}
......
}
现在我还是和昨天说的一个地方出错,就是你写的文档类的字符变量加进对话框类的变量哪个for语句,提示错误和昨天一样。
现在我在找.ncb文件,在debug里没看到