阅读:1476回复:11
问个最初级的问题,多个窗体之间的变量、过程访问?
就是说dialog1和dialog2
dialog1中像这样执行:if(x=1){执行dialog2.button1click事件} 同时button1click事件中又使用了dialog1中的变量。请教各位专家! |
|
沙发#
发布于:2005-03-26 13:48
把要共享的指令数据放在共享段中....
|
|
|
板凳#
发布于:2005-03-26 18:53
我是初学者,能否简单举例说明,谢谢!
还有在机器上运行程序的时候提示信息如下:Communicatioin:File dlgdata.cpp,Line 52;标题栏:Assertion Failed! 请问如何解释,还有我如何能知道程序的行数,我的程序是几个对话框,但是程序里没有dlgdata.cpp文件! |
|
地板#
发布于:2005-03-27 14:45
共享的变量声明为public或定义为全局变量,
Assertion Failed 检查你的 ASSERT语句,说明运行中某些条件未满足 |
|
|
地下室#
发布于:2005-03-27 16:13
就是说dialog1和dialog2 dialog2是无模式的还是模式的?窗体已经创建了吗? |
|
5楼#
发布于:2005-03-28 13:38
你的问题分两种情况:
情况一:在第一个对话框关闭时取得变量值 第一个窗口中操作如下代码,可实现(如点击某按钮) 第一个窗口的m_strFirst变量可获取第二个窗口的m_strName变量值 CNEWDLG dlg; if (dlg.DoModal() == IDOK) { m_strFirst = dlg.m_strName; } AfxMessageBox(m_strFirst); 情况二:两个对话框都存在时互相取值 方法为: 第一个对话框通过#include对方头文件,实现第一个对话框成员变量向第二个对话框成员 变量的赋值; 而第二个对话框通过在其头文件中引用,实现第二个对话框成员变量向第一个对话框成员 变量的赋值。 设两个对话框类为CFirstDlg 和 CSecondDlg CFirstDlg在其头文件中#include \"SecondDlg.h\",在其中定义成员变量: CSecondDlg* m_hFirstDlg; 在CFirstDlg的实现文件中,在实现部分创建对话框,同时实现CFirstDlg成员变量向CSecondDlg成员变量的赋值,也可以调用CSecondDlg的成员函数。 而在CSecondDlg的头文件的开始处,不能再反过来#include,因为如果你写入 #include \"FirstDlg.h\",将造成重复引用,编译会出错。//这可能就是你不能实现的原因 解决方法为 在CSecondDlg的头文件的开始处,写上Class CFirstDlg; //import 使用引用(import)的方法,引入第一个单元文件,这样编译就不会出错,同时就可以实现相反方向的成员变量赋值。 |
|
|
6楼#
发布于:2005-03-28 13:44
还有也要看你的实际情况了,
如arthurtu言,是模态还是非模态。 在你if(x)时,第二个对话框是已经创建好,还是在此语句之前创建的。 如你方便,可将你的具体需求和你出问题的代码发给我hasis@126.com |
|
|
7楼#
发布于:2005-03-29 10:22
窗体是模态的,意思就是窗体A、B;
//A.cpp// #include \"b.h\" int data; if(串口来数据) { 窗口数据传给data; if(窗体B已经打开) 执行b.fuction(data); } 如何实现? b.function(int bdata) { 能否确保data传给了bdata? } |
|
8楼#
发布于:2005-03-30 00:34
[quote]就是说dialog1和dialog2 dialog2是无模式的还是模式的?窗体已经创建了吗? [/quote] 有模式 消息只能在一个循环中。 |
|
|
9楼#
发布于:2005-03-30 16:26
消息只能在一个循环中何解?
|
|
10楼#
发布于:2005-03-31 17:15
同一进程中的各个线程尚且共享数据\\代码段,各个窗体共享更没问题.(当然,线程有数据同步问题,TLS,COM接口的共享...,都是要注意的,可我估计跟你没关系).
你要把代码贴出来,好让人看看问题在哪里. 另外,\"执行dialog2.button1click事件\"违反了Windows的消息驱动的初衷.这样写不是好的代码. |
|
|
11楼#
发布于:2005-03-31 19:59
Cnewdilog g_aircon; //LonRead是在定时器中建立的一个线程,我这样做为什么要么运行出错,关闭应用程序 要么根本不执行singleaircon() //singleaircon是newdialog窗体中的数据处理函数 DWORD WINAPI CMainDlg::LonRead(LPVOID lpArg) { // Route the method to the actual object CMainDlg* pThis = reinterpret_cast<CMainDlg*>(lpArg); return pThis->LonRead(); } DWORD CMainDlg::LonRead() { if(pc104interval) { for(int sss=0;sss<100;sss++) g_aircon.airdata[sss]=data[sss+0x80*j]; if(g_aircon.m_hWnd!=NULL) { g_aircon.singleaircon(); } } pc104interval=FALSE; return 0; |
|