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 ^”

怎么办怎么办

1,主窗体往子窗体传值: 第一种是,在子窗体提供重载构造函数,利用重载构造函数传递值,适用于传值数量比较少; 第二种是,在子窗体中定义一个主窗体对象,然后就可以接收到主窗体的属性值了,适用于传值数量大。 2、从子窗体返回值到主窗体中 利用了子窗体的属性保存子窗体的值,在主窗体中可以访问到子窗体的属性 由于没什么时间,回答简陋了点,希望你可以理解,其实很多问题csdn上都可以找到答案,建议你多上csdn。 推荐文章: 参考技术A 在form的通用部分使用Public来声明变量
在另一个窗体中使用前一个窗体的这个使用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窗体应用程序 窗体间如何传递变量的主要内容,如果未能解决你的问题,请参考以下文章

在delphi中窗体间怎么传递参数

在DELPHI中窗体之间 如何传递数据?

菜鸟求助:c#三个窗体间传递数值

在 MFC 应用程序中托管 Windows 窗体 (C#) (VC++,VS6.0)

如何将命名参数列表传递给打开的 Windows 窗体应用程序

如何让 Windows 窗体将命令传递到控制台/命令行?