VC++Windows窗体应用程序 窗体间如何传递变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++Windows窗体应用程序 窗体间如何传递变量相关的知识,希望对你有一定的参考价值。
跪求详细可行解决方案
首先我创建了windows窗体应用程序的工程
然后自动就生成了主窗口,Form1
然后我又添加了一个窗口Form2
在Form1.h中
首先#include"Form2.h"
......
然后
public ref class Form1 : public System::Windows::Forms::Form
public:
static String^ nameA;
static String^ nameB; //这是那两个需要传递的变量
Form^ fm1; //定义一个fm1
......
然后
public:
Form1(void)
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2(); //在构造函数初
//始化定义了fm1
然后
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
fm2->ShowDialog(); //到这里,点击button1顺利召唤出了Form2
好了,然后问题就出现了
在Form2.h中,声明了一个textBox1
怎么在Form2中对Form1.h里的nameA和nameB赋值呢?!
怎样能将Form2的获取的信息传递到Form1中呢?
如果直接写
Form1::nameA=this->textBox1->Text;
error C2653: “Form1”: 不是类或命名空间名称
error C2065: “nameA”: 未声明的标识符
但如果在Form2.h的开头
也定义
#include"Form1.h"
的话
则又报错
error C2065: “nameA”: 未声明的标识符
那我究竟该怎么实现两个窗体之间的信息传递呢??!
跪求高手解答不胜感激!!!
TO:chenliefen
public:
Form1(void)
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2(this);
这样就报错了.说 error C3673: “KeyBoardgame::Form2”: 类没有复制构造函数
KeyBoardgame是我工程的名字
然后方法二
static String ^nameA;
static String ^nameB;
public ref class Form1 : public System::Windows::Forms::Form
Form1.h里这个位置没错吧
又报错error C3145: “nameA”: 全局或静态变量的类型不能是托管类型“System::String ^”
怎么办怎么办
在另一个窗体中使用前一个窗体的这个使用Public来声明的变量的使用格式如下:
窗体名.变量名
e.g:
在Form1中的声明部分声明a变量如下:
Public a
在Form2中调用这个变量并把它的值传递到变量b上,代码如下:
b=Form1.a
当然也可以把变量用Public声明在公共模块上,这样可以避免输入窗体名,即直接输入该变量名即可调用该变量的值。 参考技术B C#不熟悉,但是在VC++中对于一些少量基本数据(DWORD,int,bool等)可以使用Windows的消息机制,可以由一个窗口把数据当参数投送到另一个窗口,甚至窗口可以是不同进程创建的。所以这种机制也使得无论你的程序用什么语言开发都可以使用,只要是带窗口的。
如果是大量数据并且窗口在同一个进程可以在消息中传递数据地址(如指针、引用等)。
不知道C#支不支持全局变量,否则就更容易传递数据了。
发送消息使用的API是SendMessage或PostMessage你可以搜索下这两个函数的用法,网上很多资料。也不知道C#把这两个函数放在哪个名字空间里
但是这两个函数有个最关键的参数,就是接受消息的窗口的句柄,否则它们怎么知道发到哪里?不过好在窗口句柄在窗口创建后就是不变的。
另有一个参数就是消息号,消息号小于WM_USER(16进制值为0x400)的消息是系统使用的,所以最好不要去使用,用大于0x400,如两个窗口约定使用0x408,0x500等.
还有两个参数可以随便设置了,当然你得用它们来传递你的数据
当发送消息后,接受消息的窗口的消息循环中就可以自由处理了。 参考技术C 用的是什么编译工具?反正不是VC6.0~
不知道你是不是在form2关闭以后,才在form1中获得form2中输入的信息?
那就提供一些思路吧。
在form2中输入的信息,在form2中可以获得的吧?然后在form2中写两个函数,类似:
string form2::getText1()
return text1;
然后在你的button1_Click里面,form2->getText1();
不知道能不能实现呢~ 参考技术D 方法1:
直接将form1 的this 指针传入form2
即 fm1 = gcnew Form2(this);
修改Form的构造函数 Form2(Form1 *this2);
方法2:可以把nameA跟nameB变成全局变量,即放在Form1类外。
首先#include"Form2.h"
......
static String nameA;
static String nameB;
......
public ref class Form1 : public System::Windows::Forms::Form
在Form2里,也在类外
extern static String nameA;
extern static String nameB;
这样子在Form2中直接就可以赋值。 第5个回答 2010-10-26 想简单的传个变量,直接定义成与theApp一样的全局变量。然后就随便你用了。
如果想用指针方式引用,那必须保证窗口类的生存周期。
如何将命名参数列表传递给打开的 Windows 窗体应用程序
【中文标题】如何将命名参数列表传递给打开的 Windows 窗体应用程序【英文标题】:How to pass named parameter list to an opening windows form application 【发布时间】:2013-04-17 02:12:23 【问题描述】:我有一个 Windows 窗体应用程序 让我们称之为B 现在我有另一个应用程序。让我们称之为A
A 将 B 作为一个新进程启动 现在我想将命名参数列表传递给 B 并在 B 中使用它们 我该怎么做?
我的意思是示例参数列表
job:"computer engineer",age:"32",experience:"3 years"
这些参数列表也应该是可选的。有时我可能会传递 5 个参数,有时是 0
我将如何在 B 应用程序启动时读取这些参数
那么这样做的方法是什么?谢谢
c#
【问题讨论】:
【参考方案1】:假设您使用 Process.Start 调用您的“B”进程,以下应该可以工作:
System.Diagnostics.Process.Start(string fileName, string arguments)
并且您的“B”进程主线程应该接受一个数组来容纳可能的参数,然后您可以对其进行迭代。
static void Main(string[] args)
//your code to decipher arguments here
【讨论】:
是的,我将使用进程启动。但我怎样才能将它们读取为命名参数? 我不确定这里的最佳做法,但也许这个建议可以激发更好的响应或让您开始走上正确的道路。如果您将参数作为字符串传递(例如“job: CE”“age: 32”“exp: 3 years”),那么您可以运行一个 switch 语句来评估字符串的前三个字符以将其指向正确的方向。显然这不是最优雅的解决方案(它迫使您在与实际参数相同的字符串中硬编码 3 个字母代码),但它有可能实现您的目标。 您的 switch 语句需要进入一个循环,该循环遍历您的数组以解析每个参数。【参考方案2】:我可以想到两种方法。
首先是使用命令行参数。如果您将进程(从命令行)称为:
your.exe -job "computer engineer" -age 32 -experience "3 years"
然后,您可以通过在进程的启动选项中设置arguments
在您的代码中复制它。然后,您必须设置您的流程来查找所有这些标志,记住它们都可以是可选的,等等。
第二个选项(这更灵活一点)是创建一个文件来保存您传递的值,并从您启动的进程中读取它。您可以制作此 XML 或直接值。
编辑:这是第一个选项的示例
Process p = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "your exe path";
startInfo.Arguments = "your argument list";
p.StartInfo = startInfo;
p.Start();
我不想告诉你如何格式化你的参数字符串;这应该由您决定。但是,我会推荐a library 使用它可能会使接收端的解析更容易一些。
【讨论】:
我将使用这个来启动:System.Diagnostics.Process.Start。你能在你的帖子中举个例子吗谢谢 @MonsterMMORPG 查看我的编辑,并查看库链接以获取解析参数的一些帮助。以上是关于VC++Windows窗体应用程序 窗体间如何传递变量的主要内容,如果未能解决你的问题,请参考以下文章
在 MFC 应用程序中托管 Windows 窗体 (C#) (VC++,VS6.0)