我用vc++创建了一个windows窗体应用程序
自动生成了主窗口Form1
然后我又添加了一个Form2
想实现运行之后在Form1里面点一个按钮,然后Form2就弹出来了
让用户录入一些信息(俩名字而已)
录入结束之后Form2就没用了就关了
但是当然信息需要传递到Form1里面
现在主要的问题就是:
Form1.h和Form2.h我不会建立联系
怎么建立联系呢?
我在Form2.h的开头写了#include"Form1.h"
然后在Form2.h中写的时候
Form1::nameA=this->textBox1->Text;
Form1::nameB=this->textBox2->Text;
貌似没什么问题了(传递信息这一步)
但是怎么在Form1.h中建立与Form2.h的联系呢?
当我也在Form1.h的开头写上#include"Form2.h"的时候
报错:fatal error C1014: 包含文件太多 : 深度 = 1024
请问这个头文件包含什么的到底怎么包含,包含到哪?
然后我想用户点击"新游戏"的时候Form2弹出来,怎么实现
private: System::Void 新游戏ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
}
大括号里怎么写?
真心求教,越详细越好,在线等谢谢`
23 个解决方案
#1
啊啊好久了等的
#2
不是还没人会吧?
#3
#4
form2就是个对话框类,在form1中建立一个form2的类对象就可以吧。form1中建立一个成员函数onbutton{}在函数里建立类对象
#5
1. 头文件
#include "Form2.h"
2. 声明
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
#include "Form2.h"
2. 声明
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
#6
5L
首先谢谢你,按你的方法我添加的Form2出来了.
在Form1.h里面
1. 头文件
#include "Form2.h"
然后2. 声明是不是该写上
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form^ fm1;
Form^ fm2; //感觉你好像这个地方漏了呵呵
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
运行之后点击button2成功召唤出了Form2.
但是怎么在Form1和Form2之间传递数据呢?
我在Form1.h中有这样一个public变量String^ nameA
我希望在Form2中给nameA赋值
比如nameA=this->textBox1->Text;
但直接这样写会出现
错误---- error C2065“nameA”: 未声明的标识符
如果我在Form2.h的头部也加上
#include "Form1.h"
又会出现另一个错误
fatal error C1014: 包含文件太多 : 深度 = 1024
怎么在Form2中操作Form1.h中的变量呢?
谢谢!
首先谢谢你,按你的方法我添加的Form2出来了.
在Form1.h里面
1. 头文件
#include "Form2.h"
然后2. 声明是不是该写上
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form^ fm1;
Form^ fm2; //感觉你好像这个地方漏了呵呵
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
运行之后点击button2成功召唤出了Form2.
但是怎么在Form1和Form2之间传递数据呢?
我在Form1.h中有这样一个public变量String^ nameA
我希望在Form2中给nameA赋值
比如nameA=this->textBox1->Text;
但直接这样写会出现
错误---- error C2065“nameA”: 未声明的标识符
如果我在Form2.h的头部也加上
#include "Form1.h"
又会出现另一个错误
fatal error C1014: 包含文件太多 : 深度 = 1024
怎么在Form2中操作Form1.h中的变量呢?
谢谢!
#7
我从别的地方看见的 你自己试试 我没试
1、在form1中写函数
public void setdata(string str)
{
this.textbox1.text=str;
}
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、从第二个窗体返回参数
((form1)this.owner).setdata(this.textbox1.text);
二、直接从第二个窗体对第一个窗体的控件进行操作
1、首先将form1中的textbox1的modifiers属性设置为public
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、直接从form2操作form1中的文本框
((form1)this.owner).textbox1.text=this.textbox1.text;
1、在form1中写函数
public void setdata(string str)
{
this.textbox1.text=str;
}
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、从第二个窗体返回参数
((form1)this.owner).setdata(this.textbox1.text);
二、直接从第二个窗体对第一个窗体的控件进行操作
1、首先将form1中的textbox1的modifiers属性设置为public
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、直接从form2操作form1中的文本框
((form1)this.owner).textbox1.text=this.textbox1.text;
#8
http://bbs.bccn.net/thread-176345-1-1.html
可能会有参考
可能会有参考
#9
托管的和C井差别好象不是很大,还以为是NATIVE的呢.
#10
#11
得了我还是贴出来吧
Form1.h:
Form1.h:
#include"Form21.h"
#pragma once
namespace KeyBoardgame {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Form1 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
/// 与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
/// “资源文件名”属性。否则,
/// 设计器将不能与此窗体的关联
/// 本地化资源正确交互。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
static String^ nameA;
static String^ nameB;
Form^ fm1;
Form^ fm2;
......中间没用的省了
public:
Form1(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
//
level=3;
}
......中间再省一部分没关系的code
private: System::Void 新游戏ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
......这样点击"新游戏"Form2就出现了
然后Form2.h的
#pragma once
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
namespace KeyBoardgame {
/// <summary>
/// Form2 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
/// 与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
/// “资源文件名”属性。否则,
/// 设计器将不能与此窗体的关联
/// 本地化资源正确交互。
/// </summary>
public ref class Form2 : public System::Windows::Forms::Form
{
public:
Form2(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
//
}
protected:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
~Form2()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:
private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
void InitializeComponent(void)
{
......省了
}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form1::nameA=this->button1->Text;
//这句到底怎么写,总错 }
};
}
#12
继续等,郁闷死我了,跪求高人指点
#13
我帮你看看 不一定能解决呢 呵呵
#14
继续等.我感觉这个很常见呀.很多程序运行之后不是都会弹出一个窗口让你输入账号密码嘛,这种传递应该很常用的怎么网上怎么找都找不到.郁闷again
#15
继续等....第三天了
#16
把工程文件的cpp贴上,不是Form1.h和Form2.h
#17
// KeyBoardgame.cpp: 主项目文件。
#include "stdafx.h"
#include "Form1.h"
using namespace KeyBoardgame;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
// 在创建任何控件之前启用 Windows XP 可视化效果
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// 创建主窗口并运行它
Application::Run(gcnew Form1());
return 0;
}
或者你直接+我Q说吧,393422044
#18
form1 (主form)
form_test(form2)
利用构造函数
#include "form_test.h"
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ nameA = L"new game";
form_test^ fm = gcnew form_test(nameA);
//fm->Owner = this;
fm->ShowDialog();
}
form_test(form2)
public:
form_test(String^ str)
{
InitializeComponent();
textBox1->Text = str;
//
//TODO: 在此处添加构造函数代码
//
}
利用构造函数
#19
网上关于这块的东西挺多的 你自己看看
http://blog.csdn.net/wesleyluo/archive/2008/11/13/3292077.aspx
http://blog.csdn.net/wesleyluo/archive/2008/11/13/3292077.aspx
#20
#21
可以结贴了.18楼的看懂了不过只能从父窗口往子窗口传
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下
首先form1.h里面的开头需要#include"Form2.h" //废话...
方法一.同样利用构造函数,实现回传
然后当然了,Form2.h中的构造函数需要重写
其实和18楼的方法相比,只有一点不同,就是传递的不是String型变量,而是String型指针变量,这样就可以实现双向的传递了
方法二.这个方法似乎更简单...
先在从Form2.h说
在Form2类中写一个String型的变量,或者静态变量都可以(本人没发现区别..)
然后在需要的地方,比如Form2中点击按钮的时候给strr赋值
然后要怎么把这些传回Form1呢
记得之前在Form1.h的开头有include"Form2.h"的对吧
然后就这样
就这样,也许大家都一样吧,每个人都会遇到对自己困难的问题,别人的帮助不可少,自己的钻研同样也是.谢谢各位,尤其是yaohuang306 liuyj 多谢!
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下
首先form1.h里面的开头需要#include"Form2.h" //废话...
方法一.同样利用构造函数,实现回传
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ nameA = "new game";//弄一个String型的对象
Form2^ fm = gcnew Form2(&nameA);//把这个对象的 引用 传递到子窗口里面
fm->ShowDialog();//子窗口以对话框的形式调出来(Form2关闭前nameA已被重赋值)
this->button1->Text=nameA;//然后在子窗口中通过指针nameA已经被重新赋值
}
然后当然了,Form2.h中的构造函数需要重写
Form2(String^ *str)//重载Form2的构造函数,在Form1中创造Form2的时候通过构造函数传递信息
{
InitializeComponent();
//传递的是一个String型的指针.这样可以实现Form1与Form2之间的双向信息传递!!
this->button2->Text=*str;//从父传到子窗口(如18楼方法)
*str=this->button1->Text;//从子窗口传到父窗口,父窗口中str的值被改变了
}
其实和18楼的方法相比,只有一点不同,就是传递的不是String型变量,而是String型指针变量,这样就可以实现双向的传递了
方法二.这个方法似乎更简单...
先在从Form2.h说
在Form2类中写一个String型的变量,或者静态变量都可以(本人没发现区别..)
public ref class Form2 : public System::Windows::Forms::Form
{
public:static String ^strr;//在Form2类中声明一个String型静态变量(或者普通变量)
然后在需要的地方,比如Form2中点击按钮的时候给strr赋值
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
strr="能行吗?";//在子窗口中,对Form2的静态变量赋值
//然后在父窗口中可以再调用子窗口中的这个静态变量,从而实现子->父的信息传递
}
然后要怎么把这些传回Form1呢
记得之前在Form1.h的开头有include"Form2.h"的对吧
然后就这样
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form2^ fm = gcnew Form2();
fm->ShowDialog();//子窗口以对话框的形式调出来
this->button2->Text=fm->strr;//然后这样就传了..
}
就这样,也许大家都一样吧,每个人都会遇到对自己困难的问题,别人的帮助不可少,自己的钻研同样也是.谢谢各位,尤其是yaohuang306 liuyj 多谢!
#22
哈哈,聪明的娃~~ 大家相互学习~加油~
#23
你在form2中写一个函数专门用于获取数据,你在form1中构造对象。只要都form的click事件你就调用这个函数就可以把数据传递过来呢!
#1
啊啊好久了等的
#2
不是还没人会吧?
#3
#4
form2就是个对话框类,在form1中建立一个form2的类对象就可以吧。form1中建立一个成员函数onbutton{}在函数里建立类对象
#5
1. 头文件
#include "Form2.h"
2. 声明
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
#include "Form2.h"
2. 声明
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
#6
5L
首先谢谢你,按你的方法我添加的Form2出来了.
在Form1.h里面
1. 头文件
#include "Form2.h"
然后2. 声明是不是该写上
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form^ fm1;
Form^ fm2; //感觉你好像这个地方漏了呵呵
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
运行之后点击button2成功召唤出了Form2.
但是怎么在Form1和Form2之间传递数据呢?
我在Form1.h中有这样一个public变量String^ nameA
我希望在Form2中给nameA赋值
比如nameA=this->textBox1->Text;
但直接这样写会出现
错误---- error C2065“nameA”: 未声明的标识符
如果我在Form2.h的头部也加上
#include "Form1.h"
又会出现另一个错误
fatal error C1014: 包含文件太多 : 深度 = 1024
怎么在Form2中操作Form1.h中的变量呢?
谢谢!
首先谢谢你,按你的方法我添加的Form2出来了.
在Form1.h里面
1. 头文件
#include "Form2.h"
然后2. 声明是不是该写上
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form^ fm1;
Form^ fm2; //感觉你好像这个地方漏了呵呵
Form1(void)
{
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
}
}
3. 调用
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
fm1->Show(); // 每次点击都能显示一个Form2窗口
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
运行之后点击button2成功召唤出了Form2.
但是怎么在Form1和Form2之间传递数据呢?
我在Form1.h中有这样一个public变量String^ nameA
我希望在Form2中给nameA赋值
比如nameA=this->textBox1->Text;
但直接这样写会出现
错误---- error C2065“nameA”: 未声明的标识符
如果我在Form2.h的头部也加上
#include "Form1.h"
又会出现另一个错误
fatal error C1014: 包含文件太多 : 深度 = 1024
怎么在Form2中操作Form1.h中的变量呢?
谢谢!
#7
我从别的地方看见的 你自己试试 我没试
1、在form1中写函数
public void setdata(string str)
{
this.textbox1.text=str;
}
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、从第二个窗体返回参数
((form1)this.owner).setdata(this.textbox1.text);
二、直接从第二个窗体对第一个窗体的控件进行操作
1、首先将form1中的textbox1的modifiers属性设置为public
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、直接从form2操作form1中的文本框
((form1)this.owner).textbox1.text=this.textbox1.text;
1、在form1中写函数
public void setdata(string str)
{
this.textbox1.text=str;
}
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、从第二个窗体返回参数
((form1)this.owner).setdata(this.textbox1.text);
二、直接从第二个窗体对第一个窗体的控件进行操作
1、首先将form1中的textbox1的modifiers属性设置为public
2、产生第二个窗体
form2 f=new form2();
f.owner=this; //这句很关键
f.show();
3、直接从form2操作form1中的文本框
((form1)this.owner).textbox1.text=this.textbox1.text;
#8
http://bbs.bccn.net/thread-176345-1-1.html
可能会有参考
可能会有参考
#9
托管的和C井差别好象不是很大,还以为是NATIVE的呢.
#10
#11
得了我还是贴出来吧
Form1.h:
Form1.h:
#include"Form21.h"
#pragma once
namespace KeyBoardgame {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Form1 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
/// 与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
/// “资源文件名”属性。否则,
/// 设计器将不能与此窗体的关联
/// 本地化资源正确交互。
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
static String^ nameA;
static String^ nameB;
Form^ fm1;
Form^ fm2;
......中间没用的省了
public:
Form1(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
fm1 = gcnew Form2();
fm2 = gcnew Form2();
//
level=3;
}
......中间再省一部分没关系的code
private: System::Void 新游戏ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
fm2->ShowDialog();//点击多次,只能显示一个Form2窗口
}
......这样点击"新游戏"Form2就出现了
然后Form2.h的
#pragma once
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
namespace KeyBoardgame {
/// <summary>
/// Form2 摘要
///
/// 警告: 如果更改此类的名称,则需要更改
/// 与此类所依赖的所有 .resx 文件关联的托管资源编译器工具的
/// “资源文件名”属性。否则,
/// 设计器将不能与此窗体的关联
/// 本地化资源正确交互。
/// </summary>
public ref class Form2 : public System::Windows::Forms::Form
{
public:
Form2(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
//
}
protected:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
~Form2()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:
private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
void InitializeComponent(void)
{
......省了
}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form1::nameA=this->button1->Text;
//这句到底怎么写,总错 }
};
}
#12
继续等,郁闷死我了,跪求高人指点
#13
我帮你看看 不一定能解决呢 呵呵
#14
继续等.我感觉这个很常见呀.很多程序运行之后不是都会弹出一个窗口让你输入账号密码嘛,这种传递应该很常用的怎么网上怎么找都找不到.郁闷again
#15
继续等....第三天了
#16
把工程文件的cpp贴上,不是Form1.h和Form2.h
#17
// KeyBoardgame.cpp: 主项目文件。
#include "stdafx.h"
#include "Form1.h"
using namespace KeyBoardgame;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
// 在创建任何控件之前启用 Windows XP 可视化效果
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// 创建主窗口并运行它
Application::Run(gcnew Form1());
return 0;
}
或者你直接+我Q说吧,393422044
#18
form1 (主form)
form_test(form2)
利用构造函数
#include "form_test.h"
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ nameA = L"new game";
form_test^ fm = gcnew form_test(nameA);
//fm->Owner = this;
fm->ShowDialog();
}
form_test(form2)
public:
form_test(String^ str)
{
InitializeComponent();
textBox1->Text = str;
//
//TODO: 在此处添加构造函数代码
//
}
利用构造函数
#19
网上关于这块的东西挺多的 你自己看看
http://blog.csdn.net/wesleyluo/archive/2008/11/13/3292077.aspx
http://blog.csdn.net/wesleyluo/archive/2008/11/13/3292077.aspx
#20
#21
可以结贴了.18楼的看懂了不过只能从父窗口往子窗口传
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下
首先form1.h里面的开头需要#include"Form2.h" //废话...
方法一.同样利用构造函数,实现回传
然后当然了,Form2.h中的构造函数需要重写
其实和18楼的方法相比,只有一点不同,就是传递的不是String型变量,而是String型指针变量,这样就可以实现双向的传递了
方法二.这个方法似乎更简单...
先在从Form2.h说
在Form2类中写一个String型的变量,或者静态变量都可以(本人没发现区别..)
然后在需要的地方,比如Form2中点击按钮的时候给strr赋值
然后要怎么把这些传回Form1呢
记得之前在Form1.h的开头有include"Form2.h"的对吧
然后就这样
就这样,也许大家都一样吧,每个人都会遇到对自己困难的问题,别人的帮助不可少,自己的钻研同样也是.谢谢各位,尤其是yaohuang306 liuyj 多谢!
然后看了很多我自己也想了想,折腾出两种从子窗口往父窗口传递的方法
其实都很简单不过自己想想还真用了3,4天,呵呵
下面分享一下
首先form1.h里面的开头需要#include"Form2.h" //废话...
方法一.同样利用构造函数,实现回传
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ nameA = "new game";//弄一个String型的对象
Form2^ fm = gcnew Form2(&nameA);//把这个对象的 引用 传递到子窗口里面
fm->ShowDialog();//子窗口以对话框的形式调出来(Form2关闭前nameA已被重赋值)
this->button1->Text=nameA;//然后在子窗口中通过指针nameA已经被重新赋值
}
然后当然了,Form2.h中的构造函数需要重写
Form2(String^ *str)//重载Form2的构造函数,在Form1中创造Form2的时候通过构造函数传递信息
{
InitializeComponent();
//传递的是一个String型的指针.这样可以实现Form1与Form2之间的双向信息传递!!
this->button2->Text=*str;//从父传到子窗口(如18楼方法)
*str=this->button1->Text;//从子窗口传到父窗口,父窗口中str的值被改变了
}
其实和18楼的方法相比,只有一点不同,就是传递的不是String型变量,而是String型指针变量,这样就可以实现双向的传递了
方法二.这个方法似乎更简单...
先在从Form2.h说
在Form2类中写一个String型的变量,或者静态变量都可以(本人没发现区别..)
public ref class Form2 : public System::Windows::Forms::Form
{
public:static String ^strr;//在Form2类中声明一个String型静态变量(或者普通变量)
然后在需要的地方,比如Form2中点击按钮的时候给strr赋值
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
strr="能行吗?";//在子窗口中,对Form2的静态变量赋值
//然后在父窗口中可以再调用子窗口中的这个静态变量,从而实现子->父的信息传递
}
然后要怎么把这些传回Form1呢
记得之前在Form1.h的开头有include"Form2.h"的对吧
然后就这样
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form2^ fm = gcnew Form2();
fm->ShowDialog();//子窗口以对话框的形式调出来
this->button2->Text=fm->strr;//然后这样就传了..
}
就这样,也许大家都一样吧,每个人都会遇到对自己困难的问题,别人的帮助不可少,自己的钻研同样也是.谢谢各位,尤其是yaohuang306 liuyj 多谢!
#22
哈哈,聪明的娃~~ 大家相互学习~加油~
#23
你在form2中写一个函数专门用于获取数据,你在form1中构造对象。只要都form的click事件你就调用这个函数就可以把数据传递过来呢!