求助:MFC单文档多视图变量传递出错

Hi_Jacky123 2020-05-29 08:42:23
本人编了一个单文档多视图的程序,需要从一个View中传递产量到另一个View中,按照咱们CSDN推荐的方法,使用***Doc赋值中间变量传递,尝试了一下出错了: (这是CSDN中推荐的方法)在单文档多视图的程序设计中,多个视图之间的数据传递的方式很多,这里先只写最简单的一种,在任意一个View中写:XXXDoc* pDoc = (XXXDoc*)GetDocument();来获得Doc类的指针,既然在任意一个View类里都可以这样获取到Doc类中的成员变量,那么就可以用Doc类来作为数据传递的一个中间类!比如,有类A,B,C,其中B为Doc类,A和C为View类,假设A中的数据a要给C中的数据c,可以先在 B中创建一个public的的变量b,然后在,类A中要进行数据传输的地方写:BDoc* pDoc = (BDoc*)GetDocument();,pDoc->b = a;再在类C中写:BDoc* pDoc = (BDoc*)GetDocument(); c = pDoc->b;这个时候,a就已经成功的给了c啦! 检验了一下,我在FirstView的OnDraw()函数中调用***Doc中变量,使用pDoc->使能够提示***Doc中定义的中间传递变量,而且软件编译没错,但是运行出错,错误如图所示。 我知道是c=pDoc->b的问题,因为我改成pDoc->b=c赋值语句,错误就变成“内存不能为write”了。 请大神帮忙,十分感谢!
...全文
195 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2020-06-10
  • 打赏
  • 举报
回复
你直接定义 全局 变量 更方便 , C++ 类 就是要 把 数据 封装 起来,b=paview->a 这个 a 就暴露了
蒋晟 2020-06-09
  • 打赏
  • 举报
回复
话说内建的CDocument::UpdateAllViews不用的么……把需要通知的数据广播过去,各个视图自己在OnUpdate里写处理代码
Hi_Jacky123 2020-05-30
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903的回复:

CWinApp *pApp = AfxGetApp();
POSITION PosDocTemplate = pApp->GetFirstDocTemplatePosition();
while(PosDocTemplate)
{
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate( PosDocTemplate );

POSITION PosDoc = pDocTemplate->GetFirstDocPosition();
while(PosDoc)
{
CDocument* pDoc = pDocTemplate->GetNextDoc( PosDoc );

POSITION PosView = pDoc->GetFirstViewPosition();
while(PosView)
{
CView* pView = pDoc->GetNextView( PosView );

}
}
}

这是推荐的第二种方法吧,就是遍历所有view,能否详细介绍一下?这一段用在哪里?Doc中的GetFirstViewPosition()吗?我没看到赋值语句啊,那怎么传递变量呢?不懂哦…
Hi_Jacky123 2020-05-30
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster的回复:
不是 单文档 吗?
单文档多视图,多个view的
schlafenhamster 2020-05-30
  • 打赏
  • 举报
回复
如:
void CFileView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
if (GetDocument()->IsKindOf(RUNTIME_CLASS(CPViewDoc)))
theApp.SetStatusBarText(((CPViewDoc *)GetDocument())->szStatusMessage);
else
theApp.SetStatusBarText(((CViewfileDoc *)GetDocument())->szStatusMessage);
}
schlafenhamster 2020-05-30
  • 打赏
  • 举报
回复
不是 单文档 吗?
Hi_Jacky123 2020-05-30
  • 打赏
  • 举报
回复
回复留言的热心朋友。 今天一天试了CSDN推荐的两种方法(一种是利用Doc中转,另一种是遍历所有视图类),都没有成功。 突然想尝试一下直接调用指针:在bview中直接使用aview,居然实现了。就是在bview的OnDraw()中,使用aView* paview=(aView*)pMain->GetActiveView();然后用b=paview->a居然把a的值传递给b了! 实在不明白,如果直接调用就能实现,大家为何费神费力要转来转去?请大神明示
zgl7903 2020-05-29
  • 打赏
  • 举报
回复

CWinApp *pApp = AfxGetApp();
POSITION PosDocTemplate = pApp->GetFirstDocTemplatePosition();
while(PosDocTemplate)
{
CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate( PosDocTemplate );

POSITION PosDoc = pDocTemplate->GetFirstDocPosition();
while(PosDoc)
{
CDocument* pDoc = pDocTemplate->GetNextDoc( PosDoc );

POSITION PosView = pDoc->GetFirstViewPosition();
while(PosView)
{
CView* pView = pDoc->GetNextView( PosView );

}
}
}



15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧